機器學習之PCA算法

PCA 是 Principal Component Analysis 的縮寫,中文稱爲主成分分析法。它是一種維數約減(Dimensionality Reduction)算法,即把高維度數據在損失最小的情況下轉換爲低維度數據的算法。顯然,PCA 可以用來對數據進行壓縮,可以在可控的失真範圍內提高運算速度,提高機器學習的效率,使較爲複雜的數據簡單化。

所謂損失最小就是從高維向低維映射的時候誤差最小,低位空間的描述是向量組,k維空間就用k個向量來描述這個空間。

假設有一個數據集,用 m×n 維的矩陣 A 表示。矩陣中每一行表示一個樣本,每一列表示一個特徵,總共有 m 個樣本,每個樣本有 n 個特徵。我們的目標是減少特徵個數,只保留最重要的 k 個特徵。

爲了簡化計算,採取數據歸一化和縮放,歸一化是使樣本的均值爲0,縮放是爲了把所有的值都控制在-1到1的區間內

 

X是歸一化和縮放後的數據,a是原數據,u是數據的均值,s是極差

 

sigma表示協方差矩陣,由X矩陣及其轉置矩陣相乘再除以矩陣X的行數

n*m的矩陣乘以m*n的矩陣結果是一個n*n的矩陣

接着通過奇異值分解來計算協方差矩陣的特徵向量(eigenvectors):

svd是奇異值運算,這個東西我也不太懂,上網查一查去

好吧,還是看不太懂,等我懂了再來更新

通過上面這個就可以算出特徵矩陣

然後對特徵矩陣進行降維處理,下面的這個公式Z是降維之後得到的矩陣,U是從上面奇異值分解得來的,但是隻取前k個向量作爲Ureduce,之前的U向量是n*n,現在變爲n*k,X是數據歸一化和縮放後的數據矩陣m*n

此時z的大小是m*k實現了降維,因爲k一定是小於n的

另外矩陣既然有降維也就會有還原,下面是還原的公式,只是上面公式的變形

下面是python代碼實現PCA算法,主要用到numpy和scikit-learn

import numpy as np
A = np.array([[3,2000],
             [2,3000],
             [4,5000],
             [5,8000],
             [1,2000]],dtype='float')
mean = np.mean(A,axis=0)
norm = A - mean//數據歸一化
scope = np.max(norm,axis=0) - np.min(norm,axis=0)//極差
norm = norm / scope//縮放
norm
U, S, V = np.linalg.svd(np.dot(norm.T,norm))//奇異值分解
U
U_reduce = U[:,0].reshape(2,1)//Ureduce矩陣
U_reduce
R = np.dot(norm,U_reduce)//降維計算
R
Z = np.dot(R,U_reduce.T)//還原
Z
np.multiply(Z,scope) + mean//縮放和歸一化的逆預算
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
def std_PCA(**argv):
    scaler = MinMaxScaler()//數據預處理
    pca = PCA(**argv)//PCA算法
    pipeline = Pipeline([('scaler',scaler),
                        ('pca',pca)])//用管道鏈接
    return pipeline

pca = std_PCA(n_components=1)
R2 = pca.fit_transform(A)
R2
pca.inverse_transform(R2)

數據還原率

Xapprox爲還原後的數據,所謂的數據還原只不過是將已經降維的座標還原到原來的座標系中,不可避免的會產生誤差,

所以我們需要指標來衡量這一誤差是否在我們能接受的範圍內

在尋找最有的k時,k是Ureduce的n*k階矩陣,k從1開始不斷增長,所以是一個迭代的過程,需要多次條用PCA,效率低下

實際計算時會選用下面的公式

 

只需要一次調用就可以解決問題

發佈了43 篇原創文章 · 獲贊 10 · 訪問量 5174
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章