2014-09-04 4 views
3

libpca은 선형 대수학 라이브러리 인 Armadillo을 기반으로하는 주성분 분석을위한 C++ 라이브러리입니다.libpca를 사용한 주성분 분석

그래도 문제가 있습니다. 나는 PCA에 관한 위대한 튜토리얼에서 Lindsay Smith으로 주어진 예제와 출력을 비교하고있다. 첫 번째 주 구성 요소를 검색 할 때 자습서에서 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

+0

libpca 사용 방법은 어디에서 찾을 수 있습니까? – Ben

+0

@Ben은 내 질문에 완전한 작동 예제를 제공하지 않습니까? – kunterbunt

답변

4

@mtall 이미 핵심 이유가 있습니다 주요 구성 요소는 부분 공간의 정상적인 기초를 형성합니다. 기본 벡터를 생성하는 방법에 관계없이 기본 벡터에 -1을 곱하면 동일한 부분 영역의 또 다른 기초가됩니다.

이것은보기가 쉽습니다. 벡터 v에 상수를 곱하면 방향이 바뀌지 않습니다. v가 w에 대해 정상이면, 2 * v는 3 * w에 대해 정상입니다. 벡터에 -1을 곱하면 방향이 바뀝니다. v와 w가 각도 α를 갖는다면, -v와 w는 각 (π-α)을 갖는다. 그러나 알파가 π/2이고 v와 w가 정상이면 (pi-pi/2)는 여전히 π/2이므로 -v와 w도 정상입니다.

+0

삭제 해 주셔서 감사합니다. 후속 질문 : 모든 벡터가 양수 값만 갖기를 원한다면 관계를 유지하면서 어떻게 변환 할 수 있습니까? 그렇다면 거리 메트릭스가 거리를 유지한다고합시다. – kunterbunt

+1

@randomdude : 전혀 이해가되지 않습니다. 벡터에 -1을 곱할 수는 있지만 모든 구성 요소가 곱 해집니다. 예를 들어 PCA는 [2,2]와 [-1,1]을 모두 반환 할 수 있습니다. 그것은 두 직교 벡터입니다. 후자를 곱하면 [1, -1]이되지만, 후자를 [1,1]로 현명하게 변환 할 수는 없습니다. 그것은 [2,2]와 직교하지 않고, – MSalters