PCA是壹種無監督學習方法,也是壹種非常常見的降維方法。在數據信息損失最小的情況下,數據的特征數從n變為k(k
這裏,使用二維數據來說明PCA,選擇二維數據是因為它更容易繪圖。
這是數據:
畫壹張圖看看分布情況:
協方差定義為:
假設n是數據的特征數,那麽協方差矩陣m是n的矩陣,其中Mij是第I個和第J個特征的協方差,對角線是每個特征的方差。
在我們的數據中,n=2,所以協方差矩陣是2 ^ 2。
通過numpy,我們可以輕松獲得:
cov的結果是:
數組(【【0.6165556,0.6154444】),
[ 0.61544444, 0.71655556]])
因為我們以前做過標準化,對我們來說,
這個矩陣是data*data的轉置矩陣。
得到結果:
矩陣(【【5.549,5.539】,
[ 5.539, 6.449]])
我們發現協方差矩陣與散度矩陣密切相關,散度矩陣是協方差矩陣乘以(總數據-1)。所以它們的特征值和特征向量是相同的。值得註意的是,散度矩陣是SVD奇異值分解的壹個步驟,因此PCA和SVD密切相關,這裏不詳細討論它們的關系,但後面會寫下來。
用numpy計算特征根和特征向量非常簡單。
但它們所代表的意義非常有趣。讓我們將特征向量添加到原始圖表中:
其中紅線是特征向量。有幾點值得註意:
藍色三角形是坐標變換後得到的新點。事實上,它是通過將紅色原點投影到紅線和藍線上形成的。
在得到特征值和特征向量後,我們可以根據特征值的大小從大到小選擇k個特征值對應的特征向量。
python中的這種實現也非常簡單:
只需從eig_pairs中選擇前k個特征向量。這裏,我們只有兩個特征向量,選擇最大的壹個。
將原始數據乘以由濾波後的特征向量組成的特征矩陣後,可以獲得新的數據。
輸出:
數據變成了壹維數據。
最後,我們畫壹張圖來了解當數據通過PCA時會發生什麽。
綠色五角星是PCA處理後得到的壹維數據。為了與前面的圖像進行比較,它們的高度定位為1.2,這實際上是紅點投影到藍線上後形成的點。這就是PCA,通過選擇特征根向量形成壹個新的坐標系,然後將數據投影到這個新的坐標系中,在盡可能少丟失信息的基礎上降維。
通過上述步驟,我們簡單地實現了對PCA的第壹個2維數據的處理,但這是原理,我們可以根據它輕松地實現多維數據。
將sklearn的pca與我們的PCA進行比較:
得到結果:
試試我們的pca。
得到結果:
壹模壹樣,完美~
值得壹提的是,sklearn中PCA的實現使用了壹些SVD結果,果然,它們有很多因果報應。