我的编程空间,编程开发者的网络收藏夹
学习永远不晚

主成分分析(PCA)详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

主成分分析(PCA)详解

主成分分析(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)......旋转坐标轴后,坐标为(\sqrt{5},0)、(2\sqrt{5},0)......这样主成分就是新坐标系下变量x的数值:\sqrt{5}, 2\sqrt{5},3\sqrt{5},...

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

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

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

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

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

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

Y_{i}=X.T_{i} \ ,1\leq i\leq p

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

\varphi _{k}=\frac{\lambda_{k}}{\sum_{i=1}^{p}\lambda_{i}}

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

\Psi _{m}=\frac{\sum_{k=1}^{m}\lambda_{k}}{\sum_{k=1}^{p}\lambda_{k}}=\sum_{k=1}^{m}\varphi _{k}

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

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

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

\rho(Y_{k},X_{i})=\sqrt{\frac{\lambda_{k}}{\sigma_{ii}}}T_{ki}

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

\rho(Y_{k},X_{i})=\sqrt{\frac{\lambda_{k}}{R_{ii}}}T_{ki}=\sqrt{\lambda_{k}}.T_{ki}

其中R_{ii}表示相关阵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 npimport pandas as pddf=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=0t=0cr=[] #累计贡献率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%即停止        breakpc=[] #主成分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等数据分析软件进行主成分分析,这样可以避免用代码实现该过程的繁琐。但如果需要真正理解主成分分析,深入理解数据分析、机器学习等知识,用代码实现这些公式的过程却是十分重要的。

来源地址:https://blog.csdn.net/weixin_60737527/article/details/125144416

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

主成分分析(PCA)详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MATLAB中如何实现主成分分析

在MATLAB中,可以使用pca函数来实现主成分分析。使用方法如下:% 生成样本数据data = randn(100, 3); % 生成100个样本数据,每个样本有3个特征% 进行主成分分析[coeff, score, latent,
MATLAB中如何实现主成分分析
2024-04-03

详细分析MySQL主从复制

前言: 在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同
2022-05-13

怎么使用R语言进行主成分分析

在R语言中进行主成分分析通常使用prcomp函数。以下是一个简单的示例:# 生成一些随机数据set.seed(123)data <- matrix(rnorm(100), nrow = 10)# 进行主成分分析pca <- prco
怎么使用R语言进行主成分分析
2024-04-03

R语言中怎么实现PCA分析与可视化

这期内容当中小编将会给大家带来有关R语言中怎么实现PCA分析与可视化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 常用术语(1)标准化(Scale)如果不对数据进行scale处理,本身数值大的基因对
2023-06-08

Android LayoutInflater.inflate()详解及分析

Android LayoutInflater.inflate()详解 深入理解LayoutInflater.inflate()由于我们很容易习惯公式化的预置代码,有时我们会忽略很优雅的细节。LayoutInflater以及它在Fragme
2022-06-06

Reactcommit源码分析详解

前两章讲到了,react在render阶段的completeUnitWork执行完毕后,就执行commitRoot进入到了commit阶段,本章将讲解commit阶段执行过程源码
2022-11-13

Python机器学习之PCA降维算法的示例分析

小编给大家分享一下Python机器学习之PCA降维算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、算法概述主成分分析 (Principal Com
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录