寫在前面:與 PCA 有關的一些名詞解釋萧福,參考:https://zhuanlan.zhihu.com/p/414190170 赖歌。
R 的 prcomp() 進行 PCA 降維時,是通過對 (中心化和可能標準化的) 數據矩陣進行奇異值分解計算的,而不是使用協(xié)方差矩陣的特征值(eigen)。
與 princomp()
不同,prcomp() 的方差是用除數 N-1 計算的集索。
prcomp() 的結果是一個 prcomp 類對象,是一個列表历造,包括以下組分:
- sdev:主成分的標準差(協(xié)方差矩陣/相關性矩陣的特征值的平方根蚜厉,雖然計算是用數據矩陣的奇異值完成的)汹粤。
- rotation:variable loadings(變量載荷) 矩陣栖茉,列包含 eigenvectors(特征向量),對應to的
princomp
返回的 loadings但指。 - x:如果 retx=TRUE仅叫,返回 rotated data膏斤,即(中心化(和標準化)的)數據乘以 rotation 矩陣盅惜。因此中剩,cov(x) 是對角矩陣 diag(sdev^2)。
- center抒寂,scale:使用的中心化和縮放结啼,或者 FALSE。
注意:rotation matrix 的列的符號是任意的屈芜,可能在不同的 PCA 程序郊愧,甚至不同的 R builds 之間都有所不同。因此沸伏,最好將 PCA 模型保存下來,以便在不同的環(huán)境下使用动分。
實例:
#
file <- './input.data.txt'
data_frame <- read.table(file, header = T, sep = "\t", row.names = 1, check.names=F)
data_tr <- data_frame[1:35, ]
data_te <- data_frame[36:60, ]
# 基于訓練集進行 pca 降維
pca_model <- prcomp(data_tr, center=TRUE, scale.=TRUE)
# 使用訓練集的參數毅糟,對測試集進行降維
pred_tr <- predict(pca_model, data_te)
- 訓練集和測試集的維度
print(dim(data_tr))
print(dim(data_te))
image.png
- 主成分的標準差,可以用于計算我們常說的每個 PC 的貢獻度(每個主成分能解釋多少原始數據中的變異澜公,即方差姆另。參考)
print(pca_model$sdev)
pca_model$sdev
計算每個特征的貢獻度:
print(pca_model$sdev^2)
pca_model$sdev^2
# sum(pca_model$sdev^2)=39,所有 PC 可解釋所有變量
# pca_model$sdev^2/sum(pca_model$sdev^2)坟乾,每個 PC 可解釋變量占比
ratio <- pca_model$sdev^2/sum(pca_model$sdev^2)
# 累積貢獻率
cumsum(ratio)
- 變量載荷矩陣迹辐,每一列代表的是特征向量。
print(pca_model$rotation)
rotation 矩陣
- 降維后的矩陣
print(pca_model$x)
# 等價于:
a = scale(data_tr)
a %*% pca_model$rotation
降維后的矩陣
- 每個特征的平均值
print(pca_model$center)
平均值
- 每個特征的標準差甚侣,樣本標準差明吩,無偏估計
print(pca_model$scale)
標準差