c++ - 使用 libpca 进行主成分分析

标签 c++ pca principal-components

libpca是一个基于 Armadillo 的主成分分析 C++ 库, 一个线性代数库。

不过我遇到了问题。我将其输出与 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 已经有了核心原因:主成分形成子空间的正常基础。无论您如何创建基础,将任何基础 vector 乘以 -1 都会形成同一子空间的另一个基础。

这很容易看出: vector v 乘以任何常数都不会改变它的方向。如果 v 垂直于 w,则 2*v 垂直于 3*w。将 vector 乘以 -1 会反转其方向。如果 v 和 w 的角度为 alpha,则 -v 和 w 的角度为 (pi - alpha)。但如果 alpha 是 pi/2,v 和 w 是正常的,(pi-pi/2) 仍然是 pi/2 因此 -v 和 w 也是正常的。

关于c++ - 使用 libpca 进行主成分分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25672366/

相关文章:

machine-learning - 主成分分析与特征去除

java - java中的主成分分析

python - 不理解 Python 中主成分分析 (PCA) 的输出

c++ - my_string(char* s) 是什么意思?

c++ - 是否需要实现来诊断对同一TU中相同显式专业的重复定义进行ODR违规?

matlab - 我怎样才能真正减少 PCA 的特征维度?

python - 拆分数据时使用 scikit-learn 规范化 PCA

c++ - 什么时候可以在 C++ 中安全地使用 static_cast 进行向下转换?

c++ - 如何缩短单例调用?

python - 将高斯过程模型拟合到 PCA。预测看起来很错误