主成分分析與因子分析(作者
文章推薦指數: 80 %
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。
程式人雜誌,採用創作共用:姓名標示、相同方式分享授權,歡迎加入雜誌社團
延伸文章資訊
- 1主成分分析(Principal Components Analysis) - RPubs
主成分分析是一種通過降維技術把多個變數化成少數幾個主成分的方法。這些主成分能夠反映原始變數的絕大部分資訊,它們通常表示為原始變數的線性組合。
- 2PCA主成分分析R語言- IT閱讀 - ITREAD01.COM - 程式入門教學
作主成分分析並顯示分析結果 #princomp()主成分分析可以從相關陣或者從協方差陣做主成分分析 #cor是邏輯變量當cor=TRUE表示用樣本的相關矩陣R做主成分 ...
- 3[R语言] R语言PCA分析教程Principal Component Methods in R
总的来说,主成分分析的主要目的是:. 识别数据集中的隐藏模式;; 通过消除数据中的噪声和冗余来降低数据的维度;; 识别相关变量。
- 4R 主成分分析PCA 教學:使用ade4 套件 - Office 指南
在R 中有很多不同的套件都可以用來處理主成分分析,這裡我們介紹使用 ade4 套件進行分析,再以 factoextra 套件繪製圖形的流程。 安裝R 套件. 這裡我們需要的套件除了 ade4 ...
- 5主成分分析與因子分析(作者
R 統計軟體(7) – 主成分分析與因子分析(作者:陳鍾誠). 簡介. 雖然「主成分分析」(Principle Component Analysis) 通常出現在機率統計的課本當中,但事實上要理...