jjzjj

主成分分析(PCA)详解

生信小兔 2023-04-18 原文

主成分分析(PCA)是一种比较基础的数据降维方法,也是多元统计中的重要部分,在数据分析、机器学习等方面具有广泛应用。主成分分析目的是用较少的变量来代替原来较多的变量,并可以反映原来多个变量的大部分信息。

1.主成分分析(PCA)原理

对于一个含有n个数据,变量的个数为p的一个样本,我们可以用p维空间的n个点来表示这些数据。例如含有2个变量,3个数据(1,2),(2,2),(3,3)的样本,即可以表示为:

如果含有3个变量,就是三维空间中的散点。

通常情况下,我们在实验初会提出很多变量,并且采集这些数据,这些数据中各个变量往往会存在一定的相关性。而这些相关性便意味着可以进行数据的降维,用更少的变量来替代这些变量。事实上,在很多情况下数据的降维是十分必要的,一方面有利于问题的简化,另一方面便于计算机的计算:数据降维后变量的减少,会使计算机处理的数据大大减少,从而缩短数据处理时间。

主成分分析的直观理解,可以认为是旋转坐标轴,使得在旋转坐标轴后这些点在新的坐标系下在各个坐标轴(变量)方向投影的方差变大。其中如果在某坐标上的方差最大,那么这个坐标轴对应的这些散点的坐标就是第一主成分,其次就是第二主成分,依此类推。

 对于上图的8组数据,我们发现在x轴方向方差很大,在y轴方向方差为0,所以就可以用这些点的横坐标数据作为第一主成分,并且只选第一主成分便可以达到要求。

对于下图的情况,我们发现这些数据都几乎排列在一条直线上,并且在x轴方向和y轴方向的方差都比较大。但是如果把坐标轴旋转一定角度,使得这些数据在某个坐标轴的投影的方差比较大,便可以用新坐标系下方差较大的一个坐标轴坐标作为主成分。

 对于左图,数据为(1,2)、(2,4)......旋转坐标轴后,坐标为(,0)、(,0)......这样主成分就是新坐标系下变量x的数值:

对于大多数情况,数据各个变量基本服从正态分布,所以变量为2的数据散点分布大致为一个椭圆,变量为3的散点分布大致为一个椭球,p个变量的数据大致分布在一个超椭圆。而通过旋转坐标系,使得超椭圆的长轴落在一个坐标轴上,其次超椭圆另一个轴也尽量落在坐标轴上。这样各个新的坐标轴上的坐标值便是相应的主成分。

 例如,对于上图的数据,在x轴和y轴的方差都很大,所以可以旋转坐标系,使得椭圆两个轴尽量落在坐标轴上。

 这样,我们便以散点在新坐标系下的x坐标作为第一主成分(因为x方向方差最大),y轴的坐标为第二主成分。

主成分分析的理论推导较为复杂,需要借助投影寻踪,构造目标函数等方法来推导,在多元统计的相关书籍中都有详细讲解。但是其结论却是十分简洁。所以,如果只是需要实际应用,了解主成分分析的基本原理与实现方法便足够了。

2.主成分分析(PCA)步骤

对于含有p个变量、n个数据的样本,可以计算出其协差阵。根据该协差阵可以求出p个特征值并从大到小排序得与相应的p个特征向量。则第i主成分为:

原样本中含有p个变量,通过主成分分析后变量个数会减少很多。选取主成分的个数需要依据主成分贡献率与累计贡献率。第k个主成分的贡献率为:

通常情况下,该主成分的贡献率越大,说明保存的原有数据的信息越多。样本前m个主成分的累计贡献率为:

通常情况下,如果累计贡献率达到80%以上,便可以认为选取前m个主成分能够很好地保留原来样本的信息。累计贡献率是判断选取主成分个数的标准,也反映了这些主成分对原有信息的保留情况。

事实上,由于各个变量单位的不同,利用样本协差阵进行主成分分析往往不够准确,所以可以用样本的相关阵来替代协差阵,之后的计算过程同上。

在实际应用中,从p个变量中提取m个主成分,需要对这新的m个变量做合理的解释。而进行解释往往需要根据具体问题来判断,并结合该主成分中保存原各个变量的比重,即求解该主成分与原始各个变量的因子载荷量

其中表示第k主成分在原第i变量的因子载荷量(它表示变量Xi对主成分Yk的重要程度)。表示协差阵的第i行i列元素,表示第k个特征向量的第i行。如果是利用相关阵进行主成分分析,则因子载荷量为:

