初識PCA數據降維


  PCA要做的事降噪和去冗余,其本質就是對角化協方差矩陣。

一.預備知識

  1.1 協方差分析

  對於一般的分布,直接代入E(X)之類的就可以計算出來了,但真給你一個具體數值的分布,要計算協方差矩陣,根據這個公式來計算,還真不容易反應過來。網上值得參考的資料也不多,這里用一個例子說明協方差矩陣是怎么計算出來的吧。

  用matlab計算這個例子

z=[1,2;3,6;4,2;5,2]
cov(z)
ans =
    2.9167   -0.3333
   -0.3333    4.0000

  可以看出,matlab計算協方差過程中還將元素統一縮小了3倍。所以,協方差的matlab計算公式為:
協方差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(樣本數-1)
       下面在給出一個4維3樣本的實例,注意4維樣本與符號X,Y就沒有關系了,X,Y表示兩維的,4維就直接套用計算公式,不用X,Y那么具有迷惑性的表達了。

 

  注釋:協方差為正時說明X和Y是正相關關系,協方差為負時X和Y是負相關關系,協方差為0時X和Y相互獨立。

  Cov(X,X)就是X的方差(Variance),Cov(X,Y)就是協方差了,從上面可以看出,協方差矩陣是方陣,維度是樣本的維度。

  1.2 協方差實現

for i=1:size(a,2) 
    for j=1:size(a,2) 
        c(i,j)=sum((a(:,i)-mean(a(:,i))).*(a(:,j)-mean(a(:,j))))/(size(a,1)-1);
    end 
end

  驗證如下:

>> a =[
    -1     1     2
    -2     3     1
     4     0     3]
a =
    -1     1     2
    -2     3     1
     4     0     3
>> cov(a)
ans =
   10.3333   -4.1667    3.0000
   -4.1667    2.3333   -1.5000
    3.0000   -1.5000    1.0000
>> for i=1:size(a,2) 
    for j=1:size(a,2) 
        c(i,j)=sum((a(:,i)-mean(a(:,i))).*(a(:,j)-mean(a(:,j))))/(size(a,1)-1);
    end 
end
>> c
c =
   10.3333   -4.1667    3.0000
   -4.1667    2.3333   -1.5000
    3.0000   -1.5000    1.0000

  1.3 矩陣對角化

   求出協方差矩陣的n個最大特征值,那么X*對應的特征向量,就得到降維n。

  1.4 eig函數

  E=eig(A):求矩陣A的全部特征值,構成向量E。
  [V,D]=eig(A):求矩陣A的全部特征值,構成對角陣D,並求A的特征向量構成V的列向量。
  [V,D]=eig(A,'nobalance'):與第2種格式類似,但第2種格式中先對A作相似變換后求矩陣A的特征值和特征向量,而格式3直接求矩陣A的特征值和特征向量。
  E=eig(A,B):由eig(A,B)返回N×N階方陣A和B的N個廣義特征值,構成向量E。
  [V,D]=eig(A,B):由eig(A,B)返回方陣A和B的N個廣義特征值,構成N×N階對角陣D,其對角線上的N個元素即為相應的廣義特征值,同時將返回相應的特征向量構成N×N階滿秩矩陣,且滿足AV=BVD。

>> a = [1 2 3; 4 5 6; 7 8 9]
a =
     1     2     3
     4     5     6
     7     8     9
>> [b,c] = eig(a)
b =
   -0.2320   -0.7858    0.4082
   -0.5253   -0.0868   -0.8165
   -0.8187    0.6123    0.4082
c =
   16.1168         0         0
         0   -1.1168         0
         0         0   -0.0000

  實驗驗證:X的標准化的協方差矩陣就是X的相關系數矩陣。

  程序中是按列求方差等,這和PCA求協方差一樣的。

>> X = a;
>> [p,n]=size(X);
for j=1:n
    mju(j)=mean(X(:,j));
    sigma(j)=sqrt(cov(X(:,j)));
end
for i=1:p
    for j=1:n
        Y(i,j)=(X(i,j)-mju(j))/sigma(j);
    end
end
sigmaY=cov(Y);
%求X標准化的協差矩陣的特征根和特征向量
[T,lambda]=eig(sigmaY);
disp('特征根(由小到大):');
disp(lambda);
disp('特征向量:');
disp(T);
特征根(由小到大):
   -0.0000         0         0
         0         0         0
         0         0    3.0000
特征向量:
    0.4082    0.7071    0.5774
    0.4082   -0.7071    0.5774
   -0.8165         0    0.5774
>> R=corrcoef(X);
%求X相關系數矩陣的特征根和特征向量
[TR,lambdaR]=eig(R);
disp('特征根(由小到大):');
disp(lambdaR);
disp('特征向量:');
disp(TR);
特征根(由小到大):
   -0.0000         0         0
         0         0         0
         0         0    3.0000

