21次元データの65サンプル(ここに貼り付け)があり、それから共分散行列を構築しています。C ++で計算すると、ここに共分散行列が貼り付けられます。そして、データからMATLABで計算すると(以下に示すように)、ここに共分散行列が貼り付けられます
データからcovを計算するためのMatlabコード:
data = csvread('path/to/data');
matlab_cov = cov(data);
共分散行列の違いがわかるように(〜e-07)、これはおそらく浮動小数点演算を使用するコンパイラーの数値の問題が原因です。
ただし、matlabによって生成された共分散行列とC ++コードによって生成された共分散行列から疑似逆共分散行列を計算すると、大きく異なる結果が得られます。私はそれらを同じ方法で計算しています:
data = csvread('path/to/data');
matlab_cov = cov(data);
my_cov = csvread('path/to/cov_file');
matlab_inv = pinv(matlab_cov);
my_inv = pinv(my_cov);
違いが非常に大きいため、サンプル(ここに貼り付け)から65サンプルの分布までのマハラノビス距離を次のように計算しています。
異なる逆共分散行列()を使用すると、大きく異なる結果が得られます。
(65/(64^2))*((sample-sample_mean)*my_inv*(sample-sample_mean)')
ans =
1.0167e+05
(65/(64^2))*((sample-sample_mean)*matlab_inv*(sample-sample_mean)')
ans =
109.9612
共分散行列の小さな(e-7)差が疑似逆行列の計算にそのような影響を与えるのは正常ですか?もしそうなら、この影響を緩和するために私は何ができますか?
これに失敗すると、逆共分散を含まない、使用できる他の距離メトリックスはありますか?私はマハラノビス距離を使用します。これは、n個のサンプルについてはベータ分布に従うため、仮説検定に使用します。
事前に感謝します
EDIT:以下、共分散行列を計算するためのC ++コードを追加:vector<vector<double> >
貼り付けたファイルからの行の集合を表します。
Mat covariance_matrix = Mat(21, 21, CV_32FC1, cv::Scalar(0));
for(int j = 0; j < 21; j++){
for(int k = 0; k < 21; k++){
for(std::vector<vector<double> >::iterator it = data.begin(); it!= data.end(); it++){
covariance_matrix.at<float>(j,k) += (it->at(j) - mean.at(j)) * (it->at(k) - mean[k]);
}
covariance_matrix.at<float>(j,k) /= 64;
}
}