我正在尝试计算给定数据的样本协方差。
我写的代码是:
mysqli
这不是最有效的方法,但它很简单,据我所知是https://en.wikipedia.org/wiki/Sample_mean_and_covariance#Sample_covariance的直接副本。
协方差矩阵总是正半定的。但是当我计算特征值(用np.eig)时,我有时会看到负特征值。
例如代码
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
打印输出
data = np.random.rand(2, 2)
print data
cov = calcCov(data)
eigvals, eigvec = np.linalg.eig(cov)
print cov
print eigvals
作为一个非常不安的数学家。为什么会这样?简单的数字错误?我在计算协方差时犯了错误吗?
答案 0 :(得分:4)
首先,我建议使用numpy的协方差函数,因为它会更有效:https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.cov.html
鉴于你所拥有的“负”特征值是e-18,将其视为数字误差是合理的。