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

Numpy/Scipy: Singular Matrix Calculating probability of multivariate observation

我正在尝试计算矩阵中观察值的概率,其中我的行是观察值,我的列是使用 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

我做错了什么?

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

如果替换代码行

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

来自

t = np.random.rand(10)

这有效。

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

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

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

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

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

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