作者:拾毅者?
出處:http://blog.csdn.net/Dream_angel_Z/article/details/50760130?
Github源碼:https://github.com/csuldw/MachineLearning/tree/master/PCA
PCA(principle component analysis) ,主成分分析,主要是用來降低數據集的維度,然后挑選出主要的特征。原理簡單,實現也簡單。關于原理公式的推導,本文不會涉及,你可以參考下面的參考文獻,也可以去Wikipedia,這里主要關注實現,算是鍛煉一下自己。
本來是在復習LDA的,然后就看到了PCA,就跟著下面這篇文章的步驟,把PCA用Python實現了一遍,具體的思想可以參考這篇文章,講的通俗易懂,主要是有個實例參考,值得擁有!
- JerryLead之PCA主成分分析
下面自己來簡單的清理下思路!
PCA思想
主要思想:移動坐標軸,將n維特征映射到k維上(k<n),這k維是全新的正交特征。這k維特征稱為主元,是重新構造出來的k維特征,而不是簡單地從n維特征中去除其余n-k維特征。
說到PCA難免會提到LDA(linear discriminate analysis,線性判別分析),以及FA(factor analysis,因子分析)。關于LDA,打算有時間也用代碼實現一遍,下面給出它的主要思想。
LDA思想:最大類間距離,最小類內距離。簡而言之,第一,為了實現投影后的兩個類別的距離較遠,用映射后兩個類別的均值差的絕對值來度量。第二,為了實現投影后,每個類內部數據點比較聚集,用投影后每個類別的方差來度量。
三者的描述如下
以下內容引自?Wikipedia- Linear discriminant analysis
LDA is also closely related to principal component analysis (PCA) and factor analysis in that they both look for linear combinations of variables which best explain the data.[4] LDA explicitly attempts to model the difference between the classes of data. PCA on the other hand does not take into account any difference in class, and factor analysis builds the feature combinations based on differences rather than similarities. Discriminant analysis is also different from factor analysis in that it is not an interdependence technique: a distinction between independent variables and dependent variables (also called criterion variables) must be made.
區別:PCA選擇樣本點投影具有最大方差的方向,LDA選擇分類性能最好的方向。
好了,下面來看下實現源碼!
基本步驟
基本步驟:
- 對數據進行歸一化處理(代碼中并非這么做的,而是直接減去均值)
- 計算歸一化后的數據集的協方差矩陣
- 計算協方差矩陣的特征值和特征向量
- 保留最重要的k個特征(通常k要小于n),也可以自己制定,也可以選擇一個閾值,然后通過前k個特征值之和減去后面n-k個特征值之和大于這個閾值,則選擇這個k
- 找出k個特征值對應的特征向量
- 將m * n的數據集乘以k個n維的特征向量的特征向量(n * k),得到最后降維的數據。
其實PCA的本質就是對角化協方差矩陣。有必要解釋下為什么將特征值按從大到小排序后再選。首先,要明白特征值表示的是什么?在線性代數里面我們求過無數次了,那么它具體有什么意義呢?對一個n*n的對稱矩陣進行分解,我們可以求出它的特征值和特征向量,就會產生n個n維的正交基,每個正交基會對應一個特征值。然后把矩陣投影到這N個基上,此時特征值的模就表示矩陣在該基的投影長度。特征值越大,說明矩陣在對應的特征向量上的方差越大,樣本點越離散,越容易區分,信息量也就越多。因此,特征值最大的對應的特征向量方向上所包含的信息量就越多,如果某幾個特征值很小,那么就說明在該方向的信息量非常少,我們就可以刪除小特征值對應方向的數據,只保留大特征值方向對應的數據,這樣做以后數據量減小,但有用的信息量都保留下來了。PCA就是這個原理。
源碼實現
1.首先引入numpy,由于測試中用到了pandas和matplotlib,所以這里一并加載
- 1
- 2
- 3
- 1
- 2
- 3
2.定義一個均值函數
- 1
- 2
- 3
- 1
- 2
- 3
3.編寫pca方法,具體解釋參考注釋
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
4.編寫一個加載數據集的函數
- 1
- 2
- 3
- 1
- 2
- 3
5.可視化結果
因為我將維數k指定為2,所以可以使用下面的函數將其繪制出來:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
6.測試方法
測試方法寫入main函數中,然后直接執行main方法即可:
data.txt可到github中下載:data.txt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
結果展示
最后的結果圖如下:

藍色部分為重構后的原始數據,紅色則是提取后的二維特征!
參考文獻
[1]?http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html?
[2]?Wikipedia- Linear discriminant analysis?
[3]?Wikipedia- Principal_component_analysis