//+------------------------------------------------------------------+ //| Pearson product-moment correlation matrix | //| INPUT PARAMETERS: | //| X - array[N,M], sample matrix: | //| * J-th column corresponds to J-th variable | //| * I-th row corresponds to I-th observation | //| N - N>=0, number of observations: | //| * if given, only leading N rows of X are used | //| * if not given, automatically determined from input | //| size | //| M - M>0, number of variables: | //| * if given, only leading M columns of X are used | //| * if not given, automatically determined from input | //| size | //| OUTPUT PARAMETERS: | //| C - array[M,M], correlation matrix (zero if N=0 or N=1) | //+------------------------------------------------------------------+ static bool CBaseStat::PearsonCorrM(const CMatrixDouble &cx,const int n, const int m,CMatrixDouble &c)
小さなTFでメモリがオーバーフローする16個のosuとスワップファイル(マックのスワップ)30ギガでメモリがオーバーフローする。例えば、50k×50kの相関行列がある。
アルゴリズムはMQLでも同じなので、どうやらPythonの特殊性のようだ。
これは正面の変形です。ふるいを 使うとさらに速い。
100万本の棒を想定してみよう。文字列の長さは10である。すると、1,000万個の2重値に対する1d-arrayは80Mbになる。ポイント3。- では、メモリ消費量で500Mbとしよう。メモリ消費量に。
MQLでもアルゴリズムは同じなので、Pythonの特殊性に違いない。
これは正面の変形である。ふるい分けは さらに速い。
100万本の棒を想定してみよう。文字列の長さは10である。すると1,000万本の二重値に対する1d-arrayは80Mbになる。p.3.- では、メモリ消費量で500Mbとしよう。何が考慮されていないのだろう?
全行対全行の行列の相関は、サイクル(1行対1行)や偶数ループ(1行対全行)よりも何倍も 速いと考えられている。そこにはアルゴリズムによる何らかの加速がある。alglib版の相関計算で確認しました。
コードを教えてください。
MathAbs ()は私には不要に思える。
MQLでもアルゴリズムは同じなので、Pythonの特殊性に違いない。
これは正面の変形である。ふるい分けは さらに速い。
100万本の棒を想定してみよう。文字列の長さは10である。すると1,000万本の二重値に対する1d-arrayは80Mbになる。p.3.- では、メモリ消費量で500Mbとしよう。何が考慮されていないのだろう?
Pythonのどのライブラリも計算できないので、自分でも困惑してしまった。
PandasはRAMをオーバーフローさせ、オーバーヘッドは巨大になる。
Nampaiはエラーを表示せずにクラッシュしてインタプリタセッションを終了させるだけ。コードを教えてください。
functions
PearsonCorrM - すべての行のすべての行に対する相関が最も速い。
//+------------------------------------------------------------------+
//| Pearson product-moment correlation matrix |
//| INPUT PARAMETERS: |
//| X - array[N,M], sample matrix: |
//| * J-th column corresponds to J-th variable |
//| * I-th row corresponds to I-th observation |
//| N - N>=0, number of observations: |
//| * if given, only leading N rows of X are used |
//| * if not given, automatically determined from input |
//| size |
//| M - M>0, number of variables: |
//| * if given, only leading M columns of X are used |
//| * if not given, automatically determined from input |
//| size |
//| OUTPUT PARAMETERS: |
//| C - array[M,M], correlation matrix (zero if N=0 or N=1) |
//+------------------------------------------------------------------+
static bool CBaseStat::PearsonCorrM(const CMatrixDouble &cx,const int n,
const int m,CMatrixDouble &c)
PearsonCorr2 - 行と行の相関。完全行列の場合: 1 行目は 1 以降のすべての行と、2 行目は 2 以降のすべての行と、など。
//| Pearson product-moment correlation coefficient |
//| Input parameters: |
//| X - sample 1 (array indexes: [0..N-1]) |
//| Y - sample 2 (array indexes: [0..N-1]) |
//| N - N>=0, sample size: |
//| * if given, only N leading elements of X/Y are |
//| processed |
//| * if not given, automatically determined from |
//| input sizes |
//| Result: |
//| Pearson product-moment correlation coefficient |
//| (zero for N=0 or N=1) |
//+------------------------------------------------------------------+
static double CBaseStat::PearsonCorr2(const double &cx[],const double &cy[],
const int n)
そして PearsonCorrM2 を用いると、全行列を1つの行列とチェックされる別の行に書き出すことができます。しかし、10行目については、10行目より上の行との相関がすでに計算されているので、明らかに不要な作業がある。
const int n,const int m1,const int m2,
CMatrixDouble &c)
20k*20kのNumpy行列の重さは2ギガバイト。
4億の2倍数は3ギガ。
MathAbs ()は私には冗長に思える。
符号を別にチェックすることもできる。ポイントはそこではない。
4億のダブルナンバーの重さは3ギガバイト。
この喜びのためにメモリが足りないのは理解できる。