Pca
在 PCA 給出更好的解釋方差比之前不對數據進行歸一化
我標準化我的數據集,然後運行 3 個分量 PCA 以獲得小的解釋方差比([0.50, 0.1, 0.05])。
當我沒有標準化但白化我的數據集然後運行 3 個分量 PCA 時,我得到了高解釋方差比([0.86, 0.06,0.01])。
由於我想將盡可能多的數據保留到 3 個組件中,我不應該對數據進行規範化嗎?據我了解,我們應該始終在 PCA 之前進行標準化。
通過歸一化:將均值設置為 0 並具有單位方差。
取決於您的分析目標。一些常見的做法,其中一些在 whuber 的鏈接中提到:
- 當執行 PCA 的變量沒有在相同的尺度上測量時,通常會進行標準化。請注意,標準化意味著對所有變量賦予同等重要性。
- 如果它們不是在相同的尺度上測量的,並且您選擇使用非標準化變量,則通常情況下,每台 PC 都由單個變量控制,您只需通過變量的方差對變量進行排序。(每個(早期)組件的負載之一將接近 +1 或 -1。)
- 正如您所經歷的,這兩種方法通常會導致不同的結果。
直觀的例子:
假設您有兩個變量:一棵樹的高度和同一棵樹的周長。我們將體積轉換為一個因子:如果一棵樹的體積大於 20 立方英尺,它的體積就會很大,否則體積就會很小。我們將使用 R 中預加載的樹數據集。
>data(trees) >tree.girth<-trees[,1] >tree.height<-trees[,2] >tree.vol<-as.factor(ifelse(trees[,3]>20,"high","low"))
現在假設高度實際上是以英里而不是英尺來測量的。
>tree.height<-tree.height/5280 >tree<-cbind(tree.height,tree.girth) > >#do the PCA >tree.pca<-princomp(tree) >summary(tree.pca) Importance of components: Comp.1 Comp.2 Standard deviation 3.0871086 1.014551e-03 Proportion of Variance 0.9999999 1.080050e-07 Cumulative Proportion 0.9999999 1.000000e+00
第一個組件解釋了數據中幾乎 100% 的可變性。載荷:
> loadings(tree.pca) Loadings: Comp.1 Comp.2 tree.height -1 tree.girth 1
圖形評估:
>biplot(tree.pca,xlabs=tree.vol,col=c("grey","red"))
我們看到體積大的樹木往往具有較高的樹周長,但三個高度並沒有提供有關樹木體積的任何信息。這可能是錯誤的,並且是兩種不同單位度量的結果。
我們可以使用相同的單位,或者我們可以標準化變量。我預計兩者都會導致更平衡的可變性圖景。當然,在這種情況下,人們可以爭辯說變量應該具有相同的單位但不是標準化的,這可能是一個有效的論點,如果我們不是在測量兩個不同的事物的話。(當我們要測量樹的重量和樹的周長時,應該測量兩者的尺度不再很清楚。在這種情況下,我們有一個明確的論據來處理標準化變量。)
>tree.height<-tree.height*5280 >tree<-cbind(tree.height,tree.girth) > >#do the PCA >tree.pca<-princomp(tree) > summary(tree.pca) Importance of components: Comp.1 Comp.2 Standard deviation 6.5088696 2.5407042 Proportion of Variance 0.8677775 0.1322225 Cumulative Proportion 0.8677775 1.0000000 > loadings(tree.pca) Loadings: Comp.1 Comp.2 tree.height -0.956 0.293 tree.girth -0.293 -0.956 >biplot(tree.pca,xlabs=tree.vol,col=c("grey","red"))
我們現在看到高大周長的樹木體積大(左下角),而低體積樹木的周長低且高度低(右上角)。這在直覺上是有道理的。