Подтвердить что ты не робот

Корреляция между двумя векторами?

У меня есть два вектора:

A_1 = 

      10
      200
      7
      150

A_2 = 
      0.001
      0.450
      0.0007
      0.200

Я хотел бы знать, существует ли корреляция между этими двумя векторами.

Я мог бы вычесть для каждого значения среднее значение вектора и сделать:

  A_1' * A_2

Есть ли лучшие способы?

4b9b3361

Ответ 1

Дано:

A_1 = [10 200 7 150]';
A_2 = [0.001 0.450 0.007 0.200]';

(Как уже указывали другие) Существуют инструменты для простого вычисления корреляции, наиболее очевидно corr:

corr(A_1, A_2);  %Returns 0.956766573975184  (Requires stats toolbox)

Вы также можете использовать базовую функцию Matlab corrcoef, например:

M = corrcoef([A_1 A_2]):  %Returns [1 0.956766573975185; 0.956766573975185 1];
M(2,1);  %Returns 0.956766573975184 

который тесно связан с функцией cov:

cov([condition(A_1) condition(A_2)]);

Как вы почти добираетесь в своем первоначальном вопросе, вы можете масштабировать и корректировать векторы самостоятельно, если хотите, что дает немного лучшее понимание того, что происходит. Сначала создайте функцию условия, которая вычитает среднее значение и делит на стандартное отклонение:

condition = @(x) (x-mean(x))./std(x);  %Function to subtract mean AND normalize standard deviation

Тогда корреляция представляется (A_1 * A_2)/(A_1 ^ 2) следующим образом:

(condition(A_1)' * condition(A_2)) / sum(condition(A_1).^2);  %Returns 0.956766573975185

По симметрии это также должно работать

(condition(A_1)' * condition(A_2)) / sum(condition(A_2).^2); %Returns 0.956766573975185

И это так.

Я считаю, но у меня нет энергии, чтобы подтвердить прямо сейчас, что та же математика может быть использована для вычисления корреляционных и кросс-корреляционных терминов при работе с многодискретными входами, если при обработке размеров и ориентации входных массивов.

Ответ 2

Попробуйте xcorr, это встроенная функция в MATLAB для кросс-корреляции:

c = xcorr(A_1, A_2);

Однако обратите внимание, что для этого требуется Инструмент обработки сигналов. Если нет, вы можете посмотреть в corrcoef.

Ответ 3

Для корреляций вы можете просто использовать функцию corr (панель инструментов статистики)

corr(A_1(:), A_2(:))

Обратите внимание, что вы также можете просто использовать

corr(A_1, A_2)

Но линейная индексация гарантирует, что ваши векторы не нужно транспонировать.

Ответ 4

Чтобы выполнить линейную регрессию между двумя векторами x и y, выполните следующие действия:

[p,err] = polyfit(x,y,1);   % First order polynomial
y_fit = polyval(p,x,err);   % Values on a line
y_dif = y - y_fit;          % y value difference (residuals)
SSdif = sum(y_dif.^2);      % Sum square of difference
SStot = (length(y)-1)*var(y);   % Sum square of y taken from variance
rsq = 1-SSdif/SStot;        % Correlation 'r' value. If 1.0 the correlelation is perfect

Для x=[10;200;7;150] и y=[0.001;0.45;0.0007;0.2] я получаю rsq = 0.9181.

Ссылка URL: http://www.mathworks.com/help/matlab/data_analysis/linear-regression.html