機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之主成分分析(PCA)

如果人類適應(yīng)了三維,去掉一個(gè)維度,進(jìn)入了二維世界,那么人類就會(huì)因?yàn)槿鄙倭嗽瓉?lái)所適應(yīng)的一個(gè)維度,而無(wú)法生存。 ——《三體》

在許多科幻電影中,有許多降維的例子。在《十萬(wàn)個(gè)冷笑話2》(可能只有萌新看過(guò))中,大boss將主角降維到二維,就成了紙片人,進(jìn)而失去了戰(zhàn)斗能力;降維到一維,就變成了線條,這就是降維打擊。

說(shuō)直白點(diǎn),降維就是將維度降低。在機(jī)器學(xué)習(xí)中,降維常常用來(lái)做數(shù)據(jù)的預(yù)處理。為什么要對(duì)數(shù)據(jù)進(jìn)行降維了?那來(lái)從數(shù)據(jù)本身說(shuō)起。

  • 大數(shù)據(jù)時(shí)代,數(shù)據(jù)冗余,維度高。例如個(gè)人用戶信息,存儲(chǔ)了身份證,同時(shí)也存儲(chǔ)了生日,就造成了冗余。
  • 數(shù)據(jù)維度有相關(guān)性。例如,人臉頭像具有對(duì)稱性,去掉一般的像素點(diǎn)也是沒(méi)有太大問(wèn)題的。
  • 數(shù)據(jù)有噪聲。噪聲對(duì)學(xué)習(xí)會(huì)產(chǎn)生干擾,去掉噪聲可以提高算法的精度。

那如何進(jìn)行降維了?難道要隨機(jī)去掉一些維度嗎?答案是否定的。直接去掉維度會(huì)導(dǎo)致數(shù)據(jù)信息的大量確實(shí)。主成分分析(PCA)技術(shù)可以盡量保證數(shù)據(jù)信息少量減小的情況下,進(jìn)行維度的縮減。

PCA原理

首先看下圖,這是一個(gè)二維數(shù)據(jù),有三個(gè)類別(不同顏色表示)。我們希望將其降到一維,那是按u1方向投影還是按u2方向呢。明顯可以看出,u1比u2好。

推導(dǎo)

為什么說(shuō)u1比u2好呢?我們可以基于兩點(diǎn)進(jìn)行解釋。

  • 樣本點(diǎn)到這個(gè)直線的距離足夠近。
  • 樣本點(diǎn)在這個(gè)直線上的投影能盡可能的分開(kāi)。

基于這兩個(gè)原則,進(jìn)行公式推導(dǎo)(這里進(jìn)行省略),可以得到下面公式。XXT為樣本的協(xié)方差矩陣。

流程

根據(jù)公式可以得到PCA的流程:

  • 去除平均值
  • 計(jì)算協(xié)方差矩陣
  • 計(jì)算協(xié)方差矩陣的特征值和特征向量
  • 特征值從大到小排序
  • 保留最上面的N個(gè)特征向量
  • 將數(shù)據(jù)轉(zhuǎn)換到N個(gè)特征向量構(gòu)建的新空間

PCA代碼

數(shù)據(jù)情況

首先編寫代碼讀入數(shù)據(jù),可以看出其為二維數(shù)據(jù)。

from numpy import *

def loadDataSet(filename):
    dataMat = []
    fr = open(filename)
    for line in fr.readlines():
        curLine = line.strip().split('\t')
        fltLine = list(map(float,curLine))
        dataMat.append(fltLine)
    return mat(dataMat)
算法代碼

通過(guò)上述的算法流程,對(duì)代碼進(jìn)行編寫,最后可視化降維后的結(jié)果。

def pca(dataMat, topNfeat=9999999):
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals
    covMat = cov(meanRemoved, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat))
    eigValInd = argsort(eigVals)
    eigValInd = eigValInd[:-(topNfeat+1):-1]
    redEigVects = eigVects[:,eigValInd]
    lowDataMat = meanRemoved * redEigVects
    reconMat = (lowDataMat * redEigVects.T) + meanVals
    return lowDataMat, reconMat

算法優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):降低數(shù)據(jù)復(fù)雜度
  • 缺點(diǎn):有可能損失有用信息

我的博客即將搬運(yùn)同步至騰訊云+社區(qū),邀請(qǐng)大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=25flb1mm7rtws

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容