1. 程式人生 > >人工智慧(2)- 學習主成成分分析(PCA)進行降維

人工智慧(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