主成分分析與因子分析(作者

文章推薦指數: 80 %
投票人數:10人

R 統計軟體(7) – 主成分分析與因子分析(作者:陳鍾誠). 簡介. 雖然「主成分分析」(Principle Component Analysis) 通常出現在機率統計的課本當中,但事實上要理解這個 ... 程式人雜誌--2013年10月號(開放公益出版品) R統計軟體(7)–主成分分析與因子分析(作者:陳鍾誠) R統計軟體(7)–主成分分析與因子分析(作者:陳鍾誠) 簡介 雖然「主成分分析」(PrincipleComponentAnalysis)通常出現在機率統計的課本當中,但事實上要理解這個技術的核心數學知識,卻是線性代數。

學過線性代數的朋友們通常會知道一個很重要但卻又難以理解的抽象概念,那就是「特徵值」與「特徵向量」,其數學算式如下:   符合這種條件的的就稱為特徵值,而則稱為特徵向量。

表面上來看,所謂的特徵向量就是矩陣[A]乘法運算上的一個方向不動點,乘完之後只會在該向量上進行常數倍的縮放,但方向不變。

不過、一個n*n矩陣的「特徵值」與「特徵向量」不止有一個,最大可以到達n個,假如共有k個特徵值,那我們可以列出下列運算式。

   ...  基本上、特徵值越大的,代表該特徵向量越能用來描述整個矩陣(或者說越能代表該矩陣),所以如果我們只用特徵值最大的幾個代表整個矩陣,將特徵值小的去除,基本上不會對整個矩陣造成太大的失真。

或許這樣講也不太精確,不過如果您還記得線性代數裏的Rank這個慨念,假如一個3*3矩陣的rank只有2,那麼就代表三行當中,有一行可以用其他兩行的線性組合取代,也就是。

在這種情況下,該矩陣只會有兩個不為零的特徵值(也就是有一個特徵值為0),因此我們可以用兩組特徵值與特徵向量,就重建出整個矩陣。

而所謂的主成分,就是那些對重建矩陣有強大影響力,特徵值較大的那些向量。

而那些特徵值很小的,基本上就可以被忽略了。

主成分分析範例1(Rank=2) 為了展示上述的數學論點,我們用R軟體建構出4組樣本,每組有25個元素,其中第3,4組是第1,2組的線性組合,因此這個4*25矩陣的rank將只有2,所以透過主成分分析,我們應該會看到只有兩個主成分。

以下是我們的範例程式。

>x1=rnorm(25,mean=5,sd=1)#x1是常態分布隨機產生的25個樣本 >x2=rnorm(25,mean=5,sd=1)#x2是常態分布隨機產生的25個樣本 >x3=x1+x2#x3=x1+x2,是x1,x2的線性組合 >x4=x1+2*x3#x4=x1+2*x3=x1+2*(x1+x2)=3x1+2x2,因此也是x1,x2的線性組合。

>x14=data.frame(x1,x2,x3,x4)#用這四組樣本建立一個frame變數x14 >pr=princomp(x14,cor=TRUE)#開始進行主成分分析 >summary(pr,loading=TRUE)#顯示主成分分析的結果 Importanceofcomponents: Comp.1Comp.2Comp.3Comp.4 Standarddeviation1.72817671.00668034.712161e-088.339758e-09 ProportionofVariance0.74664870.25335135.551115e-161.738789e-17 CumulativeProportion0.74664871.00000001.000000e+001.000000e+00 Loadings: Comp.1Comp.2Comp.3Comp.4 x1-0.4490.6260.637 x2-0.367-0.7680.4950.176 x3-0.576-0.311-0.750 x4-0.576-0.5020.638 > 在上述分析結果中,我們看到累積貢獻比率(CumulativeProportion)在第一主成分Comp.1上為0.7466487,而累積到第二主成分Comp.2時就達到1.0了,這代表只要用兩個主成分就可以建構出整個樣本集合。

根據Loadings中的Comp.1那一列可知,第一主成分Comp.1=-0.449x1-0.367x2-0.576x3-0.576x4,也就是我們用這個主成分就可以掌握整組資料的7成(0.7466487),而加上第二主成份Comp.2=0.626x1-0.768x2之後,就可以掌握100%的資料,完全重建整個矩陣了。

(因為這組資料的rank為2)。

主成分分析範例2(Rank=3) 為了驗證上述的「線性代數」想法,我們接著將x3改掉,成為獨立常態序列,然後讓x4=3x1+2x2+x3,如下列程式所示。

>x1=rnorm(25,mean=5,sd=1)#x1是常態分布隨機產生的25個樣本 >x2=rnorm(25,mean=5,sd=1)#x2是常態分布隨機產生的25個樣本 >x3=rnorm(25,mean=5,sd=1)#x3是常態分布隨機產生的25個樣本 >x4=3*x1+2*x2+x3#x4=3*x1+2*x2+x3,是x1,x2,x3的線性組合 >x14=data.frame(x1,x2,x3,x4)#用這四組樣本建立一個frame變數x14 >pr=princomp(x14,cor=TRUE)#開始進行主成分分析 >summary(pr,loading=TRUE))#顯示主成分分析的結果 Importanceofcomponents: Comp.1Comp.2Comp.3Comp.4 Standarddeviation1.46598621.12334890.7674454.712161e-08 ProportionofVariance0.53727890.31547820.1472435.551115e-16 CumulativeProportion0.53727890.85275701.0000001.000000e+00 Loadings: Comp.1Comp.2Comp.3Comp.4 x10.6340.1040.4580.615 x20.310-0.669-0.6250.259 x30.1940.736-0.6320.146 x40.682-0.731 您可以看到在下列的累積貢獻比率(CumulativeProportion)當中,要到第三個主成分才到達1.0,而非第二個主成分。

CumulativeProportion0.53727890.85275701.0000001.000000e+00 而且在標準差(Standarddeviation)與變異比率(ProportionofVariance)上也反映了類似的情況,必須要到Comp.4的時候,這兩個數值才會突然下降到幾近為0的程度(4.712161e-08,5.551115e-16)。

主成分分析範例3(Rank=3加上隨機誤差) 接著、讓我們為x4加上一點隨機誤差,看看主成分分析的結果會有何改變。

>x1=rnorm(25,mean=5,sd=1)#x1是常態分布隨機產生的25個樣本 >x2=rnorm(25,mean=5,sd=1)#x2是常態分布隨機產生的25個樣本 >x3=rnorm(25,mean=5,sd=1)#x3是常態分布隨機產生的25個樣本 >x4=3*x1+2*x2+x3+rnorm(25,mean=0,sd=1)#x4=3*x1+2*x2+x3,是x1,x2,x3的線性組合加上常態隨機誤差 >x14=data.frame(x1,x2,x3,x4)#用這四組樣本建立一個frame變數x14 >pr=princomp(x14,cor=TRUE)#開始進行主成分分析 >summary(pr,loading=TRUE))#顯示主成分分析的結果 Importanceofcomponents: Comp.1Comp.2Comp.3Comp.4 Standarddeviation1.45657511.12337280.77043140.151189097 ProportionofVariance0.53040270.31549160.14839110.005714536 CumulativeProportion0.53040270.84589430.99428551.000000000 Loadings: Comp.1Comp.2Comp.3Comp.4 x1-0.6420.1170.4100.637 x2-0.306-0.662-0.6450.228 x3-0.1730.740-0.6410.103 x4-0.681-0.729 > 您可以看到在累積貢獻比率(CumulativeProportion)當中,到了第三主成分時已經達到99.4%(0.9942855),而到了第四主成分時才達到100%,這代表若用前三個主成份重建仍然會有少許誤差。

CumulativeProportion0.53040270.84589430.99428551.000000000 上述的誤差量可以從標準差(Standarddeviation)與變異比率(ProportionofVariance)這兩組數字上看到。

Comp.1Comp.2Comp.3Comp.4 Standarddeviation1.45657511.12337280.77043140.151189097 ProportionofVariance0.53040270.31549160.14839110.005714536 因子分析 另外、還有一個與主成分分析用法相當類似的方法,稱為因子分析(FactorAnalysis),這種方法的使用與主成分分析之差異點,在於必須指定要事先指定使用多少因子,如果使用的因子過多,則會導致失敗的結果。

以下是我們同樣針對上述範例所進行的因子分析結果,您可以發現在下列的分析中,只有指定一個因子的時候可以成功的進行分析,而指定兩個以上的因子時,就會導致分析失敗的結果。

>x1=rnorm(25,mean=5,sd=1)#x1是常態分布隨機產生的25個樣本 >x2=rnorm(25,mean=5,sd=1)#x2是常態分布隨機產生的25個樣本 >x3=rnorm(25,mean=5,sd=1)#x3是常態分布隨機產生的25個樣本 >x4=3*x1+2*x2+x3+rnorm(25,mean=0,sd=1)#x4=3*x1+2*x2+x3,是x1,x2,x3的線性組合加上常態隨機誤差 >x14=data.frame(x1,x2,x3,x4)#用這四組樣本建立一個frame變數x14 >fa=factanal(x14,factors=2) 錯誤在factanal(x14,factors=2): 2factorsistoomanyfor4variables >fa=factanal(x14,factors=1) >fa Call: factanal(x=x14,factors=1) Uniquenesses: x1x2x3x4 0.1260.8340.9510.005 Loadings: Factor1 x10.935 x20.407 x30.222 x40.998 Factor1 SSloadings2.084 ProportionVar0.521 Testofthehypothesisthat1factorissufficient. Thechisquarestatisticis21.97on2degreesoffreedom. Thep-valueis1.7e-05 >fa=factanal(x14,factors=3) 錯誤在factanal(x14,factors=3): 3factorsistoomanyfor4variables 結語 從主成分分析這個案例中,我們可以看到「機率統計」技術背後的原理,竟然是「線性代數」,數學果然是一門博大精深的學問啊! 事實上、上一期的「迴歸分析」主題,背後的原理乃是「最小平方法」,必須用到「微積分」與「線性代數」進行理論解釋。

我想、這也是為甚麼大學資工系的課程當中,「微積分、線性代數、離散數學、機率統計」通常是必修的原因啊! 參考文獻 R语言与统计分析,作者:汤银才,ISBN:9787040250626。

程式人雜誌,採用創作共用:姓名標示、相同方式分享授權,歡迎加入雜誌社團



請為這篇文章評分?