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

时间:2018-03-23 06:46:08

标签: 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 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)

这导致:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in get_probabilities
  File "/usr/local/lib/python3.5/dist-packages/scipy/stats/_multivariate.py", line 512, in pdf
    psd = _PSD(cov, allow_singular=allow_singular)
  File "/usr/local/lib/python3.5/dist-packages/scipy/stats/_multivariate.py", line 159, in __init__
    raise np.linalg.LinAlgError('singular matrix')
numpy.linalg.linalg.LinAlgError: singular matrix

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

如果替换代码行

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

通过

t = np.random.rand(10)

这有效。

答案 1 :(得分:1)

没有足够的数据来估计协方差矩阵sigmax需要更多行而不是列来估计明确定义的协方差矩阵。

例如,这将使代码运行没有问题:

x = np.random.rand(100, 10)

或者,如果您没有足够的数据,可以使用regularization(或收缩)来更好地调整协方差矩阵:

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

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