Расчет ковариационной матрицы - PullRequest
8 голосов
/ 22 июля 2010

Вход: случайный вектор X = xi, i = 1..n.
вектор средних для X = meanxi, i = 1..n
Вывод: ковариационная матрица Сигма (n * n).
Вычисление:
1) найти все cov (xi, xj) = 1 / n * (xi-meanxi) * (xj-meanxj), i, j = 1..n
2) Сигма (i, j) = cov (xi, xj), симметричная матрица.
Является ли этот алгоритм правильным и не имеет побочных эффектов?

1 Ответ

4 голосов
/ 22 июля 2010

Каждый 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:

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) - Коэффициент корреляции Пирсона и момента произведения

EDIT
или, поскольку 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];

...