【问题标题】:Covariance matrix computation协方差矩阵计算
【发布时间】:2010-07-22 08:38:31
【问题描述】:

输入:随机向量 X=xi, i=1..n.
X=meanxi, i=1..n 的均值向量
输出:协方差矩阵 Sigma (n*n)。
计算:
1) 求所有 cov(xi,xj)= 1/n * (xi-meanxi) * (xj-meanxj), i,j=1..n
2) Sigma(i,j)=cov(xi,xj),对称矩阵。
这个算法是否正确且没有副作用?

【问题讨论】:

  • 问题陈述不是很清楚。你真的有一个单一的向量作为输入吗? xi都是一样的意思吗?为什么在计算平均值时要除以 (n-1)?
  • 理论上我有很多(X实际上是一些过程X(t)),其中t是[0..k],但在建模期间我只对k=kmax的情况感兴趣,这就是为什么我得到由 r 个数字组成的单个向量 X(kmax)=X。 n-1 是修正,影响不大。关于手段 - 正如我现在所看到的那样,它们是不同的。
  • 我投票结束这个问题,因为它是一个数学验证问题,而不是 help center 范围内的编程问题。

标签: algorithm matrix statistics covariance


【解决方案1】:

每个xi 应该是一个向量(随机变量),具有自己的方差和均值。

协方差矩阵是对称的,所以你只需要计算它的一半(并复制其余部分)并且在主对角线上有 xi 的方差。

 S = ...// your symmetric matrix n*n
 for(int i=0; i<n;i++)
   S(i,i) = var(xi);
   for(j = i+1; j<n; j++)
     S(i,j) = cov(xi, xj);
     S(j,i) = S(i,j);
   end
 end

其中xi的方差(var):

v = 0;
for(int i = 0; i<xi.Count; i++)
  v += (xi(i) - mean(xi))^2;
end
v = v / xi.Count;

和协方差(cov)

cov(xi, xj) = r(xi,xj) * sqrt(var(xi)) * sqrt(var(xj))

r(xi, xj)Pearson product-moment correlation coefficient

编辑
或者,因为 cov(X, Y) = E(X*Y) - E(X)*E(Y)

cov(xi, xj) = mean(xi.*xj) - mean(xi)*mean(xj);

.* 是类似于 Matlab 的逐元素乘法。
所以如果x = [x1, x2],y = [y1, y2]然后z = x.*y = [x1*y1, x2*y2];

【讨论】:

  • 对角线包含方差。
  • 为什么用相关性来定义协方差?通常它是反过来做的。
  • @Gacek:我同意 Henrik 的观点。您写的是正确的,但是,相关性是根据协方差定义的,因此计算相关性然后从中获取协方差是多余的。
  • 自从我带回了均值向量(之前计算过,我错过了),方差很容易计算为 sum(x(i)-mean(i)/n)。现在协方差本身呢?有什么方法可以更简单地计算它?顺便说一句,我猜在你的公式中 sj 是输入错误的 xj。
  • 对。我简化了公式。我不确定这是否正确,所以我第一时间向 Pearson 发布了解决方案。但我在 Matlab 中检查了它,它似乎工作正常。
猜你喜欢
  • 2020-04-13
  • 2015-03-31
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2018-08-25
  • 2011-11-25
  • 2012-11-22
相关资源
最近更新 更多