2016-06-10 299 views

回答

4

我在這裏假設,通過EigenVectors你指的是協方差矩陣的特徵向量。

假設您在p維空間中有n個數據點,並且X是您的點的p×n矩陣,那麼主要分量的方向是協方差矩陣的特徵向量XX T。通過訪問PCA對象的components_屬性,可以從sklearn獲取這些EigenVectors的方向。這可以如下進行:

from sklearn.decomposition import PCA 
import numpy as np 
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) 
pca = PCA() 
pca.fit(X) 
print pca.components_ 

這使像

[[ 0.83849224 0.54491354] 
[ 0.54491354 -0.83849224]] 

其中每一行是在p維空間中的主成分(2在這個玩具的例子)的輸出。這些行中的每一行都是居中的協方差矩陣XX T的特徵向量。

就特徵值而言,沒有直接的方法可以從PCA對象中獲取它們。 PCA對象確實有一個稱爲explained_variance_ratio_的屬性,它給出了每個組件的方差百分比。每個組件的這些數字與特徵值成比例。在我們的玩具實例的情況下,我們得到這些如果打印的explained_variance_ratio_屬性:

[ 0.99244289 0.00755711] 

這意味着,第一主成分的本徵值的所述第二主成分的本徵值的比是0.99244289:0.00755711

如果對PCA基本數學的理解是清楚的,那麼獲得特徵向量和特徵值的更好方法是使用numpy.linalg.eig來獲得中心協方差矩陣的特徵值和特徵向量。如果您的數據矩陣的P×n矩陣,X(p個特徵,n個點),那麼你可以使用下面的代碼:

import numpy as np 
centered_matrix = X - X.mean(axis=1)[:, np.newaxis] 
cov = np.dot(centered_matrix, centered_matrix.T) 
eigvals, eigvecs = np.linalg.eig(cov) 

來到你的第二個問題。這些EigenValues和EigenVectors不能用於分類。對於分類,您需要每個數據點的特徵。您生成的這些特徵向量和特徵值來自整個協方差矩陣,XX T。爲了降低維數,您可以使用原始點(在p維空間中)作爲PCA結果獲得的主要成分的投影。但是,這也不總是有用,因爲PCA沒有考慮到培訓數據的標籤。我建議你看看LDA的監督問題。

希望有所幫助。

+0

很好的解釋。你知道,在LDA的情況下,如果lda.coef_存儲特徵向量? – sera

相關問題