机器学习:matlab和python实现PCA降维算法
概述
降維是機(jī)器學(xué)習(xí)中十分重要的一種思想。在機(jī)器學(xué)習(xí)中,我們會(huì)經(jīng)常處理一些高維數(shù)據(jù),而高維數(shù)據(jù)情形下,會(huì)出現(xiàn)距離計(jì)算困難,數(shù)據(jù)樣本稀疏等問(wèn)題。這類(lèi)問(wèn)題是所有機(jī)器學(xué)習(xí)方法共同面臨的問(wèn)題,我們也稱(chēng)之為“維度災(zāi)難”。在高維特征中,也容易出現(xiàn)特征之間存在線(xiàn)性相關(guān),也就是說(shuō)有的特征是冗余的,因此降維也是必要的。
降維的優(yōu)點(diǎn)(必要性):
降維的方法有很多,主要分為兩大類(lèi):
線(xiàn)性降維:PCA,LDA,SVD等
非線(xiàn)性降維:核方法(核+線(xiàn)性),二維化和張量化(二維+線(xiàn)性),流形學(xué)習(xí)(ISOMap,LLE,LPP)等
下面我們主要學(xué)習(xí)一下PCA降維算法。
1. 什么是降維?
降維,簡(jiǎn)單來(lái)說(shuō)就是盡量保證數(shù)據(jù)本質(zhì)的前提下將數(shù)據(jù)維數(shù)降低。降維可以理解為一種映射關(guān)系,例如函數(shù)z = f(x,y),可以二維轉(zhuǎn)為一維。
2.什么是PCA?
PCA:principal component analysis,主成分分析,
是一種廣泛用于數(shù)據(jù)壓縮的算法(常用的降維技術(shù))。PCA的思想是將n維特征映射到k維,這k維特征是全新的正交特征。這k維特征稱(chēng)為主元,是重新構(gòu)造出來(lái)的特征。在PCA中,數(shù)據(jù)從原來(lái)的坐標(biāo)系轉(zhuǎn)換到新的坐標(biāo)系下,新的坐標(biāo)系的選擇與數(shù)據(jù)本身決定。其中,第一個(gè)新坐標(biāo)軸選擇的是原始數(shù)據(jù)中方差最大的方向,第二個(gè)新坐標(biāo)軸選取的是與第一個(gè)坐標(biāo)軸正交且具有最大方差的方向,依次類(lèi)推,我們可以取到這樣的k個(gè)坐標(biāo)軸,從而構(gòu)造出k個(gè)特征。
3.PCA的操作步驟
(1)去平均值,即每一維特征減去各自的平均值 (2)計(jì)算協(xié)方差矩陣 (3)計(jì)算協(xié)方差矩陣的特征值與特征向量 (4)對(duì)特征值從大到小排序 (5)保留最大的k個(gè)特征向量 (6)將數(shù)據(jù)轉(zhuǎn)換到k個(gè)特征向量構(gòu)建的新空間中具體實(shí)例:
(我們先用矩陣?yán)鱩atlab工具做)
我們現(xiàn)在有二維數(shù)組:dataSet,10行2列
這個(gè)數(shù)據(jù)我們可以自己做,手動(dòng)輸入到txt文檔里就可以了。
10行2列的數(shù)據(jù),求每一維(每一列的數(shù)據(jù)均值):dataSetMean,1行2列
然后,原始數(shù)據(jù)每一維上的數(shù)據(jù)減去各自的均值得到dataSetAdjust,10行2列
計(jì)算dataSetAdjust的協(xié)方差矩陣(怎么計(jì)算一個(gè)矩陣的協(xié)方差矩陣?請(qǐng)點(diǎn)這里),得到dataCov,2行2列
求協(xié)方差矩陣的特征值和特征向量(怎么計(jì)算特征值和特征向量?清點(diǎn)這里):
特征值:D
特征向量:V
接著,對(duì)特征值進(jìn)行排序,2維降1維,顯然1.4214>0.1120
我們選擇第二個(gè)特征值對(duì)應(yīng)的特征向量:V_
轉(zhuǎn)換到新的空間得到降維后的數(shù)據(jù):FinalData,10行1列
dataSetAdjust * V_ ,
這樣,我們就完成了,將10 × 2降維到10 × 1(2維降到1維)。
pca_SampleData_matlab.m
PCA.m
function [ FinalData,reconData ] = PCA( dataSet, k )[m,n] = size(dataSet);%% 去除平均值%取平均值dataSetMean = mean(dataSet);%減去平均值dataSetAdjust = zeros(m,n);for i = 1 : mdataSetAdjust(i , :) = dataSet(i , :) - dataSetMean;end%% 計(jì)算協(xié)方差矩陣dataCov = cov(dataSetAdjust);%% 計(jì)算協(xié)方差矩陣的特征值與特征向量[V, D] = eig(dataCov);% 將特征值矩陣轉(zhuǎn)換成向量d = zeros(1, n);for i = 1:nd(1,i) = D(i,i);end%% 對(duì)特征值排序[maxD, index] = sort(d);%% 選取前k個(gè)最大的特征值% maxD_k = maxD(1, (n-k+1):n);index_k = index(1, (n-k+1):n);% 對(duì)應(yīng)的特征向量V_k = zeros(n,k);for i = 1:kV_k(:,i) = V(:,index_k(1,i));end%% 轉(zhuǎn)換到新的空間FinalData = dataSetAdjust*V_k;% 在原圖中找到這些點(diǎn), 數(shù)據(jù)還原reconData = FinalData * V_k';for i = 1 : mreconData(i , :) = reconData(i , :) + dataSetMean;end end(我們用python做)
python3代碼實(shí)現(xiàn):
我們依次查看運(yùn)行過(guò)程求解得到的變量:
原始數(shù)據(jù)(待降維的數(shù)據(jù)集),XMat:
每列特征均值:average:
原始數(shù)據(jù)集每一維特征減去均值average,得到data_adjust:
計(jì)算data_adjust矩陣的協(xié)方差矩陣,得到covX矩陣:
計(jì)算協(xié)方差矩陣的特征值和特征向量:
特征值,feaValue:
特征向量,feaVec:
對(duì)特征值進(jìn)行排序,從大到小,選取前k個(gè)特征值對(duì)應(yīng)的特征向量,我們的例子是二維降一維,只需要選最大的特征值對(duì)應(yīng)的特征向量(selectVec)即可,很顯然是上述矩陣的第二列。
轉(zhuǎn)換到新空間:
finalData = data_adjust * selectVec.T
python直接調(diào)用PCA模塊實(shí)現(xiàn):
run result:
這樣太方便了,感覺(jué)走上了人生巔峰!!!(我們最好在明白原理,計(jì)算步驟的情況下使用,莫要成為一名調(diào)包俠啦,哈哈)
注:發(fā)現(xiàn)一個(gè)問(wèn)題,matlab降維和python降維結(jié)果不相同啊!它們的結(jié)果相差一個(gè)負(fù)號(hào)
這個(gè)并不影響后面的計(jì)算。
實(shí)際上,都是對(duì)的,為什么這么說(shuō)呢?
仔細(xì)閱讀你會(huì)發(fā)現(xiàn),matlab和python在計(jì)算特征向量的過(guò)程中出現(xiàn)了差異,也就是出現(xiàn)了正負(fù)號(hào)的問(wèn)題,第二個(gè)特征向量用matlab和python計(jì)算時(shí),正負(fù)號(hào)不同啦。
出現(xiàn)的原因是什么呢?如果你學(xué)過(guò)線(xiàn)性代數(shù),你會(huì)知道,一個(gè)矩陣A對(duì)應(yīng)的特征值是不變的,特征值對(duì)應(yīng)著特征向量,這個(gè)向量是一個(gè)通解(參數(shù)取值不同,會(huì)改變),k*p + C, 其中k和C是常數(shù),而p是特征值對(duì)應(yīng)的基礎(chǔ)解系。因此,在matlab和python中出現(xiàn)正負(fù)號(hào)的原因,是常數(shù)的取值不同,比如說(shuō),matlab中,k默認(rèn)取+1,C取0,而python中k默認(rèn)取-1,C取0。因此,最終的結(jié)果,是正負(fù)號(hào)不同。
我們也可以這樣理解,n維特征映射到k維,映射的方向不同(投影的方向),則出現(xiàn)結(jié)果符號(hào)(正負(fù)號(hào))的差異。
如果你不是很懂,可以看我的關(guān)于求解矩陣特征值和特征向量的文章(請(qǐng)點(diǎn)這里)。
以上,是我們的個(gè)人理解,僅做參考,新手上路,勿噴啊,有錯(cuò)的的地方,請(qǐng)指正。
總結(jié):PCA技術(shù)的一個(gè)很大的優(yōu)點(diǎn)是,它是完全無(wú)參數(shù)限制的。在PCA的計(jì)算過(guò)程中完全不需要人為的設(shè)定參數(shù)或是根據(jù)任何經(jīng)驗(yàn)?zāi)P蛯?duì)計(jì)算進(jìn)行干預(yù),最后的結(jié)果只與數(shù)據(jù)相關(guān),與用戶(hù)是獨(dú)立的。
但是,這一點(diǎn)同時(shí)也可以看作是缺點(diǎn)。如果用戶(hù)對(duì)觀測(cè)對(duì)象有一定的先驗(yàn)知識(shí),掌握了數(shù)據(jù)的一些特征,卻無(wú)法通過(guò)參數(shù)化等方法對(duì)處理過(guò)程進(jìn)行干預(yù),可能會(huì)得不到預(yù)期的效果,效率也不高。
如果后期有空,源代碼放github上,供需要的人免費(fèi)使用,喜歡的給我點(diǎn)個(gè)star,謝謝。
參考和引用:
https://www.cnblogs.com/guoyaohua/p/8855636.html
https://www.cnblogs.com/jiangxinyang/p/9291741.html
https://www.cnblogs.com/zy230530/p/7074215.html
https://blog.csdn.net/google19890102/article/details/27969459
僅用來(lái)個(gè)人學(xué)習(xí)和分享,如若侵權(quán),留言立刪。
尊重他人知識(shí)產(chǎn)權(quán),不做拿來(lái)主義者!
喜歡的可以關(guān)注我哦QAQ,
你的關(guān)注和喜歡就是我write博文的動(dòng)力。
總結(jié)
以上是生活随笔為你收集整理的机器学习:matlab和python实现PCA降维算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 矩阵分析与应用(二)————梯度分析与最
- 下一篇: html 引入wav,如何通过javas