人工智慧(2)- 學習主成成分分析(PCA)進行降維
一.為什麼要進行降維?
在進行分類的時候我們需要大量的特徵來提高分類器的準確度,但是分類器的效能隨著隨著維度的增加,逐步上升,達到某點其效能便逐漸下降。
為了避免效能下降的情況,我們要進行降低維度的處理。
資料的特徵分量之間往往存在一些關聯,如一個網站的訪問量和網站的使用者之間有一定的關聯,一個淘寶店的下單數和成交數有一定關聯。我們通過將兩個有相關關係的特徵進行篩選,刪除一些,來降低機器學習演算法的複雜度。
但是我們刪除那些資訊損失最小?如何度量丟失的資訊?
二.降維原理、PCA演算法
1.規範化d維的資料集
2.構建協方差矩陣:
數學解釋:一個欄位的方差可看作,每個元素與欄位均值的差的平方和的均值,我們將欄位均值化為零,問題被形式化表述為:尋找一個基,使得所有資料變換為這個基上的座標後,方差值最大,來表示降維後資料分散。
對於更高位,我們在完成了第一個投影方向的選擇後,還要選擇第二個投影方向,為了表示更多的原始資訊,我們希望他們之間不存在(線性)相關性。數學上用協方差表示相關性,我們設定欄位均值為零
協方差為零時,兩個欄位完全獨立
我們得到了降維問題的優化目標:將一組N維向量降為K維(K大於0,小於N),其目標是選擇K個單位(模為1)正交基,使得原始資料變換到這組基上後,各欄位兩兩間協方差為0,而欄位的方差則儘可能大(在正交的約束下,取最大的K個方差)。
假設我們只有a和b兩個欄位,那麼我們將它們按行組成矩陣X:
然後我們用X乘以X的轉置,並乘上係數1/m:
這個矩陣對角線上的兩個元素分別是兩個欄位的方差,而其它元素是a和b的協方差。兩者被統一到了一個矩陣的。
設我們有m個n維資料記錄,將其按列排成n乘m的矩陣X,設C=1mXXT,則C是一個對稱矩陣,其對角線分別個各個欄位的方差,而第i行j列和j行i列元素相同,表示i和j兩個欄位的協方差。
設原始資料矩陣X對應的協方差矩陣為C,而P是一組基按行組成的矩陣,設Y=PX,則Y為X對P做基變換後的資料。設Y的協方差矩陣為D,我們推導一下D與C的關係:
優化目標變成了尋找一個矩陣P,滿足PCPT是一個對角矩陣,並且對角元素按從大到小依次排列,那麼P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維並滿足上述優化條件。
協方差矩陣C是一個是對稱矩陣,線上性代數上,實對稱矩陣有一系列非常好的性質:
1)實對稱矩陣不同特徵值對應的特徵向量必然正交。
2)設特徵向量λ
重數為r,則必然存在r個線性無關的特徵向量對應於λ
,因此可以將這r個特徵向量單位正交化。
由上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特徵向量,設這n個特徵向量為e1,e2,⋯,en
,我們將其按列組成矩陣:
則對協方差矩陣C有如下結論:
其中Λ
為對角矩陣,其對角元素為各特徵向量對應的特徵值(可能有重複)。
以上結論不再給出嚴格的數學證明,對證明感興趣的朋友可以參考線性代數書籍關於“實對稱矩陣對角化”的內容。
到這裡,我們發現我們已經找到了需要的矩陣P:
P是協方差矩陣的特徵向量單位化後按行排列出的矩陣,其中每一行都是C的一個特徵向量。如果設P按照Λ
中特徵值的從大到小,將特徵向量從上到下排列,則用P的前K行組成的矩陣乘以原始資料矩陣X,就得到了我們需要的降維後的資料矩陣Y。
三.用scikit-learn實現PCA
import matplotlib.pyplot as plt
#from mpl_toolkits.mplot3d import Axes3D
from sklearn.datasets.samples_generator import make_blobs
# X為樣本特徵,Y為樣本簇類別, 共1000個樣本,每個樣本3個特徵,共4個簇
X, y = make_blobs(n_samples=1000, n_features=3, centers=[ [0,0,0], [1,1,1], [2,2,2],[3,3, 3]], cluster_std=[0.1, 0.1, 0.2, 0.2],
random_state =9)
from sklearn.decomposition import PCA
#PCA處理後,現在三維的情況下,對資料進行投影,觀察三個維度的方差分佈。
pca = PCA(n_components=3)
pca.fit(X)
print (pca.explained_variance_ratio_)
print (pca.explained_variance_)
#PCA降維到二維,再觀察特徵維度方差和方差佔比
pca = PCA(n_components=2)
pca.fit(X)
print (pca.explained_variance_ratio_)
print (pca.explained_variance_)
#通過圖形觀察PCA轉化後的資料分佈
X_new = pca.transform(X)
plt.scatter(X_new[:, 0], X_new[:, 1],marker='o')
plt.show()
實驗步驟:
1.使用make_blobs聚類資料生成器來生成樣本,樣本數1000,樣本3個特徵,一共4個族,
樣本中心[0,0,0], [1,1,1], [2,2,2],[3,3, 3]],每個族的方差(0.1, 0.1, 0.2, 0.2)。
返回值X為生成的樣本資料集,y為樣本資料集標籤。
2.在不降維的情況下,對資料進行fit進行訓練,通過呼叫pca.explained_variance_ratio_得到
的所保留的n個成分各自的方差百分比,explained_variance得到方差,輸出結果如下
[0.98681204 0.00662991 0.00655806]
[3.7558741 0.02523388 0.02496041]
得到的結果第一個特徵佔了絕大多數的主成分比例
3.設定維度為二,進行訓練得到
[0.98681204 0.00662991]
[3.7558741 0.02523388]
結果投影到二維後選擇的是前兩個特徵,而拋棄了第三個特徵。
4.通過scatter建立圖表直觀的看下轉換後的資料分佈,輸出結果可以清晰地看出4個族群分佈。
參考資料
1.機器學習中的維數災難 https://blog.csdn.net/zbc1090549839/article/details/38929215
2.機器學習中的數學(7)——PCA的數學原理 https://blog.csdn.net/liuweiyuxiang/article/details/78853404
3.用scikit-learn學習主成分分析(PCA) https://www.cnblogs.com/pinard/p/6243025.html