我正在尝试PCA的一个例子,我发现使用MATLAB的特征值与使用OpenCV的值不同,而特征向量是相同的。有谁知道为什么?这两种算法的区别是什么?
我的MATLAB代码如下:
a=[-14.8271317103068,-3.00108550936016,1.52090778549498,3.95534842970601;...
-16.2288612441648,-2.80187433749996,-0.410815700402130,1.47546694457079;...
-15.1242838039605,-2.59871263957451,-0.359965674446737,1.34583763509479;...
-15.7031424565913,-2.53005662064257,0.255003254103276,-0.179334985754377;...
-17.7892158910100,-3.32842422986555,0.255791146332054,1.65118282449042;...
-17.8126324036279,-4.09719527953407,-0.879821957489877,-0.196675865428539;...
-14.9958877514765,-3.90753364293621,-0.418298866141441,-0.278063876667954;...
-15.5246706309866,-2.08905845264568,-1.16425848541704,-1.16976057326753;];
[covEigvec, ~,covEigval] = princomp(a, 'econ');
我的OpenCV代码如下:
cv::Mat sampleset(nums,dim,CV_32FC1,data);
cv::PCA *pca = new cv::PCA(sampleset,cv::Mat(),CV_PCA_DATA_AS_ROW,redDim);
答案 0 :(得分:1)
是的,那些特征值是不同的,达到一定的规模。
因为opencv在计算协方差矩阵时对数据进行缩放。
请参阅core/src/matmul.cpp:2226
(大致此处)
mulTransposed( data, _covar, ((flags & CV_COVAR_NORMAL) == 0) ^ takeRows,
mean, (flags & CV_COVAR_SCALE) != 0 ? 1./nsamples : 1, ctype );
此函数最终将调用gemm
,其第五个参数为缩放因子