分散共分散行列の違い
Rで書かれたとあるプログラムをOpenCV(C++ interface)に移植中なのですが、
分散共分散行列を求める2つの関数で出力される値が違うのに困惑していました。
OpenCVでは cv::calcCovarMatrix で、Rでは var です。
7 4 7
2 3 8
3 6 2
みたいな行列(値に意味は一切ありません)を与えたとき
cv::calcCovarMatrixでは、
4.666667 0.000000 1.000000
0.000000 1.555556 -3.222222
1.000000 -3.222222 6.888889
Rでは
7.000000 0.000000 1.500000
0.000000 2.333333 -4.833333
1.500000 -4.833333 10.333333
といった出力になっていました。
どうも係数(1.5)がかかっているようです。
しかしこれが常にそうなのか?というところが疑問で困っていたところだったのですが
という標本分散と不偏分散の定義の違いだと気付きました。(すぐに気付けよというところですが。。。)
今回、Rの方が移植元なので
cv::calcCovarMatrix(data, vx, mean, CV_COVAR_NORMAL | CV_COVAR_ROWS | CV_COVAR_SCALE, CV_32F); vx *= (double)data.cols / (data.cols - 1);
というふうにすることで対応できました。
C++ interfaceは便利ですね。
まぁ、数値そのものはおそらく重要でないので、標本分散でもいいのかもしれません。