R: 主成分分析 ~ PCA(Principal Component Analysis)


本文摘自:http://www.cnblogs.com/longzhongren/p/4300593.html 以表感謝。感謝

綜述: 主成分分析 因子分析 典型相關分析,三種方法的共同點主要是用來對數據降維處理。經過降維去除了噪聲。

#主成分分析 是將多指標化為少數幾個綜合指標的一種統計分析方法。

是一種通過降維技術把多個變量化成少數幾個主成分的方法,這些主成分能夠反映原始變量的大部分信息,表示為原始變量的線性組合

作用:1,解決自變量之間的多重共線性; 2,減少變量個數, 3,確保這些變量是相互獨立的

應用場景篩選回歸變量 --> 回歸分析

計算步驟:

假設樣本觀測數據矩陣為: X=(x1,x2,x3,...xp),xi為n個樣本在第i個屬性上的觀測值,是一個列向量

步1. 對原始數據標准化處理(0均值化處理),即每一維的數據都減去該維的均值。變換之后每一維的均值都變成了0。
步2. 計算樣本相關系數矩陣。

  

步3. 計算協方差矩陣的特征值和特征向量。對稱方陣可求特征值、特征向量
步4. 選擇重要的主成分,即大的特征值對應的特征向量,得到新的數據集。並寫出主成分表達式。
步5. 計算主成分得分。
步6. 根據主成分得分的數據,做進一步的統計分析。

實例演示:

#原始數據:
dat <- data.frame(x=c(2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1),
                  y=c(2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9)); dat

#步1,數據標准化
dat1 <- scale(dat); dat1
#步2,求解協方差矩陣
covdat <- cov(dat1); covdat
#步3,求解特征值、特征向量
eigen_dat <- eigen(covdat); eigen_dat
#步4,求解主成分
dat1 %*% eigen_dat$vectors

 總和上述代碼:

pca <- function(data = data){
  dat <- scale(data) #標准化
  covdat <- cov(dat)  #求協方差矩陣
  eigendat <- eigen(covdat)  #求特征值、特征向量
  eigenValue <- eigendat$values  #特征值
  eigenVector <- eigendat$vectors  #特征向量
  order_value <- order(eigenValue,decreasing = T)  #由大到小排列特征值
  values <- eigenValue[order_value]  
  valueSum <- sum(values)  
  cumVar <- cumsum(values)/valueSum * 100  #計算主成分得分。
  order_vector <- eigenVector[,order_value]  
  principal <- dat %*% order_vector  #求解主成分
  return(list(PCA=principal, cumVar=cumVar))
}
pca(data=dat1)

 

R 中函數總結:

#R中作為主成分分析最主要的函數是 princomp() 函數
#princomp() 主成分分析   可以從相關陣或者從協方差陣做主成分分析
#summary() 提取主成分信息 
#loadings() 顯示主成分分析或因子分析中載荷的內容
#predict() 預測主成分的值 
#screeplot() 畫出主成分的碎石圖 
#biplot() 畫出數據關於主成分的散點圖和原坐標在主成分下的方向

案例:

#現有30名中學生身高、體重、胸圍、坐高數據,對身體的四項指標數據做主成分分析。

#1.載入原始數據
test<-data.frame(
  X1=c(148, 139, 160, 149, 159, 142, 153, 150, 151, 139,
           140, 161, 158, 140, 137, 152, 149, 145, 160, 156,
           151, 147, 157, 147, 157, 151, 144, 141, 139, 148),
  X2=c(41, 34, 49, 36, 45, 31, 43, 43, 42, 31,
           29, 47, 49, 33, 31, 35, 47, 35, 47, 44,
           42, 38, 39, 30, 48, 36, 36, 30, 32, 38),
  X3=c(72, 71, 77, 67, 80, 66, 76, 77, 77, 68,
          64, 78, 78, 67, 66, 73, 82, 70, 74, 78,
          73, 73, 68, 65, 80, 74, 68, 67, 68, 70),
  X4=c(78, 76, 86, 79, 86, 76, 83, 79, 80, 74,
           74, 84, 83, 77, 73, 79, 79, 77, 87, 85,
           82, 78, 80, 75, 88, 80, 76, 76, 73, 78)
  )

#2.作主成分分析並顯示分析結果
test.pr<-princomp(test,cor=TRUE)   #cor是邏輯變量,cor=TRUE 表示用樣本的相關矩陣R做主成分分析

                                                            若 cor=FALSE 表示用樣本的協方差陣S做主成分分析
summary(test.pr,loadings=TRUE)  #loading是邏輯變量,當 loading=TRUE 時表示顯示 loading 的內容

                                                      #loadings 的輸出結果為載荷是主成分對應於原始變量的系數,即Q矩陣

分析結果含義
#----Standard deviation 標准差   其平方為方差=特征值
#----Proportion of Variance  方差貢獻率
#----Cumulative Proportion  方差累計貢獻率

#由結果顯示 前兩個主成分的累計貢獻率已經達到96% 可以舍去另外兩個主成分 達到降維的目的

因此可以得到函數表達式 Z1=-0.497X'1-0.515X'2-0.481X'3-0.507X'4

                                       Z2=  0.543X'1-0.210X'2-0.725X'3-0.368X'4

#4.畫主成分的碎石圖並預測

screeplot(test.pr,type="lines")

p <- predict(test.pr) 

biplot(test.pr)  #畫出數據關於主成分的散點圖和原坐標在主成分下的方向

 

由碎石圖可以看出 第二個主成分之后 圖線變化趨於平穩 因此可以選擇前兩個主成分做分析。

 

 

擴展說明:

1,它是一個線性變換。這個變換把數據變換到一個新的坐標系統中,使得任何數據投影的第一大方差在第一個坐標(稱為第一主成分)上,第二大方差在第二個坐標(第二主成分)上,依次類推。通常表示為原始變量的線性組合

2,把多指標轉化為少數幾個綜合指標,降低觀測空間的維數,以獲取最主要的信息。減少數據集的維數,同時保持數據集的對方差貢獻最大的特征。

3,由主成分分析法構造回歸模型。即把各主成分作為新自變量代替原來自變量 x 做回歸分析。
4,用主成分分析篩選回歸變量。回歸變量的選擇有着重的實際意義,為了使模型本身易於做結構分析、控制和預報,從原始變量所構成的子集合中選擇最佳變量,構成最佳變量集合。用主成分分析篩選變量,可以用較少的計算量,獲得選擇最佳變量子集合的效果。

 


免責聲明!

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



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