這篇博客會以攻略形式介紹PCA在前世今生。
其實,主成分分析知識一種分析算法,他的前生:應用場景;后世:輸出結果的去向,在網上的博客都沒有詳細的提示。這里,我將從應用場景開始,介紹到得出PCA結果后,接下來的后續操作。
前世篇
我們要先從多元線性回歸開始。對圖9-3作一下多遠線性回歸
X1——總產值,X2——存儲量,X3——總消費,Y——進口總額
從最直白的講,對Y進行多元線性回歸分析,就是在X1,X2,X3前加個系數,然后總體相加的結果,越接近越好。
用R的多遠線性歸回方法分析看看:
conomy<-data.frame( x1=c(149.3, 161.2, 171.5, 175.5, 180.8, 190.7,202.1, 212.4, 226.1, 231.9, 239.0), x2=c(4.2, 4.1, 3.1, 3.1, 1.1, 2.2, 2.1, 5.6, 5.0, 5.1, 0.7), x3=c(108.1, 114.8, 123.2, 126.9, 132.1, 137.7, 146.0, 154.1, 162.3, 164.3, 167.6), y=c(15.9, 16.4, 19.0, 19.1, 18.8, 20.4, 22.7, 26.5, 28.1, 27.6, 26.3) ) lm.sol <- lm(y~x1+x2+x3, data=conomy) summary(lm.sol)
結果:
因此,通過簡單粗暴(未經刪選變量)的線性回歸分析,也可以得出結果Y=-10.12799-0.0514X1+0.58695X2+0.28685X3,
但我們發現X1沒有*(sigif,*越多越好),而且X1的系數是負數,就是說國內總產值越高,進口量卻降低,
其主要原因是三個變量存在多重共線性,矩陣的行列式接近0。
所以,就引發了一個問題,如何篩選有效變量和降維,這里就要正式介紹主成分分析算法了。
主成分分析的今生
Pearson於1901年提出,再由Hotelling(1933)加以發展的一種多變量統計方法
通過析取主成分顯出最大的個別差異,也用來削減回歸分析和聚類分析中變量的數目
可以使用樣本協方差矩陣或相關系數矩陣作為出發點進行分析
成分的保留:Kaiser主張(1960)將特征值小於1的成分放棄,只保留特征值大於1的成分
如果能用不超過3-5個成分就能解釋變異的80%,就算是成功
主成分實際研究的是變量與變量之間的關系,不管你有多少樣本,其相關矩陣只和樣本的維度有關。比如上例中,X1,X2,X3是維度,1~11是樣本數。主成分分析第一步獲取樣本的協方差陣:而且顯然cov(Xi,Xj)=cov(Xj,Xi)。
根據矩陣定理,實對角矩陣必定存在正交矩陣Q(),使得:
這里的∑即協方差矩陣。
因為我們要篩選最能表現Y的X分量,從集合意義上來說,就是找X之間差異最大的,比如要體現“人”的特點
,那么找一個黑人和一個白人的觀測值,要比找兩個白人好。而表現差異的統計量,我們在初中就接觸過,
不錯,就是方差(或標准差),接下來我們要找協方差之間差距(方差)最大的變量。
數學家又來刷存在感了:
有上式可以推到出:
這里λi就是特征值,σii就是第i個對角元素,表明特征值λ可以表示X之間的方差,即X之間的差異程度,在F1方向上的X分量最大。
好了,現在我們縷一縷思路,要找可以表示Y的最好X變量,我們現在已經找到了差距最大的兩兩X分量(λ最大),
可以把X1和X2的差距看成是在F1軸上的距離,接下來,我們要做的是把X1,X2映射(投影)到F1,F2軸上,
即用F=a1*X1+a2*X2的形式。我們驚奇的發現,a1,a2構成的向量正好就是協方差對應的特征向量!!!
順理成章的,我們求得特征向量A[a1,a2,a3,a4,a5……an],這里要說明的是,λ從大到小排列后,
A中的an是對應λ的特征向量。至此,關於X的主成分分析完成,找到了相互正交的特征向量A(矩陣定理:實對稱矩陣的特征向量兩兩正交)。
好的,我們用matalb和R分別實現。
matlab:
1,自己實現
A=[1 2 3 4 5 4 2 3 6 1 5 8 11 4 6];%自定義矩陣 [n,p]=size(A);m%取前幾個主成分
AA=cov(A)%求A的協方差矩陣
[T,lambda]=eig(AA);%T是特征向量,lambda是特征值 lambda=diag(lambda); % p*1向量 [lambda ind]=sort(lambda,'descend');%降序排列lambda T=T(:,ind); % (fliplr) %方差貢獻率; Xsum=sum(lambda); rate=lambda/Xsum; % 累計方差貢獻率和主成分數 sumrate=0; for m=1:p sumrate=sumrate+rate(m); if sumrate>0.85 break end end
結果:
2,用matlab自帶princecomp()函數計算
[coeff, score, latent2, tsquare] = princomp(A) %A—原始數據或無量綱化后的數據,每一行是樣品,每一列是變量(指標) %coeff — 是p階矩陣,每一列是主成分的系數向量,即特征值對應的標准正交向量 %score — 是p階矩陣,每個元素都是主成分的得分,第一列是第一主成分,依此類推 %latent— 特征值,按從大到小的順序排列的列向量 %tsquare — T統計量
結果:和我自己的T計算一致(后面三個系數不同是由於累積貢獻率不同所致),score就是用主成分反表示X,latent2是特征值,tsquare是檢驗函數,沒什么用。
這里補充說明:pcacov()函數.
在Matlab軟件中,進行主成分分析的命令有兩個,一個是直接對協方差矩陣進行計算,另一個是對無量綱化以后的數據矩陣進行計算.
[pc, latent, explained] = pcacov(X)
X—(原始數據或無量綱化后的數據)的協方差矩陣
pc — 每一列是主成分的系數向量,即特征值對應的標准正交向量
latent— 特征值,按從大到小的順序排列的列向量
explained— 每個特征值的方差貢獻率
[coeff, score, latent, tsquare] = princomp(X)
X—原始數據或無量綱化后的數據,每一行是樣品,每一列是變量(指標)
coeff — 是p階矩陣,每一列是主成分的系數向量,即特征值對應的標准正交向量
score — 是p階矩陣,每個元素都是主成分的得分,第一列是第一主成分,依此類推
latent— 特征值,按從大到小的順序排列的列向量
tsquare — T統計量
這兩個函數就是輸入值不一樣,其實可以明顯發現:pcacov(cov(A))=princomp(A)%cov()為求A的協方差函數
R語言:
這里繼續前文的法國經濟數據做研究。
conomy
conomy.pr<-princomp(~x1+x2+x3, data=conomy, cor=T)//建立模型
summary(conomy.pr, loadings=TRUE)//觀察
結果:staandard deviation表示標准擦,即aqrt(λ),proportion of variance表示主成分貢獻率,Cumulative Proportion是累積貢獻率。
而loadings是用主成分反表示X變量的系數,也可叫載重,在matlab中是score。我的理解就是新的主成分變量占原來變量的比重。
主成分分析后世
介紹完主成分分析,其實並沒有結束,還有最后一步,用新得到的主成分去建立多遠線性回歸(降維后)。
pre<-predict(conomy.pr) conomy$z1<-pre[,1]; conomy$z2<-pre[,2] lm.sol<-lm(y~z1+z2, data=conomy) summary(lm.sol)
來解釋一下Z1和Z2:
根據Z1計算的結果:
x1平均值 | 194.59 | 3.3 | 139.73 |
sd標准差 | 29.9999 | 1.6492 | 20.6344 |
再乘以主成分1的系數,正好就是-0.706*(149.3-194.59)/29.999-0.707*(108.1-139.73)/20.644=2.229.
依次類推,得到原響應變量和主成分的關系。
還有一步,可以進行,也可以不進行,就是通過主成分為媒介,建立yuan因變量和原自變量的關系(連乘系數即可,變回原坐標)
最后補充兩個主成分分析圖:
這叫碎石圖(好逗逼的名字),橫軸是主成分的個數,縱軸是特征值。有條虛線是隨機數模擬計算出的特征值。此圖用來確定主成分個數,特征值大於1的保留,最大拐點之上的保留。
這是bi圖(名字忘了),是研究一對主成分對某個樣本的關系,箭頭長短代表着主成分矩陣系數的大小(我覺得沒什么卵用)
ps:以上數據和公式摘自薛毅《機器學習》一書,部分圖像代碼參考煉數成金課程ppt。