主成分分析步骤_多元分析(1)--主成分分析
主成分分析
主成分分析(PCA)是數據降維的一種常見方法,其它常見的方法還有因子分析(FA),獨立成分分析,在進行大數據處理時,因為數據有很多特征,維數過高,不容易進行處理且不能進行可視化,所以一般要對其進行降維,我們都知道在二維平面中的兩個點能確定一條直線,在三維平面中,三個點一定能確定一個平面,二維中的直線通過旋轉變換可以轉化到一個坐標上(一位數據),三維中的平面可以通過旋轉轉化到一個坐標平面上(二維數據),所以可以說這些確定直線和平面的點直接存在一定的相關關系,且可以通過某種關系將緊密關系的數據轉化為經可能少的新變量。主成分分析就是利用這一點。PCA的主要思想是將n維特征映射到k維上,這k維是全新的正交特征也被稱為主成分,是在原有n維特征的基礎上重新構造出來的k維特征[1],那么如何才能找到這樣一組有正交特征的k維數據呢,在主成分分析技術中的思路是在原始坐標軸上順序的找相互正交的坐標軸,尋找原則是:第一個新坐標軸的方向是始數據中方差最大的方向,第二個新坐標軸選取是與第一個坐標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,可以得到n個這樣的坐標軸。通過這種方式獲得的新的坐標軸。那么如何才能得到最大差異性的主成分方向呢,就是對n維數據求協方差矩陣,在求出協方差矩陣的特征值和特征向量,選擇最大的k個特征值對應的k個特征向量組成轉移矩陣,和原始數據相乘得到新的數據。因為求特征值和忒特征向量有兩種方式,特征值分解和奇異值分解。所以可以分兩種方式進行主成分分析。
特征值分解
介紹特征值分解之前必須先知道矩陣乘法的集合意義,向量與矩陣相乘就是將向量進行旋轉和伸縮(對線性變換不太了解的可以觀看3Blue1Brown的視頻分析,里面很形象的講解了線性變換的過程),如果矩陣對某些向量只發生伸縮變換,不產生旋轉效果,那么這些向量就稱為這個矩陣的特征向量,伸縮的比例就是特征值[2]。特征分解的公式如下:
其中
是 的特征向量, 是 的特征值。特征值從大到小排列表示對應特征向量的重要性。方陣 可以進行特征分解:其中
是特征向量組成的矩陣, 表示對角矩陣,對角線上的排列的是對應的特征值。因為特征值分解只能適用 是方陣的情況。所以要引入奇異值分解。奇異值分解
奇異值分解可以分解
階的矩陣,解決了特征值分解只能分解方陣的缺陷,其分解供公式如下:其中
( 階)和 ( 階)都是正交矩陣,分別稱為 的左奇異向量矩陣和右奇異向量矩陣。 是 階矩陣。具體求法是: 是 方陣的特征向量, 是 方陣的特征向量。 是前面兩個方陣非零特征值組成的矩陣。具體求法可以看實例。主成分分析執行步驟
1.首先需要對原始數據進行處理,將原始數據進行單位化,單位化是按特征進行的求出特征的樣本方差,每個樣本再除上對應的樣本方差。樣本方差求法如下:
其中 ,這里之所以除上n-1而不是n是為了得到無偏估計。具體解釋可以參考知乎問答:樣本估計為啥是除以n-1。2.去平均值(即去中心化),即每一位特征減去各自的平均值。
3.計算協方差矩陣
注意協方差的計算,協方差的計算是按照維度來計算的,即特征,如有矩陣329*9階,一行表示一個樣本供329個樣本,每列表示一個特征,上式中,n=329,
表示特征, 表示每個特征的均值(329個數的平均值)。具體解法可參考下面的matlab代碼:
x=round(rand(10,3)*50); function Z=pca_test(x)my_mean=mean(x,1);[m,n]=size(x);Z=zeros(n,n);for i=1:nfor j=1:nZ(i,j)=sum((x(:,i)-my_mean(i)).*(x(:,j)-my_mean(j)))/(m-1); endend end %輸出的Z為協方差,這里是10*3階矩陣,所以協方差為3*3階4.計算協方差矩陣的特征值和特征向量(特征值和特征向量)
5.選取擇最大的k個特征值對應的k個特征向量組成轉移矩陣P,和原始數據X相乘得到新的數據Y。 Y=P*X。
matlab實現主成分分析
在matlab中有自帶的求解pca(主成分分析)的函數pca()[3],函數的主要輸入是經過單位化的原始數據,去中心化和計算協方差矩陣等步驟都在函數中實現,pca函數還有幾個輸入參數,但都是可選的(有默認值),如選擇計算主成分分析的方式(特征值分解或奇異值分解)等。輸出的主要有6個量:
coeff : 主成分系數 應該就是協方差矩陣的特征向量矩陣(也就是映射矩陣).完整輸出的情況下是一個p-by-p 的matrix.每一列都是一個特征向量.按對應的特征值 的大小,從大到小進行排列。
score: 進行旋轉(也就是利用映射矩陣coeff進行)后的結果i.e. score = X * coeff. n-by-p matrix這里有個坑 如果你使用pca時使用的是默認的中心化(i.e 不對'Centered'設置'false'),拿X *coeff 和score對比的時候, 記得把X中心化后再乘以coeff,之后再和score對比....;同樣如果pca使用的是默認值, 恢復的X = score * coeff' (注意轉置)是中心化后的數據。
latent: 主成分方差 也就是各特征向量對應的特征值,從大到小進行排列。
tsquared :()。
explained : 每一個主成分所貢獻的比例,可以更直觀的選擇所需要降維的維數了,不用再用特征值去求了。
mu: X 按列的均值,當前僅當 'Centered'置于'true'(默認值)時才會返回此變量。
matlab代碼
這里以matlab自帶的數據進行仿真說明[4]:
load cities %得到三個數據集 %ratings 329*9每一行表示一個樣本,每一列表示一個特征。 %單位化樣本數據 std_ratings=std(ratings);%std()函數是對ratings求樣本方差,默認是按列求,求出的結果為1*9數組 one_ratings=ratings./(std_ratings); %使用pca函數降維 [coeff,score,latent,tsquare,explained,mu]= pca(one_ratings); %計算選取前k個特征值進行降維后和原數據的準確率 rate=cumsum(latent)./sum(latent);%cumsum是累加和函數 %計算后選取前面7個特征值可獲得90%以上的準確率,將329*9的數據降維到329*7 %選取coeff特征向量的前7列。 cho=coeff(:,1:7) new_ratings=ratings*cho;原數據乘上特征向量得到降維后的數據cities:它使用了衡量美國329個城市生活質量的9個指標:氣候、住房、健康、犯罪率、交通、教育、藝術、娛樂和經濟。對于各指標,越高表示越好,如高的犯罪指標表示低的犯罪率。它由三個數據集組成,categories是9個特征的字符說明,names是每個樣本城市的字符名稱,ratings才是我們需要關注的數組。
std():std函數總共有三個輸入參數,其中有兩個可選參數[5],flag--標注求樣本方差時是除以n還是n-1,flag=0是除以n-1,flag=1是除以n,dim--表示是按列求還是按行求,dim=1是按照列分dim=2是按照行分 若是三維的矩陣,dim=3就按照第三維來分數據。默認情況下,flag=0,dim=1。
Microstrong:主成分分析(PCA)原理詳解?zhuanlan.zhihu.comCodingLabs - PCA的數學原理?blog.codinglabs.orghttps://blog.csdn.net/ckzhb/article/details/75281727?blog.csdn.nethttps://blog.csdn.net/qq_25800311/article/details/83385029?blog.csdn.net參考
總結
以上是生活随笔為你收集整理的主成分分析步骤_多元分析(1)--主成分分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python分层聚类集群合并_24、py
- 下一篇: 思科asa5515端口映射_Cisco