機器學習實戰-利用PCA來簡化數據(降維)

一 理論

       降維是對數據高維度特徵的一種預處理方法。降維是將高維度的數據保留下最重要的一些特徵,去除噪聲和不重要的特徵,從而實現提升數據處理速度的目的。在實際的生產和應用中,降維在一定的信息損失範圍內,可以爲我們節省大量的時間和成本。降維也成爲了應用非常廣泛的數據預處理方法。

  降維具有如下一些優點:

(1)使得數據集更易使用

(2)降低算法的計算開銷

(3)去除噪聲

(4)使得結果容易理解

  PCA(principal Component Analysis),即主成分分析方法,是一種使用最廣泛的數據壓縮算法。在PCA中,數據從原來的座標系轉換到新的座標系,由數據本身決定。轉換座標系時,以方差最大的方向作爲座標軸方向,因爲數據的最大方差給出了數據的最重要的信息。第一個新座標軸選擇的是原始數據中方差最大的方法,第二個新座標軸選擇的是與第一個新座標軸正交且方差次大的方向。重複該過程,重複次數爲原始數據的特徵維數。

  通過這種方式獲得的新的座標系,我們發現,大部分方差都包含在前面幾個座標軸中,後面的座標軸所含的方差幾乎爲0,。於是,我們可以忽略餘下的座標軸,只保留前面的幾個含有絕不部分方差的座標軸。事實上,這樣也就相當於只保留包含絕大部分方差的維度特徵,而忽略包含方差幾乎爲0的特徵維度,也就實現了對數據特徵的降維處理。

  那麼,我們如何得到這些包含最大差異性的主成分方向呢?事實上,通過計算數據矩陣的協方差矩陣,然後得到協方差矩陣的特徵值及特徵向量,選擇特徵值最大(也即包含方差最大)的N個特徵所對應的特徵向量組成的矩陣,我們就可以將數據矩陣轉換到新的空間當中,實現數據特徵的降維(N維)。

  既然,說到了協方差矩陣,那麼這裏就簡單說一下方差和協方差之間的關係,首先看一下均值,方差和協方差的計算公式:

                                                

 由上面的公式,我們可以得到一下兩點區別:

(1)方差的計算公式,我們知道方差的計算是針對一維特徵,即針對同一特徵不同樣本的取值來進行計算得到;而協方差則必須要求至少滿足二維特徵。可以說方差就是協方差的特殊情況。 

(2)方差和協方差的除數是n-1,這樣是爲了得到方差和協方差的無偏估計.

  PCA算法實現

  將數據轉換爲只保留前N個主成分的特徵空間的僞代碼如下所示:

去除平均值
計算協方差矩陣
計算協方差矩陣的特徵值和特徵向量
將特徵值排序
保留前N個最大的特徵值對應的特徵向量
將數據轉換到上面得到的N個特徵向量構建的新空間中(實現了特徵壓縮)

二 例子

(1)

from numpy import *
# 加載數據
def loadDataSet(filename,delim = '\t'):
    fr = open(filename)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    dataArr = [map(float,line) for line in stringArr]
    return mat(dataArr)
def pca(dataMat,topN=999999):
    # 形成樣本矩陣,樣本中心化
    meanVals= mean(dataMat,axis=0)
    meanRemoved = dataMat - meanVals
    # 計算樣本矩陣的協方差矩陣
    covMat = cov(meanRemoved,rowvar=0)
    #  對協方差矩陣進行特徵值分解,選取最大的 p 個特徵值對應的特徵向量組成投影矩陣
    eigVals,eigVects =  linalg.eig(mat(covMat))
    eigValInd = argsort(eigVals)
    eigValInd = eigValInd[:-(topN+1):-1]
    redEigVects = eigVects[:,eigValInd]
    # 對原始樣本矩陣進行投影,得到降維後的新樣本矩陣
    lowDDataMat = meanRemoved * redEigVects
    reconMat = (lowDDataMat * redEigVects.T)+meanVals
    return lowDDataMat,reconMat
import matplotlib
import matplotlib.pyplot as plt
filepath=u'E:\\2017machinelearning\\機器學習實戰代碼\\Ch13\\testSet.txt'
dataMat = loadDataSet(filepath)
lowMat,reconMat = pca(dataMat,1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()
print type(dataMat[:,0].flatten().A[0] )
print type(dataMat[:,0].tolist())
print type(dataMat[:,0])

結果:

上述降維過程,首先根據數據矩陣的協方差的特徵值和特徵向量,得到最大的N個特徵值對應的特徵向量組成的矩陣,可以稱之爲壓縮矩陣;得到了壓縮矩陣之後,將去均值的數據矩陣乘以壓縮矩陣,就實現了將原始數據特徵轉化爲新的空間特徵,進而使數據特徵得到了壓縮處理。

當然,我們也可以根據壓縮矩陣和特徵均值,反構得到原始數據矩陣,通過這樣的方式可以用於調試和驗證。

上圖是通過matplotlib將原始數據點(三角形點)和第一主成分點(圓形點)繪製出來的結果。顯然,第一主成分點佔據着數據最重要的信息。

(2)示例:PCA對半導體數據進行降維

三 總結 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章