次元が 37,000,000 × 22 の X 行列があり、X の相関行列を計算したいと考えています。
すなわち、
X_corr = corr(X,'type','Spearman');
X_corr のサイズを 22 x 22 にしたいと思います。
しかし、それは永遠にかかります.そのような長い行列の相関行列をより速く計算する方法はありますか?
ありがとう!
次元が 37,000,000 × 22 の X 行列があり、X の相関行列を計算したいと考えています。
すなわち、
X_corr = corr(X,'type','Spearman');
X_corr のサイズを 22 x 22 にしたいと思います。
しかし、それは永遠にかかります.そのような長い行列の相関行列をより速く計算する方法はありますか?
ありがとう!
@Bitwise のソリューションに触発されて、corr
. (単純に と入力するだけで実行できますedit corr
。NaN を処理する必要があるため、変数のペアに対するループがあります。データに NaN がない場合は、Spearman の相関を次のように簡単に計算できます。
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.
でも速度はほぼ同じ。
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.