如果人類適應(yīng)了三維,去掉一個維度驶社,進(jìn)入了二維世界奔脐,那么人類就會因為缺少了原來所適應(yīng)的一個維度,而無法生存星澳。 ——《三體》
在許多科幻電影中疚顷,有許多降維的例子。在《十萬個冷笑話2》(可能只有萌新看過)中禁偎,大boss將主角降維到二維腿堤,就成了紙片人,進(jìn)而失去了戰(zhàn)斗能力如暖;降維到一維笆檀,就變成了線條,這就是降維打擊装处。
說直白點误债,降維就是將維度降低浸船。在機(jī)器學(xué)習(xí)中妄迁,降維常常用來做數(shù)據(jù)的預(yù)處理。為什么要對數(shù)據(jù)進(jìn)行降維了李命?那來從數(shù)據(jù)本身說起登淘。
- 大數(shù)據(jù)時代,數(shù)據(jù)冗余封字,維度高黔州。例如個人用戶信息耍鬓,存儲了身份證,同時也存儲了生日流妻,就造成了冗余牲蜀。
- 數(shù)據(jù)維度有相關(guān)性。例如绅这,人臉頭像具有對稱性涣达,去掉一般的像素點也是沒有太大問題的。
- 數(shù)據(jù)有噪聲证薇。噪聲對學(xué)習(xí)會產(chǎn)生干擾度苔,去掉噪聲可以提高算法的精度。
那如何進(jìn)行降維了浑度?難道要隨機(jī)去掉一些維度嗎寇窑?答案是否定的。直接去掉維度會導(dǎo)致數(shù)據(jù)信息的大量確實箩张。主成分分析(PCA)技術(shù)可以盡量保證數(shù)據(jù)信息少量減小的情況下甩骏,進(jìn)行維度的縮減。
PCA原理
首先看下圖先慷,這是一個二維數(shù)據(jù)横漏,有三個類別(不同顏色表示)。我們希望將其降到一維熟掂,那是按u1方向投影還是按u2方向呢缎浇。明顯可以看出,u1比u2好赴肚。
推導(dǎo)
為什么說u1比u2好呢素跺?我們可以基于兩點進(jìn)行解釋。
- 樣本點到這個直線的距離足夠近誉券。
- 樣本點在這個直線上的投影能盡可能的分開指厌。
基于這兩個原則,進(jìn)行公式推導(dǎo)(這里進(jìn)行省略)踊跟,可以得到下面公式踩验。XXT為樣本的協(xié)方差矩陣。
流程
根據(jù)公式可以得到PCA的流程:
- 去除平均值
- 計算協(xié)方差矩陣
- 計算協(xié)方差矩陣的特征值和特征向量
- 特征值從大到小排序
- 保留最上面的N個特征向量
- 將數(shù)據(jù)轉(zhuǎn)換到N個特征向量構(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)
算法代碼
通過上述的算法流程,對代碼進(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)缺點
- 優(yōu)點:降低數(shù)據(jù)復(fù)雜度
- 缺點:有可能損失有用信息
我的博客即將搬運(yùn)同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=25flb1mm7rtws