![](/img/trans.png)
[英]Why bivariate_normal returns NaNs even if covariance is semi-positive definite?
[英]covariance isn't positive definite
我正在尝试计算给定数据的样本协方差。
我写的代码是:
def calcCov(x):
m, n = x.shape
mean = np.mean(x, axis=0)
cov = np.zeros((n, n))
for j in range(0, n):
for k in range(0, n):
sum = 0
for i in range(0, m):
sum += (x[i, j] - mean[j])*(x[i, k] - mean[k])
cov[j, k] = sum / (m - 1.0)
return cov
它不是执行此操作的最有效方法,但据我所知,它很简单,并且是https://en.wikipedia.org/wiki/Sample_mean_and_covariance#Sample_covariance的直接副本。
协方差矩阵始终是正半定的。 但是当我计算特征值(使用np.eig)时,有时会看到负的特征值。
例如代码
data = np.random.rand(2, 2)
print data
cov = calcCov(data)
eigvals, eigvec = np.linalg.eig(cov)
print cov
print eigvals
打印输出
[[ 0.12873309 0.92079275]
[ 0.90018866 0.73197021]]
[[ 0.29757185 -0.0728341 ]
[-0.0728341 0.01782698]]
[ 3.15398823e-01 -3.46944695e-18]
作为一个非常令人不安的数学家。 为什么会这样? 简单的数值误差? 我在计算协方差时是否犯了错误?
首先,我建议使用numpy的协方差函数,因为它会更有效: https : //docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.cov.html
给定您拥有的“负”特征值是e-18,可以将其视为0直至数值误差。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.