主成分分析(PCA)

一、理論篇:

為書寫方便,加粗的字母表示向量。

如果想像力夠好,完全可以想象出兩個矩陣相乘的幾何意義:將右邊矩陣中每一列列向量變換到左邊矩陣中每一行行向量為基所表示的空間去。

比如我們常說的二維向量,


僅僅有這個條件,是不夠來表示一個向量的,還默認了兩個基向量(1,0)和(0,1),一個基向量可代表一個空間,在這里分別指x軸和y軸兩個一維空間(在一維的空間里,(1,0),可以不寫0的,直接寫(1),數(shù)軸嘛)。二維向量正式A的表示方式應該是,拆開看分別是:第一行(1,0)xA,第二行(0,1)xA(當然你也可以理解為基向量的線性組合2x(1,0)'+3x(0,1)',目前在討論變換的幾何意義,總覺得用線性組合的方式不好想象。),于是第一行可想象為空間里的一個“箭頭”A,被左乘了一下,(1,0)xA,變換到(1,0)的空間里去,變成了(2),(在x軸這個一維空間里,(1,0)或(2,3)里的0或3是沒有必要寫的),同樣的道理,第二行y軸也是。

也可以不用(1,0),(0,1)基表示,可以換成其他基,不再累贅。

總結:

1.選擇不同的基,可以對同一組數(shù)據(jù)給出不同的表示。

2.可以完全擴成一個空間的基對這一組數(shù)據(jù)的所有表示加起來,包含了這組數(shù)據(jù)的全部信息。

如果我們舍棄y軸空間,這就是降維。

當然,不能亂舍棄,降維的目的是為了舍棄那些沒有多少用的數(shù)據(jù),來保證減少數(shù)據(jù)量的同時,不降低數(shù)據(jù)的信息。

比如,

第一列和第三列線性相關,只要知道第一列,就等于知道了第三列,這個時候就可以舍棄第三行,變成

再回到幾何意義,我們可以把二維數(shù)據(jù)通過上述分析分別變換(投射)到兩個一維的基里,而基可以任意選。假設有一大串二維數(shù)據(jù)X(幾何意義就是坐標里的一系列點),我們選一個一維基,把這些點進行投射到它的空間,如果選的足夠好,這一個基就包含了大部分的數(shù)據(jù)信息,這樣,只要選這一個基來表示所有數(shù)據(jù)就好了。


總結:

3.不一定要選全部的基去表示這組數(shù)據(jù),用基表示后,信息多,就可以用,信息少,就可以舍棄。

而關鍵是,怎么選基?直觀上看有兩點:

(1)希望投影后的投影值盡可能分散,而這種分散程度,可用方差來表示。

(2)投影后,它們之間不存在線性關系,可用協(xié)方差來表示。

我們的目標就變成了:選擇一組低緯基,讓高維投在低維上,最離散、最不相關。正交時相關性為0,所以一般選正交基

拿上面的二維數(shù)據(jù)X舉例子,我們要選一組基P,令X投射到P后(這個動作用公式來表示就是Y=P.X),得到的矩陣Y的方差最大,協(xié)方差最小。而把矩陣方差和協(xié)方差聯(lián)系起來的,正好是協(xié)方差矩陣。

假設X

C=:

對角線表示方差,非對角線表示協(xié)方差。

其中方差(均值化零):

協(xié)方差(均值化零):

同樣Y也有協(xié)方差矩陣。我們要做的,就是要找到P,使得Y協(xié)方差矩陣對角線(方差)最大,非對角線為0(協(xié)方差,不相關),滿足這樣的要求,不剛好是對角矩陣嗎?于是:

這是什么?這就是求矩陣C的對角矩陣呀!!!

總結:

4.怎么選低維基?能讓這組數(shù)據(jù)的協(xié)方差矩陣相似對角化。

有了P,問題就迎刃而解了。P的前k行組成的矩陣乘以數(shù)據(jù)矩陣X,便達到了降維的目的。

最后總結一下PCA的算法步驟:

