Python Numpy/Scipy:计算多元观测概率的奇异矩阵

Python Numpy/Scipy:计算多元观测概率的奇异矩阵,python,numpy,scipy,probability,Python,Numpy,Scipy,Probability,我正在尝试使用python计算矩阵中观察值的概率,其中行是观察值,列是特性。我总是会得到奇异矩阵错误,即使使用随机矩阵,所以我怀疑我的代码有问题: from scipy.stats import multivariate_normal import numpy as np def get_mean(x, axis=0): return x.mean(axis=axis) def get_sigma(x): return np.cov(x, rowvar=False) def

我正在尝试使用python计算矩阵中观察值的概率,其中行是观察值,列是特性。我总是会得到奇异矩阵错误,即使使用随机矩阵,所以我怀疑我的代码有问题:

from scipy.stats import multivariate_normal
import numpy as np


def get_mean(x, axis=0):
  return x.mean(axis=axis)


def get_sigma(x):
  return np.cov(x, rowvar=False)


def get_probabilities(x, mu, sigma):
  return multivariate_normal.pdf(x, mean=mu, cov=sigma)


x = np.random.rand(10,10)
t = np.random.rand(1, 10)

mu = get_mean(x)
sigma = get_sigma(x)
p = get_probabilities(t, mu, sigma)
这导致:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“”,第2行,在获取概率中
文件“/usr/local/lib/python3.5/dist packages/scipy/stats/_multivariable.py”,第512行,pdf格式
psd=\u psd(cov,允许单值=允许单值)
文件“/usr/local/lib/python3.5/dist-packages/scipy/stats/_multivariable.py”,第159行,在u_init中__
提出np.linalg.linalgeror('奇异矩阵')
numpy.linalg.linalg.linalgeror:奇异矩阵

我做错了什么?

我认为问题在于
t
是一个np.array的形状(1,10),而它应该是形状(10,)

如果替换代码行

t = np.random.rand(1, 10)


这是可行的。

我认为问题在于
t
是一个np.array的形状(1,10),而它应该是形状(10,)

如果替换代码行

t = np.random.rand(1, 10)


这是可行的。

没有足够的数据来估计协方差矩阵
sigma
x
需要行多于列来估计定义良好的协方差矩阵

例如,此示例将使代码运行时不会出现问题:

x = np.random.rand(100, 10)
或者,如果您没有足够的数据,可以使用(或收缩)更好地调节协方差矩阵:

sigma += np.eye(10) * 1e-3  # problem: how to chose the factor

Scikit learn具有协方差估计器,该估计器根据可用数据自动确定正则化量。

没有足够的数据来估计协方差矩阵
sigma
x
需要行多于列来估计定义良好的协方差矩阵

例如,此示例将使代码运行时不会出现问题:

x = np.random.rand(100, 10)
或者,如果您没有足够的数据,可以使用(或收缩)更好地调节协方差矩阵:

sigma += np.eye(10) * 1e-3  # problem: how to chose the factor

Scikit learn具有协方差估计器,它根据可用数据自动确定正则化的量。

谢谢,我没有意识到我开始使用(并在上面发布)的玩具示例是一个糟糕的示例,因为缺少行——我的真实数据有数十万个观察值,所以这不是问题所在。我认为我的真实数据中缺少方差存在一个基本问题,需要进一步研究。@这种情况下的隆隆声收缩也会有所帮助:)“x需要更多的行而不是列来估计定义良好的协方差矩阵。”我认为这是不正确的——cov(x)的秩等于x的线性独立列数,如果我没弄错的话。在上面所示的示例中,几乎可以肯定x具有秩10,因此cov(x)也具有秩10,因此cov(x)是可逆的(除了rand碰巧返回秩亏矩阵的可能性不大之外)。Flo Martin的回答将此问题确定为编程错误。@rummutums关于缺少方差的问题,请查找常数(所有值相同)或其他列的倍数的列,然后忽略它们。@rummutums查看协方差矩阵的特征值。如果你有很多非常小的特征值,它会使矩阵“几乎”奇异。也许你可以用奇异值分解或类似的方法来代替矩阵求逆。也许将你想要计算概率密度的点投射到非零(或几乎不为零)特征向量所跨越的子空间中,然后使用它。谢谢,我没有意识到我开始使用的玩具示例(并在上面发布)这是一个糟糕的问题,因为缺少行——我的真实数据有数十万个观察值,所以这不是问题所在。我认为我的真实数据中缺少方差存在一个基本问题,需要进一步研究。@这种情况下的隆隆声收缩也会有所帮助:)“x需要更多的行而不是列来估计定义良好的协方差矩阵。”我认为这是不正确的——cov(x)的秩等于x的线性独立列数,如果我没弄错的话。在上面所示的示例中,几乎可以肯定x具有秩10,因此cov(x)也具有秩10,因此cov(x)是可逆的(除了rand碰巧返回秩亏矩阵的可能性不大之外)。Flo Martin的回答将此问题确定为编程错误。@rummutums关于缺少方差的问题,请查找常数(所有值相同)或其他列的倍数的列,然后忽略它们。@rummutums查看协方差矩阵的特征值。如果你有很多非常小的特征值,它会使矩阵“几乎”奇异。也许你可以用奇异值分解或类似的方法来代替矩阵求逆。也许将你想要计算概率密度的点投影到非零(或几乎不为零)特征向量所跨越的子空间中,然后使用它。