特征向量:
    0.4082    0.7071    0.5774
    0.4082   -0.7071    0.5774
   -0.8165         0    0.5774

 貢獻率與累計貢獻率。

%方差貢獻率;累計方差貢獻率
Xsum=sum(sum(lambda,2),1);
for i=1:n
    fai(i)=lambda(i,i)/Xsum;
end
for i=1:n
    psai(i)= sum(sum(lambda(1:i,1:i),2),1)/Xsum;
end
disp('方差貢獻率:');
disp(fai);
disp('累計方差貢獻率:');
disp(psai);
%綜合評價....略

  疑惑:第一個eig發現特征根由大到小排序了,第二個發現是由小到大排序了,並未認為哦干擾,咋回事?

  1.5 STD函數

  std(x) 算出x的標准偏差。 x可以是一行的matrix或者一個多行matrix矩陣,如果只有一行,那么就是算一行的標准偏差,如果有多行,就是算每一列的標准偏差。std(x,a)也是x的標准偏差但是a可以=0或者1.如果是0和前面沒有區別,如果是1就是最后除以n,而不是n-1. (你參考計算標准偏差的公式,一般都用除以n-1的公式。)std (x, a,b)這里a表示是要用n還是n-1,如果是a是0就是除以n-1,如果是1就是除以n。

  b這里是維數,比如說

  1 2 3 4
  4 5 6 1
  如果b是1,就是按照行分,如果b是2就是按照列分,如果是三維的矩陣,b=3就按照第三維來分數據。

  1.6 zscore函數

  航向量:MATLAB執行代碼就是 z = (x–mean(x))./std(x)。z-score標准化方法適用於屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數據的情況。新數據=(原數據-均值)/標准差,用zscore函數,可以把數據進行z-score標准化處理。用法為Y=zscore(X),x為標准化之前的數據,y為標准化后的數據

  特點:
  (1)樣本平均值為0,方差為1;
  (2)區間不確定,處理后各指標的最大值、最小值不相同;
  (3)對於指標值恆定的情況不適用;
  (4)對於要求標准化后數據大於0 的評價方法(如幾何加權平均法)不適用。

二.PCA解析

  下面是百度百科中對pca降維的一段解釋,還是挺清晰的:
  “對於一個訓練集,100個對象模板,特征是10維,那么它可以建立一個100*10的矩陣,作為樣本。求這個樣本的協方差矩陣,得到一個10*10的協方差矩陣,然后求出這個協方差矩陣的特征值和特征向量,應該有10個特征值和特征向量,我們根據特征值的大小,取前四個特征值所對應的特征向量,構成一個10*4的矩陣,這個矩陣就是我們要求的特征矩陣,100*10的樣本矩陣乘以這個10*4的特征矩陣,就得到了一個100*4的新的降維之后的樣本矩陣,每個特征的維數下降了。

  2.1 基本解析  

  對同一個體進行多項觀察時,必定涉及多個隨機變量X1,X2,…,Xp,它們都是的相關性, 一時難以綜合。這時就需要借助主成分分析 (principal component analysis)來概括諸多信息的主要方面。我們希望有一個或幾個較好的綜合指標來概括信息,而且希望綜合指標互相獨立地各代表某一方面的性質。
任何一個度量指標的好壞除了可靠、真實之外,還必須能充分反映個體間的變異。如果有一項指標,不同個體的取值都大同小異,那么該指標不能用來區分不同的個體。由這一點來看,一項指標在個體間的變異越大越好。因此我們把“變異大”作為“好”的標准來尋求綜合指標。 

  PCA(Principal Component Analysis)不僅僅是對高維數據進行降維,更重要的是經過降維去除了噪聲,發現了數據中的模式。

  PCA把原先的n個特征用數目更少的m個特征取代,新特征是舊特征的線性組合,這些線性組合最大化樣本方差,盡量使新的m個特征互不相關。從舊特征到新特征的映射捕獲數據中的固有變異性。

  2.2 對PCA的理解

  PCA簡單的說,它是一種通用的降維工具。在我們處理高維數據的時候,了能降低后續計算的復雜度,在“預處理”階段通常要先對原始數據進行降維,而PCA就是干這個事的

  本質上講,PCA就是將高維的數據通過線性變換投影到低維空間上去,但這個投影可不是隨便投投,
遵循一個指導思想,那就是:找出最能夠代表原始數據的投影方法。這里怎么理解這個思想呢?“最
表原始數據”希望降維后的數據不能失真,也就是說,被PCA降掉的那些維度只能是那些噪聲或是冗
數據。這里的噪聲和冗余我認為可以這樣認識:
  噪聲:我們常說“噪音污染”,意思就是“噪聲”干擾我們想聽到的真正聲音。同樣,假設樣本中某
