2014-09-04 87 views
3

libpca是用于主成分分析的C++库,它建立在线性代数库Armadillo的基础上。使用libpca进行主成分分析

虽然我遇到了问题。我将其输出与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 
+0

在大多数情况下只有主要组件的大小问题 – mtall 2014-09-05 04:46:32

+0

有没有任何提示如何使用libpca? – Ben 2018-02-27 15:47:51

+0

@Ben不是我的问题给出了一个完整的工作示例? – kunterbunt 2018-02-27 19:34:43

回答

4

@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也是正常的。

+0

感谢您的理解。后续问题:如果我想让所有向量都只有正值,那么我怎么能在保持它们的关系的同时将它们转换成这样做呢?所以说距离度量保持它们的距离? – kunterbunt 2014-09-05 11:24:42

+1

@randomdude:这根本没有意义。您可以将矢量乘以-1,但会乘以所有组件。例如,您的PCA可以返回[2,2]和[-1,1]。这是两个正交矢量。你可以乘以后者得到[1,-1],但你无法明智地将后者转换为[1,1]。这将是共线的,而不是正交于[2,2] – MSalters 2014-09-05 12:59:59