ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PCA in python
    data-science-summary/summary 2020. 9. 16. 21:53
    반응형

    <엔지니어는 구현을 못하면 모르는것이다>

    PCA(principal component analysis) 주성분 분석

    PCA 이해 개념적으로 간단히

    데이터의 차원을 줄이려고 하는데 원데이터의 성질을 가장 잘 보존하고자한다.

    이때 분산은 데이터들의 분포 특성을 가장 잘설명하며 이 분산의 방향이 가장 큰 방향벡터를 주성분이라고 함

    그리고 데이터를 가장 큰 방향벡터를 기준으로 투영(Projection)하여 변형(feature extraction) 하는것이 PCA이다.

    따라서 PCA 후에는 데이터 값이 달라지지만 기존 데이터의 분포 특성을 최대한 보존한다.

    첫번째 축을 찾은뒤 첫번째 축과 직교(orthogonal)하면서 분산이 가장 큰, 즉 가장 큰 방향벡터(주성분)를 찾은 뒤 축으로 하여 데이터를 투영하며

    이런 반복을 원하는 차원의 수만큼 반복한다.

    그런 뒤 투영된 값들을 새로운 feature로 변환시켜 사용한다.

    PCA 이해 수학적으로 간단히

    공분산 행렬은 데이터가 얼마나 함께 변화하는지를 나타낸다.

    공분산 행렬을 이용(Eigenvalue Decomposition)하면 고유 벡터(Eigenvector)와 고유값(Eigenvalue) 라는 것을 구할수 있다.

    Eigenvector 는 선형 변환을 하여도 방향이 보존되며 크기만 변하는 벡터이고, Eigenvalue 는 Eigenvector의 변하는 크기를 나타내며 이 고유값이 클수록 데이터의 경향성을 강하게 나타내고 있기떄문에 높을수록 좋다.

    그리고 구한 고유 벡터는 최대 분산의 방향에 해당한다.

    이 고유 벡터에 직교하는 그 다음 분산을 가장 잘 설명하는(고유값이 큰) eigenvector를 구하는 작업을 원하는 차원의 개수만큼 반복한다.

    그런 뒤 구한 고유벡터로 투영된 값들을 새로운 feature로 변환시켜 사용한다.

    참고로 보통 Eigenvalue의 분산 설명력의 비율이 90% 넘을때까지 벡터(차원의 수)들을 선택한다.

    import numpy as np
    from sklearn.decomposition import PCA
    X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    # n_components: 투영할 축 개수, / svd_solver: 알고리즘
    pca = PCA(n_components=2, random_state=1234, svd_solver='auto')
    x_trans = pca.fit_transform(X)
    # 전체 분산 총량중 첫번째 주성분의 분산설명력의 비율
    print(pca.explained_variance_ratio_[0])
    
    # 위와 같이 설명 비율을 아래와 같은식
    pca_explained_variance_ratio_2 = pca.explained_variance_/sum(pca.explained_variance_)
    print(pca_explained_variance_ratio_2)
    
    # 누적 설명력
    print(pca.explained_variance_ratio_.cumsum())
    
    # 90% 이상 누적 설명력을 가지는 차원의 최소 개수
    print(np.argmax(pca.explained_variance_ratio_.cumsum() >= 0.9) + 1)
    
    # 고유값 = Eigenvalue : 설명 정도
    # 두번째 주성분의 고유값
    print(pca.explained_variance_ratio_[1])
    
    # 고유벡터 = Eignevector : 축에 투영시 반영되는 방향 벡터값
    print(pca.components_)
    # 첫번째 주성분에 대한 2번째 변수의 사영계수값
    print(pca.components_[0,1])
    
    # 고유값과 고유 벡터로 투영되어 변환된 값
    x_trans
    반응형

    댓글

Designed by Tistory.