其中表示相关阵i行i列,即1。

例如,对于人的身材的数据,通常包含身高、坐高、胸围、手臂长、肋围、腰围六个变量(指标)。通过主成分分析判断前三个主成分的累计贡献率大小可以达到要求,便选取这三个主成分。为了解释这三个主成分的意义,可以求各个主成分在原始的6个变量上的因子载荷量。如果主成分Y1对所有的变量的载荷都大致相等,就可以总结该主成分为身材大小成分;若第二主成分在胸围、肋围、腰围变量有相对较大或中等的正载荷量,在身高、坐高、手臂长有相对较大或中等的负载荷,就可以总结为胖瘦成分。所以,对提取的主成分的解释,除了借助因子载荷,也要根据实际问题进行总结,如果出现解释不了主成分,或者能够解释,但是主成分中的某些数据不符合实际情况,那也就意味着主成分分析的失败,此时只能换其它的方法了。

3.算法实现

兔兔这里以一种玉米的各个表现型数据为例,表现型分别为EH、SD、PH、FW、SFBN、IL、MEL、ELL、ELW、FLDW、ELA、TDW十二种,分别表示:穗位高(cm)、茎粗(cm)、株高(cm)、鲜质量(g)、雄花分枝数(个)、花序长度(cm)、雄穗长度(cm)、穗位叶长(cm)、穗位叶宽(cm)、功能叶干质量(g)、穗位叶面积(cm2)、总干质量(g)。

该数据集兔兔保存在corn.csv中,需要实际操作可以下载。我们这里就以相关阵的方法来进行主成分分析。

import numpy as np
import pandas as pd

df=pd.read_csv('corn.csv') #读取文件
df=pd.DataFrame(df)
R=df.corr() #样本相关阵
l,T=np.linalg.eig(R) #求特征值l与特征向量T,特征值默认从大到小排序
n,p=df.shape 
s=0
t=0
cr=[] #累计贡献率
for i in range(len(l)):
    t+=1
    contri=l[i]/np.sum(l) #第i主成分贡献率
    cr.append(contri)
    s+=contri #累计贡献率
    if s>=0.8: #累计贡献率达80%即停止
        break
pc=[] #主成分
for i in range(t):
    Y=np.dot(df,T[i].T) #计算第i主成分
    pc.append(Y)
factor_loading=[]
for i in range(t):
    a=[]
    for j in range(p):
        a.append(np.sqrt(l[i])*T[i][j]) #计算第i主成分在第j个变量上的载荷
    factor_loading.append(a)
factor_loading=np.array(factor_loading)
print('主成分个数:',t)
print('主成分:',np.mat(pc))
print('贡献率:',cr)
print('累计贡献率:',s)
print('因子载荷:',factor_loading)

通过上面的步骤,便可以求出各个数据。我们运行程序,发现只需要3个主成分便满足要求,并且累计贡献率接近88%,效果比较好。

通过最终的因子载荷,我们也能依据主成分在各个指标上的载荷大小来总结该主成分。不过我们发现,最终的主成分中含有负数值,但实际上,无论是叶片的面积,还是质量,或是总结成光合速率,都难以解释这些负数值,说明此时利用主成分分析是存在问题的,需要用其它的方法进行数据降维,如因子分析等。但如果不需要考虑实际意义,单纯就是进行数据降维,然后进一步做聚类、回归等,该方法也是可以使用的。

总结

主成分分析作为一种简便的数据降维方法,其应用还是十分广泛的,例如在基因组学、细胞学等生物学领域,或是其它学科,都可以找到主成分分析的实际应用。在使用主成分分析时需要了解其基本原理,掌握操作步骤,并能够对主成分进行合理解释,也需要了解该方法的缺陷。在实际的数据分析过程中,为了操作简便,也可采用SPSS等数据分析软件进行主成分分析,这样可以避免用代码实现该过程的繁琐。但如果需要真正理解主成分分析,深入理解数据分析、机器学习等知识,用代码实现这些公式的过程却是十分重要的。

有关主成分分析(PCA)详解的更多相关文章

  1. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  2. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  3. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  4. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  5. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  6. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  7. ruby-on-rails - 如何使用 ruby​​-prof 和 JMeter 分析 Rails - 2

    我想使用ruby​​-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby​​-prof可以写入任何输出之前杀死它。如何在不中断ruby​​-prof的情况下停止mongrel服务器? 最佳答案

  8. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  9. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  10. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

随机推荐