基于R语言的主成分分析理论与实例详解
我的个人博客地址
数据分析中,我们经常会遇到高维的数据集,这时候就需要降维简化计算和模型。 主成分分析是一种经典的数据降维方法,它要求被分析的变量之间具有相关性,否则就失去主成分分析的原有意义了。比如在学生成绩综合评估、地区发展综合评估、运动员综合能力评估等,往往会有很多评估指标,这时候就需要进行数据降维,用较少的几个新变量代替原本的变量而尽可能保留原有信息,计算出综合得分,进而给出综合评价结果。
现在假设原始数据像这样:
主成分分析步骤:
构建原始数据矩阵;
消除量纲——数据标准化;
建立协方差矩阵(就是相关系数矩阵);
求出特征值、特征向量;
根据方差、累积方差贡献率确定主成分个数;
求出综合得分,给出现实意义的解释。
下面具体从理论方面简单说明一下相关的变量意义。
因为有p列数据,我们假设会有p个主成分,不会大于p个的,哈哈!然后才从里面挑出特征值大的。假设每个主成分与每个指标(列)满足关系:
我们需要求出满足条件的A = (A1,A2,...Ap),实际上就是P个变量协方差矩阵的特征向量,具体求法后面慢慢说明。
对于一个有n条数据p个指标的数据,构建的数据矩阵就是X = (Xij)nxp;对于一个矩阵的数据标准化就是,对于矩阵所有列分别标准化,拿其中一列来说,数据标准化用到的公式是:
对于第i列(Xi)与第j列(Xj)变量,协方差与相关系数矩阵公式如下:
数据经过标准化后,其实协方差与相关系数矩阵是完全一样的,因为数据经过标准化后,方差是1,而协方差与相关系数就相差一个是否除以两个方差。显然,协方差与相关系数矩阵都是PxP的。
我们需要求出这个名为R的矩阵的特征值与特征向量(就是前面所说的A1,A2,...Ap这些列向量)。矩阵的特征值就像线性代数里面那样求。在R里面只需调用函数eigen()就行了。其实,一个矩阵每一列会对应一个特征值,而特征值的大小代表了这一列的重要程度,特征值最大的就是第一主成分,特征值越小(该特征值/SUM(特征值))可以略去。然后根据p个特征向量算出,每个数据记录(行)在每一个主成分上的得分,再将其与特征值做内积/SUM(特征值),就得到最终的综合得分
主成分分析实例详解
下面用R语言自带数据集swiss进行主成分分析加以说明,这个数据集包含瑞士的47个城市在6个评价指标上的数据。
数据预处理与数据探索
head(swiss)
可见有几个变量的相关性还是比较强的,表明这份数据适合做主成分分析。
构建主成分模型
R中构建主成分模型用函数princomp(),第一个参数表示标准化后的数据sc.swiss为数据对象,第二个参数cor = TRUE表明用样本的相关矩阵做主成分分析,取值为FALSE表示用协方差矩阵做主成分分析。当然了,这里数据经过标准化都是一样的。
pri <- princomp(sc.swiss,cor = TRUE)
图中的Loadings那个矩阵就是由相关系数矩阵的特征向量按列组成的(图中不完整的元素是因为这个值太小了,没有给出),我们暂且把六列(六个特征向量)记为Vec1,Vec2,Vec3,Vec4,Vec5,Vec6,后面需要用到。我们这里给出了六个主成分,当然了,我们需要筛选最能表达原始数据信息的几个特征值大的主成分。比如第一个主成分的表达式就是:
Y1 = -0.457Fer-0.424Agr+0.51Exa+0.454Edu-0.350Cat-0.15Inf
screeplot(pri,type = 'lines',col = c('blue','red'))
根据碎石图确定主成分个数(4个比较合适):
计算主成分综合得分
这一份数据就是瑞士47个城市发展指标,比如我们想要为每个城市计算出一个综合得分,得出每个城市的发展情况,给出结论。
使用predict()函数,根据前面构建的主成分模型pri计算每个城市分别在六个主成分上的得分。
这里看一下标准化后的数据前六行吧:
计算每一个记录(行)在每个主成分上的分别得分是这样,比如对于下面Courtelary这个城市在Comp1(第一个主成分)上的得分就是用标准化后的sc.swiss的第一行与第一个特征向量做内积,就是假设:
Courtelary = (0.8051305 -1.4820682 -0.18668632 0.1062125 -0.7477267 0.77503669)
Vec1 = (0.4569876 0.4242141 -0.5097327 -0.4543119 0.3501111 0.1496668)
把Courtelary 与Vec1看作向量就是,SUM (Courtelary .*Vec1) = 0.3596632,按照这种方法算出Courtelary 在六个主成分上的得分为:
0.3596632 1.3844529 0.8505125 0.9012204 -0.6248550 -0.2803396
按照这种计算方法,我们可以看一下,与下面画方框的城市Courtelary 在六个主成分上的得分结果基本是一致的。
在将六个主成分(实际用6列)与六个特征向量做内积,就是分别相乘再求和,就得到每个城市综合得分,具体就是每一行有上面算的六个得分,整个矩阵就是六列,第一列乘以第一个特征值,...,第6列乘以第6个特征值,再把六列加起来成为一列,再除以6,就是最终得分。
看一下前六个城市(一共47个城市)综合得分:
分数越小,表明城市发展越差。
城市综合得分分布图
得分最高有大于2的,最低也有接近-2的,显然城市发展不平衡,差异性显著存在。
关于主成分就到这里,我觉得还是很详细的,主要就是PxP的矩阵的特征值与特征向量,然后根据特征向量求出每条数据在每个主成分的分别得分,最后根据特征值算出综合得分就OK了。
欢迎留言,欢迎提建议、补充,觉得有帮助,记得点赞分享哦!
猜你可能喜欢
基于R语言的主成分分析理论与实例详解相关推荐
- canoco5主成分分析步骤_基于R语言的主成分分析
基于R语言的主成分分析 加入的SPSS群里有人问,怎么用SPSS进行主成分分析.确实没有注意到这种操作.很好奇,于是翻了翻孙振球的<医学统计学>,发现主成分分析这一块,竟使用了SAS!后来 ...
- c语言二级指针有什么作用,C语言中二级指针的实例详解
C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...
- java线程和内核线程的,Java中内核线程理论及实例详解
1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...
- R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表
R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据
- R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表
R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表
- R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列
- R语言tidyr包separate()函数实战详解:一列裂变为多列
R语言tidyr包separate()函数实战详解:一列裂变为多列 目录 R语言tidyr包separate()函数实战详解:一列裂变为多列 一列裂变为两列
- c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解
C语言 经典题目螺旋矩阵 实例详解 C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include #include int main() { int N,i,j,n,num=1; int a[10][ ...
- isight参数优化理论与实例详解_案例1(ISIGHT集成ADAMS CAR方法实现)
本文字数1304字25图,建议阅读时间7分钟 强调一下是ISIGHT,不是INSIGHT INSIGHT是ADAMS内置的一个试验设计模块,它提供了一组统计工具,用于分析仿真结果,辅助优化和改进系统 ...
最新文章
- MultiBaC包消除不同组学数据之间的批次效应
- 在细分场景的时代,如何反欺诈和防止内外勾结?
- 【经典回放】多种语言系列数据结构线性表之一:顺序表
- discuz精仿OPPO社区主题模板
- php:global变量解析 / function 的作用域
- 20 个免费的 jQuery 的工具提示插件:
- 【投放算法】“喵糖”背后的商业化流量投放算法应用及实践
- 实验三十三、标准访问控制列表的配置
- windows核心编程之进程(3)
- 人人网主页登录_“人人网”回来了!网友炸锅:有人想找前女友,有人想删“黑历史”……...
- Spark简介、生态系统
- pycharm永久激活
- 欧文分校计算机科学硕士项目,美国加州大学欧文分校信息与计算机科学硕士.pdf...
- 前馈神经网络与支持向量机实战 --- 手写数字识别
- 数字时代,企业应该如何看待商业智能BI
- 每日 30 秒 ⏱ 漫游器法则
- 电话呼叫转移的设置方法大全
- Pytest-html生成独立的报告以及Python打印日志
- Ansys workbench结构线性静力学分析-简支梁分析
- JAVA爬虫框架WebMagic爬取ajax请求的页面数据
热门文章
- laravel 时区配置和时间获取
- 互联网会成为人类的敌人么?
- 2022-2028全球化学砌块行业调研及趋势分析报告
- 凤凰网CEO刘爽称鄙视微博连说20个屁示不齿
- 解决Docker安装过程中yum源错误的“UnicodeEncodeError: ‘ascii‘ codec can‘t encode charact u‘\ufffd‘ in position“问题
- 如何使用Windows Xp的系统还原
- Java编程基础语句
- 笔记三:Maven+SSM之网络商城项目开始
- 微软真的要把windows打入冷宫了吗?
- tcpcopy搭建及测试