主成分分析及其matlab实现

news/2024/11/16 9:23:41/文章来源:https://www.cnblogs.com/dlmuwxw/p/18294808

本讲将介绍主成分分析(Principal Component Analysis,PCA),它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关。一般来说,当研究的问题涉及到多变量且变量之间存在很强的相关性时,我们可考虑使用主成分分析的方法来对数据进行简化。

目录
  • 一、问题提出
  • 二、主成分分析思想
  • 三、PCA的计算步骤
    • 1.标准化处理
    • 2.计算标准化样本的协方差矩阵
    • 3.将前两步骤合为一步————计算相关系数矩阵
    • 4.计算R的特征值和特征向量
    • 5.计算主成分贡献率以及累计贡献率
    • 6.写出主成分
    • 7.根据系数分析主成分代表的意义(困难且关键)
    • 8.利用主成分的结果进行后续的分析
    • 9.主成分分析的说明
  • 三、主成分分析matlab代码详解
    • 1.计算样本相关系数矩阵
    • 2.计算R的特征值和特征向量
    • 3.计算主成分贡献率和累计贡献率
    • 4.处理特征向量矩阵
    • 5.计算我们所需要的主成分的值
  • 四、主成分聚类
    • 1.进行系统聚类
    • 2.图表构建器创造聚类图
  • 五、主成分回归

一、问题提出

某人要做一件上衣要测量很多尺寸,如身长、袖长、胸围、腰围、肩宽、肩厚等十几项指标,但某服装厂要生产一批新型服装绝不可能把尺寸的型号分得过多?而是从多种指标中综合成几个少数的综合指标,做为分类的型号,利用主成分分析将十几项指标综合成3项指标,一项是反映长度的指标,一项是反映胖瘦的指标,一项是反映特殊体型的指标
主成分分析是把原来多个变量划为少数几个综合指标的一种统计分析方法。

二、主成分分析思想

将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且主成分之间无相关性

三、PCA的计算步骤

1.标准化处理

2.计算标准化样本的协方差矩阵

3.将前两步骤合为一步————计算相关系数矩阵

4.计算R的特征值和特征向量

5.计算主成分贡献率以及累计贡献率

6.写出主成分

7.根据系数分析主成分代表的意义(困难且关键)

对于某个主成分而言,指标前面的系数越大,代表该指标对于该主成分的影响越大。通过这一原则,我们需要分析出我们得到的主成分到底代表着什么,不然将毫无意义

8.利用主成分的结果进行后续的分析

主成分分析可以用于聚类,其最大的好处就是能够将多个指标转化成两个指标,画出聚类图。
而主成分分析用于回归则是可以有效避免多重共线性的问题,毕竟提取主成分的前提就是主成分之间无相关性

9.主成分分析的说明

主成分的解释其含义一般多少带有点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价。
主成分分析的困难之处主要在于要能够给出主成分的较好解释,所提取的主成分中如有一个主成分解释不了,整个主成分分析也就失败了。

三、主成分分析matlab代码详解

我们以31个省份在各个领域内的平均消费数据为例,此处有31个个案,8个指标

1.计算样本相关系数矩阵

x是一个31行,8列的数据,计算相关系数矩阵后得到一个8行8列的矩阵
R = corrcoef(x)

2.计算R的特征值和特征向量

得到特征向量vector与一个特征值在对角线上的对角矩阵
[V,D] = eig(R)

3.计算主成分贡献率和累计贡献率

