2017-02-10 208 views
0

因此,我目前正在研究一個涉及主要組件分析或PCA的項目,並且我試圖在飛行中學習它。幸運的是,Python有一個非常方便的scikitlearn.decomposition模塊,它似乎爲您完成了大部分工作。在我真正開始使用它之前,我試圖弄清楚它到底在做什麼。瞭解Python中的scikitlearn PCA.transform函數

我一直在測試看起來像這樣的數據幀:

0 1 
0 1 2 
1 3 1 
2 4 6 
3 5 3 

當我打電話PCA.fit(),然後查看組件我得到:

array([[ 0.5172843 , 0.85581362], 
    [ 0.85581362, -0.5172843 ]]) 

從我相當有限的PCA知識,我有點理解這是如何計算的,但我迷失方向的是當我打電話給PCA.transform時。這是輸出它給我:

array([[-2.0197033 , -1.40829634], 
     [-1.84094831, 0.8206152 ], 
     [ 2.95540408, -0.9099927 ], 
     [ 0.90524753, 1.49767383]]) 

可能有人可能走我走過它是如何將原有的數據幀和組件,並將其轉換到這個新陣?我希望能夠理解它正在進行的確切計算,以便當我擴大規模時,我會更好地瞭解發生了什麼。謝謝!

回答

3

當您調用fit時,PCA將計算一些向量,您可以將數據投影到數據上以減少數據的維數。由於數據的每一行都是二維的,因此最多可以有兩個向量投影到其上,並且每個向量都是二維的。 PCA.components_的每一行都是一個單獨的向量,事物將被投影到該向量上,並且其大小與訓練數據中的列數相同。既然你做了一個完整的PCA,你會得到2個這樣的向量,所以你得到了一個2x2矩陣。第一個向量將使投影數據的方差最大化。第二次將最大化第一次投影后留下的變化。通常,傳遞的值爲n_components,小於輸入數據的維數,以便返回更少的行,並且您有一個寬但不高的components_數組。

當你打電話給transform你要求sklearn實際做投影。也就是說,您要求它將每行數據投影到調用fit時學到的向量空間中。對於傳遞給transform的每行數據,輸出中將有1行,該行中的列數將是在fit階段中學習的向量數。換句話說,列的數量將等於您傳遞給構造函數的值n_components

通常一個採用PCA當源數據有很多列,並且要減少列的數量,同時保留儘可能多的信息成爲可能。假設您的數據集有100行,每行有500列。如果您構建的PCA類似於PCA(n_components = 10),然後又稱爲fit,您會發現components_有10行,每個組件需要一個,而500列是輸入維度。如果您隨後調用transform,則所有100行數據都將投影到此10維空間中,因此輸出將有100行(每個輸入中有1行),但只有10列,因此減少了數據的維數。

簡短的回答如何做到這一點的是,PCA計算奇異值分解,然後只保留其中的一些矩陣之一的列。 Wikipedia有更多關於實際線性代數的信息 - 對於StackOverflow答案有點長。

+0

奇妙的是,這對了解實際發生的事情有很大的幫助。我一定會看看維基百科,看看有什麼關於PCA的。謝謝! – JSolomonCulp