파이썬을 이용한 주성분 분석 (PCA)의 간단한 스크래치
Ice Break
마지막 기사 에서는 주성분 분석(PCA)을 제목으로 선형 대수의 총 복습을 실시했습니다.
이 글에서는 python을 이용한 PCA의 구현 예에 대해 설명한다.
sklearn 사용하면 지루하지 않기 때문에 numpy 묶음으로 구현했습니다.
다음 기사에서는 이번에 작성한 모듈을 이용하여 차원 삭감이 회귀 분석에 미치는 영향에 대해 고찰합니다.
데이터 세트 준비
sklearn과 함께 제공되는 Boston House Prices dataset을 사용합니다.
먼저 house price 이외의 데이터를 설명 변수 X 로서 사용하기 위해서 데이터 프레임으로부터 어레이로서 꺼냅니다.
또한 작법으로서 X 를 컬럼을 따라 정규화해 둡니다.
from sklearn.datasets import load_boston
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
def create_X():
boston = load_boston()
data = pd.DataFrame(boston.data, columns = boston.feature_names)
data = data.values
X = np.delete(data,12,1)
mean = np.mean(X,axis=0)
std = np.std(X,axis=0)
X = (X-mean)/std
return X
PCA
이전 기사에서 언급했듯이 PCA는 $X^{T}X$에 대한 고유 벡터를 탐색합니다.
따라서 먼저 $X^{T}X$를 계산합니다. (1)
그런 다음 numpy.linali.eig를 사용하여 고유 벡터를 계산합니다. (2)
$D$는 고유벡터를 대응하는 고유치가 큰 순서로 늘어놓은 것입니다. 모든 차원으로 압축하기 위해 n_componens를 변수로 사용합니다. 또한 아래에서 수식과 같이 계산을 진행하기 위해 한 번 전치를 끼고 있습니다만, 구현상은 필요 없습니다. (3)
마지막으로 $D^{T}X$를 계산하여 차원을 줄일 수 있습니다. (4)
def PCA_Sc(X,n_components):
columns = X.shape[1]
# 1 calucurate X_TX
X_TrX = np.dot(X.T,X)
# 2 clucurate eigenvalue & Eigenvector
w,v = np.linalg.eig(X_TrX)
# 3 create D
D_list = [v[:,i] for i in range(n_components)]
D_array = np.array(D_list)
D_reshape = np.reshape(D_array,(n_components,columns))
D = D_reshape.T
# 4 colucurate D_TX
X_transform = np.dot(D.T,X.T)
return X_transform
sklearn과의 비교
sklearn에서 생성한 주성분 $D$와의 비교를 실시했습니다. 결과는 다음과 같습니다.
이 그림에서 알 수 있는 것은 sklearn에서는 제1 주성분의 최초의 값이 양이 되도록 부호를 반전시키는 기능이 내장되어 있는 것입니다. (이것은 다른 사람들도보고했다고 생각합니다.)
스크래치로 쓰면 이런 발견이 있어서 즐겁네요.
정의 참조하는 것이 빠르지만 ...
Reference
이 문제에 관하여(파이썬을 이용한 주성분 분석 (PCA)의 간단한 스크래치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ajioka/items/cb3b53f6e966c0bf9be3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
sklearn과 함께 제공되는 Boston House Prices dataset을 사용합니다.
먼저 house price 이외의 데이터를 설명 변수 X 로서 사용하기 위해서 데이터 프레임으로부터 어레이로서 꺼냅니다.
또한 작법으로서 X 를 컬럼을 따라 정규화해 둡니다.
from sklearn.datasets import load_boston
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
def create_X():
boston = load_boston()
data = pd.DataFrame(boston.data, columns = boston.feature_names)
data = data.values
X = np.delete(data,12,1)
mean = np.mean(X,axis=0)
std = np.std(X,axis=0)
X = (X-mean)/std
return X
PCA
이전 기사에서 언급했듯이 PCA는 $X^{T}X$에 대한 고유 벡터를 탐색합니다.
따라서 먼저 $X^{T}X$를 계산합니다. (1)
그런 다음 numpy.linali.eig를 사용하여 고유 벡터를 계산합니다. (2)
$D$는 고유벡터를 대응하는 고유치가 큰 순서로 늘어놓은 것입니다. 모든 차원으로 압축하기 위해 n_componens를 변수로 사용합니다. 또한 아래에서 수식과 같이 계산을 진행하기 위해 한 번 전치를 끼고 있습니다만, 구현상은 필요 없습니다. (3)
마지막으로 $D^{T}X$를 계산하여 차원을 줄일 수 있습니다. (4)
def PCA_Sc(X,n_components):
columns = X.shape[1]
# 1 calucurate X_TX
X_TrX = np.dot(X.T,X)
# 2 clucurate eigenvalue & Eigenvector
w,v = np.linalg.eig(X_TrX)
# 3 create D
D_list = [v[:,i] for i in range(n_components)]
D_array = np.array(D_list)
D_reshape = np.reshape(D_array,(n_components,columns))
D = D_reshape.T
# 4 colucurate D_TX
X_transform = np.dot(D.T,X.T)
return X_transform
sklearn과의 비교
sklearn에서 생성한 주성분 $D$와의 비교를 실시했습니다. 결과는 다음과 같습니다.
이 그림에서 알 수 있는 것은 sklearn에서는 제1 주성분의 최초의 값이 양이 되도록 부호를 반전시키는 기능이 내장되어 있는 것입니다. (이것은 다른 사람들도보고했다고 생각합니다.)
스크래치로 쓰면 이런 발견이 있어서 즐겁네요.
정의 참조하는 것이 빠르지만 ...
Reference
이 문제에 관하여(파이썬을 이용한 주성분 분석 (PCA)의 간단한 스크래치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ajioka/items/cb3b53f6e966c0bf9be3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
def PCA_Sc(X,n_components):
columns = X.shape[1]
# 1 calucurate X_TX
X_TrX = np.dot(X.T,X)
# 2 clucurate eigenvalue & Eigenvector
w,v = np.linalg.eig(X_TrX)
# 3 create D
D_list = [v[:,i] for i in range(n_components)]
D_array = np.array(D_list)
D_reshape = np.reshape(D_array,(n_components,columns))
D = D_reshape.T
# 4 colucurate D_TX
X_transform = np.dot(D.T,X.T)
return X_transform
sklearn에서 생성한 주성분 $D$와의 비교를 실시했습니다. 결과는 다음과 같습니다.
이 그림에서 알 수 있는 것은 sklearn에서는 제1 주성분의 최초의 값이 양이 되도록 부호를 반전시키는 기능이 내장되어 있는 것입니다. (이것은 다른 사람들도보고했다고 생각합니다.)
스크래치로 쓰면 이런 발견이 있어서 즐겁네요.
정의 참조하는 것이 빠르지만 ...
Reference
이 문제에 관하여(파이썬을 이용한 주성분 분석 (PCA)의 간단한 스크래치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ajioka/items/cb3b53f6e966c0bf9be3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)