主成分分析PCA For R(工事中)
2019-06-07 本文已影响4人
Jason数据分析生信教室
5月31日 12:00 小雨
1.主成分分析原理
翻了很多帖子没有一个可以直接看懂的,每个帖子的说法用词虽然略微不一样,切入点都差不多,感觉都是从一个地方抄过来稍加修改而已。特别是从协方差忽然就切入特征值特征向量,让数学门外汉摸不着头脑。
参考书:<多変量解析II 主成分分析 理論とRによる演習>
关键词:
1.协方差矩阵
2.特征向量,特征值
-
主成分分析的目的:
很简单:降低维度(去噪)👉将一组N维数据降成K维(K小于N)
原始数据Z在主成分向量l上的投影X最大
X=Z*l (Z已知,求l以及l相对应的X)
这里就产生了两个条件(如下) -
为了达到这个目的就得满足两个条件
- 投影X最大(为了实现最小数据损失)
- 主成分向量l必须是单位直交向量
- 为了求上述方程的解,就使用到了拉格朗日定理,经过推导(详细略)最后相当于将原始数据Z的协方差矩阵对角化,并求出协方差矩阵的特征值和特征向量。
这样就把协方差矩阵和特征值特征向量之间的关系给连起来了。原来并不是人家说的不明白,是自己数学知识不够,之前没听说过拉格朗日定理。详细推导过程了解一下就好,完全没有必要记住甚至钻牛角尖。只要明白为什么求主成分忽然变成了求协方差矩阵的特征值和特征向量就好
-
理解协方差矩阵
协方差矩阵本质就是一个相关系数矩阵 -
求协方差矩阵的特征值和特征向量
原始数据的标准化数据乘以各特征向量就是各组数据在主成分上的投影,也就是各组数据的主成分得点。(PCA score) -
Loading Score
概念有点晕,可以理解成原始数据各维度和每个主成分的相关度。
计算:特征值开方以后乘以特征向量。
2. R语言实现
不使用自带函数,手动计算
- 使用数据:
mtcars
Z<-as.matrix(mtcars)
n<-nrow(Z)
Z_scl<-scale(Z)
S<-(1/(n-1))*t(Z_scl)%*%Z_scl #各个维度的写相关矩阵,本数据有11各变量
> head(S)
mpg cyl disp hp drat wt qsec vs
mpg 1.0000000 -0.8521620 -0.8475514 -0.7761684 0.6811719 -0.8676594 0.41868403 0.6640389
cyl -0.8521620 1.0000000 0.9020329 0.8324475 -0.6999381 0.7824958 -0.59124207 -0.8108118
disp -0.8475514 0.9020329 1.0000000 0.7909486 -0.7102139 0.8879799 -0.43369788 -0.7104159
hp -0.7761684 0.8324475 0.7909486 1.0000000 -0.4487591 0.6587479 -0.70822339 -0.7230967
drat 0.6811719 -0.6999381 -0.7102139 -0.4487591 1.0000000 -0.7124406 0.09120476 0.4402785
wt -0.8676594 0.7824958 0.8879799 0.6587479 -0.7124406 1.0000000 -0.17471588 -0.5549157
am gear carb
mpg 0.5998324 0.4802848 -0.5509251
cyl -0.5226070 -0.4926866 0.5269883
disp -0.5912270 -0.5555692 0.3949769
hp -0.2432043 -0.1257043 0.7498125
drat 0.7127111 0.6996101 -0.0907898
wt -0.6924953 -0.5832870 0.4276059
Eigen_value<-eigen(S) #11组特征值 以及 相对应的特征向量
Z_score<-Z_scl %*% Eigen_value$vectors #Z标准化后的主成分得点
> head(Z_score)
[,1] [,2] [,3] [,4] [,5] [,6]
Mazda RX4 0.64686274 -1.7081142 -0.5917309 0.11370221 0.9455234 0.01698737
Mazda RX4 Wag 0.61948315 -1.5256219 -0.3763013 0.19912121 1.0166807 0.24172464
Datsun 710 2.73562427 0.1441501 -0.2374391 -0.24521545 -0.3987623 0.34876781
Hornet 4 Drive 0.30686063 2.3258038 -0.1336213 -0.50380035 -0.5492089 -0.01929700
Hornet Sportabout -1.94339268 0.7425211 -1.1165366 0.07446196 -0.2075157 -0.14919276
Valiant 0.05525342 2.7421229 0.1612456 -0.97516743 -0.2116654 0.24383585
[,7] [,8] [,9] [,10] [,11]
Mazda RX4 -0.42648652 0.009631217 0.14642303 -0.06670350 -0.17969357
Mazda RX4 Wag -0.41620046 0.084520213 0.07452829 -0.12692766 -0.08864426
Datsun 710 -0.60884146 -0.585255765 -0.13122859 0.04573787 0.09463291
Hornet 4 Drive -0.04036075 0.049583029 0.22021812 -0.06039981 -0.14761127
Hornet Sportabout 0.38350816 0.160297757 -0.02117623 -0.05983003 -0.14640690
Valiant -0.29464160 -0.256612420 -0.03222907 -0.20165466 -0.01954506
plot(Z_score[,1],Z_score[,2],col="red",pch=1) #PC1和PC2的plot
PC1&PC2
root_eigen<-sqrt(Eigen_value$values) #开方特征值
loading_score<-root_eigen * Eigen_value$vectors #特征值的开方*各特征向量
loading_label<-c(1:11) #给每各变量指定标签
loading_data<-data.frame(loading_score,loading_label)
plot(loading_data$X1,loading_data$X2,col=loading_label,pch=loading_label)
#各变量与PC1,PC2的相关图
Loading Score of PC1&PC2
prcomp( )函数
难度瞬间降低,不要忘了标准化数据scale=TRUE
函数: prcomp( )
$x: 主成分得点
$sdev: 特征值的平方根
$rotation: 特征向量
$center: 各维度的平均值
- Loading Score 主成分负荷量(prcomp( )里没有包含,需要另外计算)
主成分负荷量就是最后得到的特征值的平方根($sdev
)乘以特征向量($rotation
)
- 可以用mtcars来实战一下
1.到此差不多大功告成,不得再次吐槽一下简书的Markdown,不能改字体,数据显示的太别扭了。
2.PCA数据优雅可视化的话需要用ggplot,放到以后再说吧。