当前位置: 首页 > news >正文

R语言手工实现主成分分析 PCA | 奇异值分解(svd) 与PCA | PCA的疑问和解答

几个问题:

  • pca可以用相关系数矩阵做吗?效果比协方差矩阵比怎么样?
  • pca做完后变量和样本的新坐标怎么旋转获得?
  • pca做不做scale和center对结果有影响吗?
  • pca用因子分解和奇异值分解有啥区别?后者怎么获得变量和样本的新坐标?

1. 用R全手工实现 PCA(对比 prcomp() )

不借助包,按照 《机器学习实战》P246的伪代码进行操作.

1减去列平均数
2计算协方差矩阵
3计算协方差矩阵的特征值和特征向量
4将特征值从大到小排列
5保留最上面的N个特征值
6将数据转换到上述N个特征向量构建的新空间中。

例1: 针对iris数据集

head(iris)
df1=iris[,1:4]
#1) 减去平均值
df1=sweep(x=df1, MARGIN=2, STATS=apply(df1, 2, mean),FUN="-")
head(df1)
#2) 计算协方差矩阵
cor.df1=cov(df1)
#3) 计算协方差矩阵的特征值和特征向量
eigen.df1=eigen(cor.df1)
#4) 特征值默认降序
eigen.df1
#5) 保留最前面的几个特征值
#6) 原center后的坐标 * 旋转矩阵
coord.df1=as.matrix(df1) %*% eigen.df1$vectors
dim(coord.df1)
head(coord.df1)
# plot
coord.df1_=as.data.frame(coord.df1)
colnames(coord.df1_)=paste0("PC_", 1:4)
coord.df1_$type=iris$Species
library(ggplot2)
ggplot(coord.df1_, aes(PC_1, PC_2, color=type))+geom_point()# prcomp() 做PCA
pca.iris=prcomp(iris[,1:4])
pca.iris# 对比旋转矩阵
> pca.iris$rotation #prcomp()的计算结果PC1         PC2         PC3        PC4
Sepal.Length  0.36138659 -0.65658877  0.58202985  0.3154872
Sepal.Width  -0.08452251 -0.73016143 -0.59791083 -0.3197231
Petal.Length  0.85667061  0.17337266 -0.07623608 -0.4798390
Petal.Width   0.35828920  0.07548102 -0.54583143  0.7536574> eigen.df1$vectors #协方差矩阵的特征向量构成的矩阵[,1]        [,2]        [,3]       [,4]
[1,]  0.36138659 -0.65658877 -0.58202985  0.3154872
[2,] -0.08452251 -0.73016143  0.59791083 -0.3197231
[3,]  0.85667061  0.17337266  0.07623608 -0.4798390
[4,]  0.35828920  0.07548102  0.54583143  0.7536574# 对比方差
# 主成分的标准差,文档说是 协方差矩阵的特征值的平方根,虽然是通过SVD分解实现的
# square roots of the eigenvalues of the covariance/correlation matrix
# though the calculation is actually done with the singular values of the data matrix
> pca.iris$sdev
[1] 2.0562689 0.4926162 0.2796596 0.1543862> eigen.df1$values #特征根
[1] 4.22824171 0.24267075 0.07820950 0.02383509#开方后确实等于 pca.iris$sdev
> sqrt(eigen.df1$values)
[1] 2.0562689 0.4926162 0.2796596 0.1543862
http://www.lryc.cn/news/461403.html

相关文章:

  • 第三届OpenHarmony技术大会在上海成功举办
  • 数字化:IT部门主导还是业务部门主导?
  • MySQL表的基本查询下/分组聚合统计
  • 条款3: 理解decltype
  • TCP:过多的TIME_WAIT
  • 化学元素分子量、氧化物系数计算python类
  • torch.utils.data.DataLoader参数介绍
  • echarts 入门
  • WPF实现类似网易云音乐的菜单切换
  • OpenCV人脸检测与识别:构建智能识别系统
  • H5 Canvas 举牌小人
  • rom定制系列------小米6x_澎湃os1.0.28安卓13定制固件修改 刷写过程与界面预览
  • 电脑硬件性能:HDD + SSD + CPU + GPU
  • 通过粒子系统customData传值给材质球
  • 常用分布的数学期望、方差、特征函数
  • ssh-配置
  • Python 在 JMeter 中如何使用?
  • 贪心day1
  • Redis 完整指南:命令与原理详解
  • 【2024软考高级架构师】论文篇——3、论Web系统的测试技术及其应用
  • 迪杰斯特拉算法的理解
  • 华为OD机试 - 文本统计分析(Python/JS/C/C++ 2024 E卷 200分)
  • 计算机挑战赛9
  • C++学习路线(十六)
  • 2024年最受欢迎的AI工具与实际应用:AI技术对未来生活的深远影响
  • 【网络安全】账户安全随笔
  • 在线培训知识库管理系统:教育行业的新动力
  • 【AI声音克隆本地整合包及教程】第二代GPT-SoVITS V2:声音克隆的新境界
  • 博看书苑 8.8.1| 免费阅读海量图书期刊
  • 导致动态代理无法使用的原因有哪些?