設有m條n維的數(shù)據(jù)。

1.將原始數(shù)據(jù)按列組成n行m列矩陣X

2.將X的每一行進行零均值化

3.求X的協(xié)方差矩陣C

4.求C的特征值和特征向量

5.將特征向量按對應的特征值大小從上到下排列成矩陣,取前k行組成矩陣P

6.Y=PX即是降到k維后的數(shù)據(jù)

二、實現(xiàn)篇:

原本是想用matlab,畢竟對它比較熟。后來僥幸發(fā)現(xiàn)工作中自動化用的python也有不錯的數(shù)據(jù)處理功能。電腦上沒有matlab,但有現(xiàn)成的python環(huán)境,懶的人一般都會選擇用現(xiàn)有的東西。

Python有著非常強大的科學計算庫:

numpy~~基礎計算庫,多維數(shù)組處理

scipy~~基于numpy,用于數(shù)值計算等等,默認調(diào)用intel mkl(高度優(yōu)化的數(shù)學庫)

pandas~~強大的數(shù)據(jù)框,基于numpy

matplotlib~~繪圖庫,基于numpy,scipy

sklearn~~機器學習庫,有各種機器學習算法

可以直接下載Anaconda,包含了大部分庫。


把我自己的一張圖片降維后,取前n=0,50,100,150,200,250,300,350,400行分別得到的圖片如下:

(圖片是300*400)


附上程序(程序都是自己寫的,有點亂)

import numpy as np

from PIL import Image

import os,glob

import scipy.linalg as linA

#將矩陣零均值化

def zeroMean(dataMat):

meanVal=np.mean(dataMat,axis=0)

newData=dataMat-meanVal

return newData,meanVal

#將矩陣進行PCA降維,dataMat為需要降維的矩陣,n為選取前n個最大的特征值對應的特征向量

def pca(dataMat,n):

newData,meanVal=zeroMean(dataMat)#2.將X的每一行進行零均值化

covMat=np.cov(newData,rowvar=0) #3.求X的協(xié)方差矩陣C

#4.求C的特征值和特征向量

eigVals,eigVects=np.linalg.eig(np.mat(covMat))

eigValIndice=np.argsort(eigVals)

#5.將特征向量按對應的特征值大小從上到下排列成矩陣,取前n行組成矩陣P

n_eigValIndice=eigValIndice[-1:-(n+1):-1]

n_eigVect=eigVects[:,n_eigValIndice]

#6.Y=PX即是降到k維后的數(shù)據(jù)

lowDDataMat=newData*n_eigVect

reconMat=(lowDDataMat*n_eigVect.T)+meanVal#降維后的Y再加上之前零均值化所減去的平均值

return lowDDataMat,reconMat

#讀取圖片并轉(zhuǎn)換為矩陣。1.將原始數(shù)據(jù)按列組成n行m列矩陣X

def ImageToMatrix(pictureName):

#讀取圖片

img = Image.open(pictureName)

#顯示圖片

#img.show()

width,height = img.size

img = img.convert("L")

data = img.getdata()

data = np.matrix(data,dtype='float')/255.0

#new_data = np.reshape(data,(width,height))

new_data = np.reshape(data,(height,width))

return new_data

#將矩陣轉(zhuǎn)換為圖片

def MatrixToImage(data):

data = data*255

new_img = Image.fromarray(data.astype(np.uint8))

return new_img

if __name__ == '__main__':

picture_path = os.getcwd()+'\\picture\\'

picture_save_path= picture_path+'save\\'

pictureName=picture_path+'Man.bmp'

dataMat=ImageToMatrix(pictureName)

n=0

for n in range(0,400,50):

lowDDataMat,reconMat=pca(dataMat,n)

new_img=MatrixToImage(reconMat)

#new_img.show()

new_img.save(picture_save_path+str(n)+'.bmp')

參考:

http://www.360doc.com/content/13/1124/02/9482_331688889.shtml

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375

推薦閱讀更多精彩內(nèi)容