不使用 numpy 计算协方差矩阵
Computing covariance matrix without using numpy
我试图在不使用 numpy 库的情况下手动计算最大化似然估计的协方差矩阵,但我似乎无法得到正确的答案。我正在尝试使用这个公式:
我知道我计算的均值是正确的。
所以我实际计算协方差的部分一定有问题,但我不知道在哪里?这是我的代码:
mat = [[1,2,3],[4,6,8],[3,5,7]]
#now calc covariance for each element of the matrix
Cov = []
for j in range(len(means)):
sum = 0
covs = []
for k in range(len(means)):
for i in range(len(means)):
sum += ((mat[i][j] - means[j]) * (mat[i][k] - means[k]))
result = sum/ len(means)
covs.append(result)
Cov.append(covs)
print(np.reshape(S,(3,3)))
这是我得到的:
[[ 1.55555556 3.66666667 6.33333333]
[ 2.11111111 5. 8.66666667]
[ 2.66666667 6.33333333 11. ]]
这是我应该得到的:
[[1.55555556 2.11111111 2.66666667]
[2.11111111 2.88888889 3.66666667]
[2.66666667 3.66666667 4.66666667]]
您应该为协方差矩阵的每个条目重置总和,
covs = []
for k in range(len(means)):
sum = 0
for i in range(len(means)):
sum += ((mat[i][j] - means[j]) * (mat[i][k] - means[k]))
covariance = sum/ len(means)
covs.append(covariance)
您可以将其缩短为
covs = []
for k in range(len(means)):
terms = ( (mat[i][j] - means[j]) * (mat[i][k] - means[k]) for i in range(len(means)) )
covariance = sum(terms) / len(means)
covs.append(covariance)
一定要清除工作区,这样 sum
又是一个内置函数而不是数字。
我试图在不使用 numpy 库的情况下手动计算最大化似然估计的协方差矩阵,但我似乎无法得到正确的答案。我正在尝试使用这个公式:
我知道我计算的均值是正确的。 所以我实际计算协方差的部分一定有问题,但我不知道在哪里?这是我的代码:
mat = [[1,2,3],[4,6,8],[3,5,7]]
#now calc covariance for each element of the matrix
Cov = []
for j in range(len(means)):
sum = 0
covs = []
for k in range(len(means)):
for i in range(len(means)):
sum += ((mat[i][j] - means[j]) * (mat[i][k] - means[k]))
result = sum/ len(means)
covs.append(result)
Cov.append(covs)
print(np.reshape(S,(3,3)))
这是我得到的:
[[ 1.55555556 3.66666667 6.33333333]
[ 2.11111111 5. 8.66666667]
[ 2.66666667 6.33333333 11. ]]
这是我应该得到的:
[[1.55555556 2.11111111 2.66666667]
[2.11111111 2.88888889 3.66666667]
[2.66666667 3.66666667 4.66666667]]
您应该为协方差矩阵的每个条目重置总和,
covs = []
for k in range(len(means)):
sum = 0
for i in range(len(means)):
sum += ((mat[i][j] - means[j]) * (mat[i][k] - means[k]))
covariance = sum/ len(means)
covs.append(covariance)
您可以将其缩短为
covs = []
for k in range(len(means)):
terms = ( (mat[i][j] - means[j]) * (mat[i][k] - means[k]) for i in range(len(means)) )
covariance = sum(terms) / len(means)
covs.append(covariance)
一定要清除工作区,这样 sum
又是一个内置函数而不是数字。