2014-09-04 150 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