我试图计算矩阵中观察的概率,其中我的行是观察,而我的列是使用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
我做错了什么?
答案 0 :(得分:1)
我认为问题是t
是形状(1,10)的np.array,而它应该是形状(10,)。
如果替换代码行
t = np.random.rand(1, 10)
通过
t = np.random.rand(10)
这有效。
答案 1 :(得分:1)
没有足够的数据来估计协方差矩阵sigma
。 x
需要更多行而不是列来估计明确定义的协方差矩阵。
例如,这将使代码运行没有问题:
x = np.random.rand(100, 10)
或者,如果您没有足够的数据,可以使用regularization(或收缩)来更好地调整协方差矩阵:
sigma += np.eye(10) * 1e-3 # problem: how to chose the factor
Scikit-learn具有ledoit_wolf
协方差估计器,可根据可用数据自动确定正则化的数量。