Matlab корреляционная матрица огромной матрицы

У меня есть матрица X размером 37 000 000 на 22, и я хочу вычислить матрицу корреляции X.

I.e.,

X_corr = corr(X,'type','Spearman');

И я бы хотел, чтобы размер X_corr был 22 на 22.

Но это занимает вечность, можно ли как-то быстрее вычислить матрицу корреляции для таких длинных матриц?

Спасибо!


person Dnaiel    schedule 10.11.2012    source источник
comment
@Bitwise извините, 22 на 22, спасибо за разъяснение.   -  person Dnaiel    schedule 10.11.2012
comment
Если у вас нет специальной структуры в X, которую вы можете использовать, я боюсь, что это займет O (n log (n)).   -  person Memming    schedule 10.11.2012


Ответы (2)


Вдохновленный решением @Bitwise, я изучил реализацию corr. (Вы можете сделать это, просто набрав edit corr. Он имеет цикл по парам переменных, так как он хочет иметь дело с NaN. Если в ваших данных нет NaN, вы можете вычислить корреляцию Спирмена просто как:

X = rand(3e6, 22);
R = tiedrank(X); % Elapsed time is 8.956700 seconds.
C = corrcoef(X); % Elapsed time is 0.579448 seconds.

который должен быть таким же, как

C2 = corr(X, 'type', 'Spearman'); Elapsed time is 9.501480 seconds.

Но примерно такая же скорость.

person Memming    schedule 10.11.2012

Попробуйте corrcoef():

>> X=rand(1000000,22);
>> tic;corr(X);toc
Elapsed time is 18.320141 seconds.
>> tic;corrcoef(X);toc
Elapsed time is 0.494406 seconds

Также это почти то, что вы хотите (у меня не хватает памяти для 37e6x22):

>> X=rand(10000000,22);
>> tic;corrcoef(X);toc
Elapsed time is 7.620509 seconds.

Изменить:

Если вам нужен Спирмен, вы можете преобразовать его в ранги, а затем вычислить Пирсона, что эквивалентно. Сортировка не так уж и плоха:

>> X=rand(10000000,22);
>> tic;sort(X);toc
Elapsed time is 31.639637 seconds.
person Bitwise    schedule 10.11.2012
comment
Я думаю, что corrcoef вычисляет только корреляцию Пирсона. - person Memming; 10.11.2012
comment
@Memming Spearman явно не запрашивался в тексте, только в коде. Также он может ранжировать, а затем делать Пирсона, что эквивалентно. - person Bitwise; 10.11.2012
comment
Истинный. Но в этом случае ранжирование заняло бы большую часть вычислений. - person Memming; 10.11.2012
comment
@Memming, это потребует большей части вычислений, но все же может быть быстрее, чем corr () - см. Мое редактирование. - person Bitwise; 10.11.2012