2016-12-07 11 views
1

Scikit-LearnのPCA transformメソッドに関する質問があります。コードはhereです。スクロールしてtransform()メソッドを見つけてください。Scikit学習変換メソッド - 手動計算?

彼らはこのsimple exampleの手順を示した - 手順は、変換後、最初のフィット感にあると:

pca.fit(X) #step 1: fit() 
X_transformed = fast_dot(X, self.components_.T) #step 2: transform() 

私は次のように手動でこれを行うにしようとしています:

期待
import numpy as np 
from sklearn.datasets import load_iris 
from sklearn.decomposition import PCA 
from sklearn.utils.extmath import fast_dot 

iris = load_iris() 
X = iris.data 
y = iris.target 

pca = PCA(n_components=3) 

pca.fit(X) 

Xm = X.mean(axis=1) 
print pca.transform(X)[:5,:] #Method 1 - expected 
X = X - Xm[None].T # or can use X = X - Xm[:, np.newaxis] 
print fast_dot(X,pca.components_.T)[:5,:] #Method 2 - manual 

[[-2.68420713 -0.32660731 0.02151184] 
[-2.71539062 0.16955685 0.20352143] 
[-2.88981954 0.13734561 -0.02470924] 
[-2.7464372 0.31112432 -0.03767198] 
[-2.72859298 -0.33392456 -0.0962297 ]] 

マニュアル

[[-0.98444292 -2.74509617 2.28864171] 
[-0.75404746 -2.44769323 2.35917528] 
[-0.89110797 -2.50829893 2.11501947] 
[-0.74772562 -2.33452022 2.10205674] 
[-1.02882877 -2.75241342 2.17090017]] 

ご覧のとおり、2つの結果が異なります。 transform()メソッドのどこかにステップがありませんか?

答えて

0

私はPCAの偉大な専門家ではありませんが、あなたの問題を発見したsklearnのソースコードを見て、あなたは間違った軸に沿って平均をとっています。

Xm = X.mean(axis=0) # Axis 0 instead of 1 
print pca.transform(X)[:5,:] #Method 1 - expected 
X = X - Xm # No need for transpose now 
print fast_dot(X,pca.components_.T)[:5,:] #Method 2 - manual 

結果::

[[-2.68420713 0.32660731 -0.02151184] 
[-2.71539062 -0.16955685 -0.20352143] 
[-2.88981954 -0.13734561 0.02470924] 
[-2.7464372 -0.31112432 0.03767198] 
[-2.72859298 0.33392456 0.0962297 ]] 
[[-2.68420713 0.32660731 -0.02151184] 
[-2.71539062 -0.16955685 -0.20352143] 
[-2.88981954 -0.13734561 0.02470924] 
[-2.7464372 -0.31112432 0.03767198] 
[-2.72859298 0.33392456 0.0962297 ]] 
+0

おかげ

はここソリューションです。これはsomewherre - 'axis = 0'ですか? –

+0

私はそれをソースコードで見ました:sklearn.decomposition.pcaの 'self.mean_ = np.mean(X、axis = 0)' – Shovalt

関連する問題