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 已经有了核心原因:主成分构成一个子空间的正规基。无论您如何创建基,将任何基 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/