lambda = diag(D);  % diag函数用于得到一个矩阵的主对角线元素值(返回的是列向量)
lambda = lambda(end:-1:1);  % 因为lambda向量是从小大到排序的,我们将其调个头
contribution_rate = lambda / sum(lambda);  % 计算贡献率
cum_contribution_rate = cumsum(lambda)/ sum(lambda);   % 计算累计贡献率  cumsum是求累加值的函数
disp('特征值为:')
disp(lambda')  % 转置为行向量,方便展示
disp('贡献率为:')
disp(contribution_rate')
disp('累计贡献率为:')
disp(cum_contribution_rate')

4.处理特征向量矩阵

由于matlab内置的计算特征值与特征向量的函数返回的值是从小到大排序的,这里我们需要将特征值与特征向量从大到小排序(优先选用贡献率大的主成分)

disp('与特征值对应的特征向量矩阵为:')
% 注意:这里的特征向量要和特征值一一对应,之前特征值相当于颠倒过来了,因此特征向量的各列需要颠倒过来
%  rot90函数可以使一个矩阵逆时针旋转90度,然后再转置,就可以实现将矩阵的列颠倒的效果
V=rot90(V)';
disp(V)

5.计算我们所需要的主成分的值

在上一步我们已经计算出了累积贡献率,那么在这可以由用户从累积贡献率判断选取m个主成分,然后进行一个m次的循环,得出主成分的值
返回的F矩阵是一个31行,2列的矩阵。其意义是31个个案对应的两个主成分的指标

m =input('请输入需要保存的主成分的个数:  ');
F = zeros(n,m);  %初始化保存主成分的矩阵(每一列是一个主成分)
for i = 1:mai = V(:,i)';   % 将第i个特征向量取出,并转置为行向量Ai = repmat(ai,n,1);   % 将这个行向量重复n次,构成一个n*p的矩阵F(:, i) = sum(Ai .* X, 2);  % 注意,对标准化的数据求了权重后要计算每一行的和
end

四、主成分聚类

我们得到了由31个个案,2个指标组成的矩阵,这样我们可以根据这两个指标对这31个个案进行聚类,并且能够方便画出其聚类图

1.进行系统聚类

这里我们使用系统聚类,通过谱系图判断聚三类,把聚三类的结果保存到我们的数据集中

2.图表构建器创造聚类图

这里我们利用图表构建器创造聚类图,设置如图所示,把颜色依据设置为聚类结果,点ID标签设置为省份,这样图上就会显示出省份的名称

五、主成分回归

主成分回归:将x使用主成分得到主成分指标,并将y标准化,接着导出到Excel,然后再使用spss回归
Y = zscore(y); % 一定要将y进行标准化哦~
在Excel第一行输入指标名称(Y,F1, F2, ..., Fm)
分别双击Matlab工作区的Y和F,进入变量编辑中,然后复制里面的数据到Excel表格
导出数据之后,我们后续的分析就可以在Stata中进行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于ComfyUI的一些Tips

关于ComfyUI的一些Tips 前言: 最近发的ComfyUI相关文章节奏不知道会不会很快,在创作的时候没有考虑很多,想着把自己的知识分享出去。后台也看到很多私信,有各种各样的问题,这是我欠缺考虑了,今天这篇文章呢,根据私信的问题我大致整理了一下,给大家一些小tips。 目录 一…

2024暑假集训测试2

前言比赛链接。T1、T4 比较简单,打完基本就罚坐了,想了三个小时的 T2、T3 也没想出来。 T1 酸碱度中和 二分答案加贪心即可,先排序,每瓶可装 \(a_i\sim a_i+2*m\)。点击查看代码 #include<bits/stdc++.h> #define int long long #define endl \n #define sort stable…

HAJX[2024] 15Day游记

洛谷食用 博客食用 简介:这是一个正在学习C++的OIer(很蒻很蒻)的日常记录。 (注:2024.7.5-7.20集训日更) 放在前面: 本贴只是记录一下本蒟蒻的生活,(太菜了),佬们轻喷谢谢~浏览次数:(由于网站原因可能无法显示,属于正常现象)Day 0 期待集训ing 。0-上午 在来的路上…

闲话 24.7.10

另类的……杨图!闲话 啊,zzz 真好玩啊! 慢热型,战斗非重点,美术风格超赞。如果不排斥米家 f2p 游戏,推荐大家玩一玩。 我是冲着妹妹去的 未来会补一些杨表公式的证明。现在先咕! 推歌:辰砂 by Licis et al. feat 洛天依AI 增补:另类杨图对应杨表计数 前置知识:杨表 什…

量化交易入门:如何在QMT中配置Python环境,安装第三方依赖包

哈喽,大家好,我是木头左!引言 QMT,作为量化交易系统中的佼佼者,以其强大的功能和灵活的操作性,受到了广大投资者的青睐。但是,对于很多新手来说,如何在QMT中配置Python环境,安装第三方依赖包,却是一个让人头疼的问题。本文将从零开始,手把手教你如何在QMT中配置Pyth…

uniapp-Java使用AES加密解密

操作前 uniapp 需要安装 npm install crypto-js 在需要使用的界面加入 import CryptoJS from crypto-js java端<!-- spring security 安全认证 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-s…

python项目导入上级目录设置”的setting.json是不是哪里还有错误呀?

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【王者级混子】问了一个Python代码处理的问题,问题如下:大佬们,我想问问我抄网上“vscode运行python项目导入上级目录设置”的setting.json是不是哪里还有错误呀?还是没法导入上级目录二、实现过程 这里后来很…

伙伴活动|AI硬件大潮来袭,深圳的创客们在哪里?

「每一种硬件产品,都会被 GenAI 重新做一遍。」分享一个社区伙伴「未来光锥」参与主办的活动。如果你同时对 AI 和硬件感兴趣,提到 maker 一词仍然会激动。推荐你参与这次活动。AI 玩具Folotoy 的创始人、RTE 开发者社区成员王乐也将参与本次活动并分享。也推荐你收听王乐参与…

Cilium Socket LB 特性

Cilium Socket LB 特性Cilium Socket LB 一、环境信息主机 IPubuntu 172.16.94.141软件 版本docker 26.1.4helm v3.15.0-rc.2kind 0.18.0kubernetes 1.23.4ubuntu os Ubuntu 20.04.6 LTSkernel 5.11.5 内核升级文档二、Cilium SocketLB 模式认知 负载均衡的实现方式通常有如下两…

高考后第一次Codeforces Round 952 (Div. 4)

A Creating Words 思路:拿一个容器交换两数值即可 #include<bits/stdc++.h> using namespace std; const int N = 100001; char a[N],b[N]; int main() {int n;scanf("%d",&n);while(n--){scanf("%s %s",a,b);char jiaohuan = a[0];a[0] = b[0]…

前端如何取消接口调用

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 1. xmlHttpRequest是如何取消请求的?实例化的XMLHttpRequest对象上也有abort方法const xhr = new XMLHttpRequest(); xhr.addEventListener(load, function(e) {console.log(this.responseText); }); xhr.open(GET, htt…

篮球比赛电子计分牌

在学习单片机课设“篮球比赛电子计分牌”的时候遇到了很多问题。在网上搜索到的资源很杂很乱,很多内容都需要付费,在学习的过程遇到了不少的阻力,因此我打算把我所做的拿出来与大家共同讨论,不足的地方还请多多指教哈。学艺不精,成绩仅为良好,大家参考就行。另外能激发后…