c – 使用libpca进行主成分分析

libpca是主成分分析的C库,它建立在线性代数库Armadillo之上.

不过,我遇到了问题.我将他的输出与Lindsay Smith在他的PCA精彩教程中给出的例子进行比较.当我检索第一个主要组件时,我在他的教程中获得与Smith相同的值,但其符号被反转.对于第二主成分,符号和值是正确的.

有谁知道这是为什么?

码:

#include "pca.h"
#include <iostream>

using namespace std;

int main(int argc, char** argv) {
    stats::pca pca(2);

    double* elements = new double[20]{2.5, 2.4, 0.5, 0.7, 2.2, 2.9, 1.9, 2.2, 3.1, 3.0, 2.3, 2.7, 2, 1.6, 1, 1.1, 1.5, 1.6, 1.1, 0.9};
    for (int i = 0; i < 20; i++) {
        vector<double> record;
        record.push_back(elements[i++]);
        record.push_back(elements[i]);
        pca.add_record(record);
    }

    pca.solve();             

    const vector<double> principal_1 = pca.get_principal(0);
    for (int i = 0; i < principal_1.size(); i++)
        cout << principal_1[i] << " ";
    cout << endl;

    const vector<double> principal_2 = pca.get_principal(1);
    for (int i = 0; i < principal_2.size(); i++)
        cout << principal_2[i] << " ";
    cout << endl;

    delete elements;
    return 0;
}

输出:

0.82797 -1.77758 0.992197 0.27421 1.6758 0.912949 -0.0991094 -1.14457 -0.438046 -1.22382 
-0.175115 0.142857 0.384375 0.130417 -0.209498 0.175282 -0.349825 0.0464173 0.0177646 -0.162675 

解决方法:

@mtall已经有了核心原因:主要组件形成子空间的正常基础.无论您如何创建基础,将任何基础向量乘以-1都会形成同一子空间的另一个基础.

这很容易看出:将矢量v乘以任何常数不会改变其方向.如果v与w正常,则2 * v与3 * w正常.将矢量乘以-1会反转其方向.如果v和w具有角度α,则-v和w具有角度(pi-alpha).但如果α是pi / 2,v和w是正常的,(pi-pi / 2)仍然是pi / 2,因此-v和w也是正常的.

上一篇:不使用路由器来实现不同网段(子网)计算机之间通信的方法


下一篇:opencv实战——PCA算法的应用