协方差矩阵计算

Sin*_*ity 8 algorithm statistics matrix covariance

输入:随机向量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),对称矩阵.
这个算法是否正确并且没有副作用?

Gac*_*cek 5

每个都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
Run Code Online (Sandbox Code Playgroud)

其中 xi 的方差 (var):

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

和协方差 (cov)

cov(xi, xj) = r(xi,xj) * sqrt(var(xi)) * sqrt(var(xj))
Run Code Online (Sandbox Code Playgroud)

其中r(xi, xj)皮尔逊积矩相关系数

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

cov(xi, xj) = mean(xi.*xj) - mean(xi)*mean(xj);
Run Code Online (Sandbox Code Playgroud)

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