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

news/2024/10/16 7:11:46 标签: r语言, 数据挖掘

几个问题:

  • 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.niftyadmin.cn/n/5707533.html

相关文章

进程的优先级详解(在Linux中观察进程优先级,优先级的概念,优先级范围,进程的切换和切换的过程和理解)

文章目录 进程的优先级什么是进程的优先级?进程的优先级的划分1. 优先级的级别划分2. 动态与静态优先级 那么为什么要有优先级呢?区分 那么是怎么确定优先级的呢? Linux中的优先级Linux中的进程优先级补充 Linux优先级的范围进程的切换切换过…

python机器学习(网络搜索和交叉验证)

""" 网格搜索: 指的是 GridSearchCV这个工具的功能, 可以帮助我们寻找最优的 超参数. 超参数解释: 在机器学习中, 我们把需要用户手动传入的参数称之为: 超参数. 交叉验证: 指的是对数据集进行划分, 即: 把数据分成N份进行验证 第1次:…

【Python语言进阶(二)】

一、函数的使用方式 将函数视为“一等公民” 函数可以赋值给变量函数可以作为函数的参数函数可以作为函数的返回值 高阶函数的用法(filter、map以及它们的替代品) items1 list(map(lambda x: x ** 2, filter(lambda x: x % 2, range(1, 10)))) # filter…

《诺贝尔物理学奖一百年》一书

郭奕玲、沈慧君编著,上海科学普及出版社2002年出版,我当时买到一本。全书400多页,讲解了从1901年至2001年所有物理诺奖得主的生平以及代表工作。 (1)高中物理课本是很厚的一本,当年我参加高考,据…

Java 二分查找算法详解及通用实现模板案例示范

1. 引言 二分查找(Binary Search)是一种常见的搜索算法,专门用于在有序数组或列表中查找元素的位置。它通过每次将搜索空间缩小一半,从而极大地提高了查找效率。相比于线性查找算法,二分查找的时间复杂度为 O(log n)&…

PyTorch单机多卡训练(无废话)

目前大家基本都在使用DistributedDataParallel(简称DDP)用来训练,该方法主要用于分布式训练,但也可以用在单机多卡。 第一步:初始化分布式环境,主要用来帮助进程间通信 torch.distributed.init_process_g…

【五】架构设计之接口幂等概述

架构设计之接口幂等 概述 在进行架构设计的过程中我们时常需要考虑接口幂等的实现方案,本文将梳理接口幂等相关的知识点,并且通过一个示例来进行讲解说明接口幂等的实现方案,实现接口幂等的方式有很多,通过本文我们可以整体了解到…

### 更新数据库时出错。原因:java.sql.SQLException: No database selected

更新数据库时出错。原因:java.sql.SQLException: No database selected 问题:原因:解决办法: 问题: 在基于idea环境中学习搭建mybatis框架时,MySQL数据库执行插入语句遇到以下异常: com.intel…