PCATADAの紹介~🎉


Feature selection vs Feature engineering


変数の選択は、既存の変数を選択せずに重要な変数のみを選択することを意味します.
フィーチャーエンジニアリングは、既存の変数に基づいて新しい変数を作成します.

PCA


PCAは、特徴的なエンジニアリング技術の1つと見なすことができる.

Eigen-Value Decomposition


原理を理解するには,一意値分解,特徴値分解を理解しなければならない.
ある行列Aとあるベクトルxの積は、定数値とあるベクトルxの形式として表すことができる.Ax = λxAを掛けると、方向は同じですが、大きさが違います.
ここでxは固有ベクトル(特徴ベクトル)であり、λユニーク値(フィーチャー値)と呼びます.
2つの要素を求めてみましょう



この過程により,固有値と固有ベクトルを求めることができる.
固有ベクトルに定数を乗じても同じ固有ベクトルであるため、大きさが1のベクトルに正規化する.
リファレンス
これにより行列Aを表すことができる.
A = PΛP^-1に分解できます.

ソース
  • 行列の対角化=分解
  • すべての正方行列は固有値分解を行うことができず,固有ベクトル間は線形に独立しなければならない.
  • 正方行列が異なる固有値を有する場合、固有ベクトルは線形に独立する.
    ->正方形マトリクスAに異なる固有値がある場合、固有値を分解できます!
  • Spectrum decomposition


    固有値分解の特殊なケースと考えられる.
    行列Aが正方行列、対称行列である場合
  • は常に固有値
  • を分解することができる.
  • 固有ベクトル間で直交する.
    PCAでは空分割行列が用いられているため,このことを満たす.
  • これに加えて,特殊値分解(SVD)は非正方行列を分解することも可能である.
    PCAでの固有値分解の使用方法について説明します

    PCA

  • 変数の全分散の大部分は少数の主成分で説明されている.
  • の高次元データの最大分散方向を見つけ、新しい低次元空間に投影します.

  • データの空分割行列を求める.
    公分散行列はxx^Tであり,データの構造を説明した.

  • くうぶんマトリクスのスペクトル分解

  • より大きな固有値を持つ固有ベクトルを使用して正射零下の次元を縮小
  • 次のようにコードで表現します.
    from sklearn.preprocessing import StandardScaler
    import numpy.linalg as lin
    
    
    def new_coordinates(X,eigenvectors,index):
        new = None
        for i in range(eigenvectors.shape[1]):
            if (i in index) and (new is None):
                new = [X.dot(eigenvectors.T[i])]
            elif i in index:
                val = [X.dot(eigenvectors.T[i])]
                new = np.concatenate((new, val),axis=0)
            else:
                continue
        return new.T
    
    
    def MYPCA(X,number):
        # 정규화
        scaler = StandardScaler()
        X_std =  scaler.fit_transform(X) #sclaing 후 데이터
        features = X_std.T
        
        # 공분산 행렬 구하기
        cov_matrix = np.cov(features)
        
        # 공분산 행렬의 고유 벡터, 고유값
        eigenvalues = lin.eig(cov_matrix)[0]
        eigenvectors = lin.eig(cov_matrix)[1]
        
        # 소팅 후, number만큼 eigenvalue 선택
        eigenvalues = list(eigenvalues)
        sort_eigenvalues = sorted(eigenvalues, reverse=True)
        index = []
        for i in range(number):
            index.append(eigenvalues.index(sort_eigenvalues[i])) # projection해야할 eigenvector들의 index값을 구합니다.
        
        # eigenvector로 projection
        new = new_coordinates(X_std, eigenvectors, index)
        
        return new #새로운 축으로 변환되어 나타난 데이터 return