我发现OpenCV中的LDA结果与其他库的结果不同。例如,输入数据是
DATA (13 data samples with 4 dimensions) 7 26 6 60 1 29 15 5211 56 8 2011 31 8 47 7 52 6 3311 55 9 22 3 71 17 6 1 31 22 44 2 54 18 2221 47 4 26 1 40 23 3411 66 9 1210 68 8 12LABEL 0 1 2 0 1 2 0 1 2 0 1 2 0
OpenCV的代码是
Mat data = (Mat_<float>(13, 4) <<\ 7, 26, 6, 60,\ 1, 29, 15, 52,\ 11, 56, 8, 20,\ 11, 31, 8, 47,\ 7, 52, 6, 33,\ 11, 55, 9, 22,\ 3, 71, 17, 6,\ 1, 31, 22, 44,\ 2, 54, 18, 22,\ 21, 47, 4, 26,\ 1, 40, 23, 34,\ 11, 66, 9, 12,\ 10, 68, 8, 12);Mat mean;reduce(data, mean, 0, CV_REDUCE_AVG);mean.convertTo(mean, CV_64F);Mat label(data.rows, 1, CV_32SC1);for (int i=0; i<label.rows; i++) label.at<int>(i) = i%3;LDA lda(data, label);Mat projection = lda.subspaceProject(lda.eigenvectors(), mean, data);
Matlab的代码是(使用Matlab降维工具箱)
cd drtoolbox\techniques\load haldlabel=[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0][projection, trainedlda] = lda(ingredients, label)
特征值是
OpenCV (lda.eigenvectors())0.4457 4.01320.4880 3.57030.5448 3.34660.5162 3.5794Matlab Toolbox for Dimensionality Reduction (trainedlda.M)0.5613 0.71590.6257 0.62030.6898 0.58840.6635 0.6262
然后数据的投影是
OpenCV1.3261 7.12760.8892 -4.7569-1.8092 -6.1947-0.0720 1.19270.0768 3.3105-0.7200 0.7405-0.3788 -4.73881.5490 -2.8255-0.3166 -8.8295-0.8259 9.89531.3239 -3.1406-0.5140 4.2194-0.5285 4.0001Matlab Toolbox for Dimensionality Reduction1.8030 1.31711.2128 -0.8311-2.3390 -1.0790-0.0686 0.31920.1583 0.5392-0.9479 0.1414-0.5238 -0.97221.9852 -0.4809-0.4173 -1.6266-1.1358 1.90091.6719 -0.5711-0.6996 0.7034-0.6993 0.6397
尽管这些LDA使用了相同的数据,但特征向量和投影结果不同。我认为有两种可能的情况。
- 其中一个库有错误。
- 我的使用方法有误。
谢谢!
回答:
差异的原因是特征向量未被归一化。归一化后的(L2范数)特征向量是
OpenCV0.44569 0.551960.48798 0.491050.54478 0.460280.51618 0.49230Matlab Toolbox for Dimensionality Reduction0.44064 0.559770.49120 0.485020.54152 0.460080.52087 0.48963
现在它们看起来很相似,尽管它们的特征值相当不同。
尽管OpenCV中的PCA返回归一化的特征向量,但LDA却没有。我接下来的问题是“在LDA中归一化特征向量是否不是必须的?”