PCAの次元ダウンを実現する3つの方法
主成分分析、すなわちPrincipal Component Analysis(PCA)は、多重統計における重要な内容であり、機械学習や他の分野にも広く応用されている.その主な役割は、高次元データの次元ダウンです.PCAは元のn個の特徴をより少ないk個の特徴で置き換え,新しい特徴は古い特徴の線形組合せであり,これらの線形組合せは試料分散を最大化し,できるだけ新しいk個の特徴を互いに相関させないようにした.
PCAの主なアルゴリズムは以下の通りである.は、モデルの使用を容易にするためにデータ形式を組織する. サンプルの各特徴の平均値を計算する. 各サンプルデータから特徴の平均値を減算する(正規化処理). 共分散行列を求める; 共分散行列の特徴値と特徴ベクトルを見つける. は、特徴値と特徴ベクトルを再配列する(特徴値が大きいから小さいまで配列する). 特徴値に対して累積寄与率を求める. は、累積寄与率に対して、ある特定の割合で特徴ベクトルセットのサブセットを選択する. は、元のデータ(ステップ3以降)を変換する.
ここで、共分散行列の分解は、対称行列の特徴ベクトルによってもよいし、行列のSVDを分解することによっても実現できるが、Scikit−learnにおいても、SVDを用いてPCAアルゴリズムを実現する.
pythonがPCAの次元ダウンを実現する3つの方法を記録します.
1、直接法即ち上述の原始アルゴリズム
2、SVD(マトリックス特異値分解)、SVD付きオリジナルアルゴリズム、PythonのNumpyモジュールにおいてSVDアルゴリズムが実現されており、特徴値を小さいものから並べ替え、特徴値と特徴ベクトルの並べ替えを省く
3、Scikit-learnモジュール、PCA類の直接計算を実現し、前の2つの方法の正確性を検証する.
PCAの次元ダウンを行うには、共分散に関する知識が含まれます.別のブログを参照してください.共分散の理解とpythonの実装
出力結果は次のとおりです.
PCAの主なアルゴリズムは以下の通りである.
ここで、共分散行列の分解は、対称行列の特徴ベクトルによってもよいし、行列のSVDを分解することによっても実現できるが、Scikit−learnにおいても、SVDを用いてPCAアルゴリズムを実現する.
pythonがPCAの次元ダウンを実現する3つの方法を記録します.
1、直接法即ち上述の原始アルゴリズム
2、SVD(マトリックス特異値分解)、SVD付きオリジナルアルゴリズム、PythonのNumpyモジュールにおいてSVDアルゴリズムが実現されており、特徴値を小さいものから並べ替え、特徴値と特徴ベクトルの並べ替えを省く
3、Scikit-learnモジュール、PCA類の直接計算を実現し、前の2つの方法の正確性を検証する.
PCAの次元ダウンを行うには、共分散に関する知識が含まれます.別のブログを参照してください.共分散の理解とpythonの実装
import numpy as np
from sklearn.decomposition import PCA
import sys
#returns choosing how many main factors
def index_lst(lst, component=0, rate=0):
#component: numbers of main factors
#rate: rate of sum(main factors)/sum(all factors)
#rate range suggest: (0.8,1)
#if you choose rate parameter, return index = 0 or less than len(lst)
if component and rate:
print('Component and rate must choose only one!')
sys.exit(0)
if not component and not rate:
print('Invalid parameter for numbers of components!')
sys.exit(0)
elif component:
print('Choosing by component, components are %s......'%component)
return component
else:
print('Choosing by rate, rate is %s ......'%rate)
for i in range(1, len(lst)):
if sum(lst[:i])/sum(lst) >= rate:
return i
return 0
def main():
# test data
mat = [[-1,-1,0,2,1],[2,0,0,-1,-1],[2,0,1,1,0]]
# simple transform of test data
Mat = np.array(mat, dtype='float64')
print('Before PCA transforMation, data is:
', Mat)
print('
Method 1: PCA by original algorithm:')
p,n = np.shape(Mat) # shape of Mat
t = np.mean(Mat, 0) # mean of each column
# substract the mean of each column
for i in range(p):
for j in range(n):
Mat[i,j] = float(Mat[i,j]-t[j])
# covariance Matrix
cov_Mat = np.dot(Mat.T, Mat)/(p-1)
# PCA by original algorithm
# eigvalues and eigenvectors of covariance Matrix with eigvalues descending
U,V = np.linalg.eigh(cov_Mat)
# Rearrange the eigenvectors and eigenvalues
U = U[::-1]
for i in range(n):
V[i,:] = V[i,:][::-1]
# choose eigenvalue by component or rate, not both of them euqal to 0
Index = index_lst(U, component=2) # choose how many main factors
if Index:
v = V[:,:Index] # subset of Unitary matrix
else: # improper rate choice may return Index=0
print('Invalid rate choice.
Please adjust the rate.')
print('Rate distribute follows:')
print([sum(U[:i])/sum(U) for i in range(1, len(U)+1)])
sys.exit(0)
# data transformation
T1 = np.dot(Mat, v)
# print the transformed data
print('We choose %d main factors.'%Index)
print('After PCA transformation, data becomes:
',T1)
# PCA by original algorithm using SVD
print('
Method 2: PCA by original algorithm using SVD:')
# u: Unitary matrix, eigenvectors in columns
# d: list of the singular values, sorted in descending order
u,d,v = np.linalg.svd(cov_Mat)
Index = index_lst(d, rate=0.95) # choose how many main factors
T2 = np.dot(Mat, u[:,:Index]) # transformed data
print('We choose %d main factors.'%Index)
print('After PCA transformation, data becomes:
',T2)
# PCA by Scikit-learn
pca = PCA(n_components=2) # n_components can be integer or float in (0,1)
pca.fit(mat) # fit the model
print('
Method 3: PCA by Scikit-learn:')
print('After PCA transformation, data becomes:')
print(pca.fit_transform(mat)) # transformed data
main()
出力結果は次のとおりです.
Before PCA transforMation, data is:
[[-1. -1. 0. 2. 1.]
[ 2. 0. 0. -1. -1.]
[ 2. 0. 1. 1. 0.]]
Method 1: PCA by original algorithm:
Choosing by component, components are 2......
We choose 2 main factors.
After PCA transformation, data becomes:
[[ 2.6838453 -0.36098161]
[-2.09303664 -0.78689112]
[-0.59080867 1.14787272]]
Method 2: PCA by original algorithm using SVD:
Choosing by rate, rate is 0.95 ......
We choose 2 main factors.
After PCA transformation, data becomes:
[[ 2.6838453 0.36098161]
[-2.09303664 0.78689112]
[-0.59080867 -1.14787272]]
Method 3: PCA by Scikit-learn:
After PCA transformation, data becomes:
[[ 2.6838453 -0.36098161]
[-2.09303664 -0.78689112]
[-0.59080867 1.14787272]]