主要的維度A,它能代表原始數據,是“我們真正想聽到的東西”,它本身含有的“能量”(即該維度
方差,為啥?別急,后文該解釋的時候就有啦~)本來應該是很大的,但由於它與其他維度有那
些千絲萬縷的相關性,受到這些個相關維度的干擾,它的能量被削弱了,我們就希望通過PCA處
理后,使維度A與其他維度的相關性盡可能減弱,進而恢復維度A應有的能量,讓我們“聽的更清
楚”!
  冗余:冗余也就是多余的意思,就是有它沒它都一樣,放着就是占地方。同樣,假如樣本中有
個維度,在所有的樣本上變化不明顯(極端情況:在所有的樣本中該維度都等於同一個數),也
說該維度上的方差接近於零,那么顯然它對區分不同的樣本絲毫起不到任何作用,這個維度即
冗余的,有它沒它一個樣,所以PCA應該去掉這些維度。
  PCA的目的就是“降噪”和“去冗余”。“降噪”的目的就是使保留下來的維度間的相關性盡可
能小,而“去冗余”的目的就是使保留下來的維度含有的“能量”即方差盡可能大。

  那首先的首先,我們得需那有什么數據結構能同時表現不同維度間的相關性以及各個維度上的方差呢?自然是非協方差矩陣莫屬。協方差矩陣度量的是維度與維度之間的關系,而非樣本與樣本之間。協方差矩陣的主對角線上的元素是各個維度上的方差(即能量),其他元素是兩兩維度間的協方差(即相關性)。我們要的東西協方差矩陣都有了,先來看“降噪”,讓保留下的不同維度間的相關性盡可能小,也就是說讓協方差矩陣中非對角線元素都基本為零。達到這個目的的方式自然不用說,線代中獎的很明確——矩陣對角化。而對角化后得到的矩陣,其對角線上是協方差矩陣的特征值,它還有兩個身份:首先,它還是各個維度上的新方差;其次,它是各個維度本身應該擁有的能量(能量的概念伴隨特征值而來)。這也就是我們為何在前面稱“方差”為“能量”的原因。也許第二點可能存在疑問,但我們應該注意到這個事實,通過對角化后,剩余維度間的相關性已經減到最弱,已經不會再受“噪聲”的影響了,故此時擁有的能量應該比先前大了。看完了“降噪”,我們的“去冗余”還沒完呢。對角化后的協方差矩陣,對角線上較小的新方差對應的就是那些該去掉的維度。所以我們只取那些含有較大能量(特征值)的維度,其余的就舍掉即可。PCA的本質其實就是對角化協方差矩陣。 

  2.3 PCA過程

  PCA過程

  1.特征中心化。即每一維的數據都減去該維的均值。這里的“維”指的就是一個特征(或屬性),變換之后每一維的均值都變成了0。每一列減去該列均值后,得到矩陣B:
  2.計算B的協方差矩陣C:
  3.計算協方差矩陣C的特征值和特征向量。

  4.選取大的特征值對應的特征向量,得到新的數據集。
三.PCA實現

  在此只講一些個人理解,並沒有用術語,只求通俗。貢獻率:每一維數據對於區分整個數據的貢獻,貢獻率最大的顯然是主成分,第二大的是次主成分......

  [coef,score,latent,t2] = princomp(x);LATENT協方差矩陣的特征值。SCORE是對主分的打分,也就是說原X矩陣在主成分空間的表示。COEFF是X矩陣所對應的協方差陣V的所有特征向量組成的矩陣,即變換矩陣或稱投影矩陣。用你的原矩陣x*coeff(:,1:n)才是你要的的新數據,其中的n是你想降到多少維。  

  1.latent:是一個列向量,由X的協方差矩陣的特征值組成.不是X的特征值,即 latent = sort(eig(cov(X)),'descend');  

  2.這里的SCORE指的是原始數據在新生成的主成分空間里的坐標值。zscore(x)是歸一化的函數.即z-scores z = (x–mean(x))./std(x),兩者不是一回事。

  參考文獻:

http://blog.csdn.net/wangzhiqing3/article/details/12192663

http://www.cnblogs.com/cvlabs/archive/2010/05/08/1730319.html

http://www.cnblogs.com/zhangchaoyang/articles/2222048.html

http://blog.csdn.net/wangzhiqing3/article/details/12193131

http://blog.sciencenet.cn/blog-265205-544681.html

http://blog.sina.com.cn/s/blog_61c0518f0100f4mi.html

http://blog.csdn.net/s334wuchunfangi/article/details/8169928

http://blog.sina.com.cn/s/blog_6833a4df0100pwma.html

http://www.ilovematlab.cn/thread-54493-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM