快速搞定PCA(主成分分析)(原理 代码 案例)

目录

一、基本介绍

1.1原理

1.2主成分分析的几何解释

1.3主要步骤

 1.4主成分个数的选取原则

 二、主成分分析代码

2.1MATLAB代码

 2.2Python代码

 三、实用案例

一、基本介绍

1.1原理

主成分分析是最常用的线性降维方法,通过某种线性投影,将高维的数据映射到低维的空间,并期望在所投影的维度上数据的信息量最大(方差最大),以较少的数据维度去反映原数据的特性。

在机器学习的实际问题中,一般都会有几十个指标,高维数据离散度较大,不利于训练出较好的参数,而低维数据则可以更好的训练参数,因此可以通过降维的形式,计算出k列映射数据替代原数据。

1.2主成分分析的几何解释

通过旋转变换坐标轴使得n个样品点在F1轴方向上的离散程度最大,即F1的方差最大。变量F1代表了原始数据的绝大部分信息,在研究某经济问题时,即使不考虑变量F2也无损大局。经过上述旋转变换原始数据的大部分信息集中到F1轴上,对数据中包含的信息起到了浓缩作用。 

1.3主要步骤

1. 求样本均值

\bar{X}=\frac{1}{n} \sum_{i=1}^{N}x_{i}

2.求样本协方差矩阵S

3.计算协方差矩阵的特征值和特征向量

4.将特征值排序

5.保留前N个最大的特征值对应的特征向量

6.将原始特征转换到上面得到的N个特征向量构建的新空间中

7.写出主成分的表达式

注:第五步和第六步,实现了特征压缩。 

每个主成分的系数平方和为1。即

 主成分之间相互独立,即无重叠的信息。即

 主成分的方差依次递减,重要性依次递减,即

1.4主成分个数的选取原则

首先需要计算各主成分的方差,再求出各自对应的方差贡献率(即对应主成分方差除以总方差), 根据累积贡献率的大小取前面m 个(m<p)主成分,p代表所有的主成分。

选取原则: ​​​​

 二、主成分分析代码

2.1MATLAB代码

clear;clc
PHO = [1     0.79    0.36    0.76    0.25    0.510.79  1       0.31    0.55    0.17    0.350.36  0.31    1       0.35    0.64    0.580.76  0.55    0.35    1       0.16    0.380.25  0.17    0.64    0.16    1       0.630.51  0.35    0.58    0.38    0.63    1];
[COEFF,latent,explained] = pcacov(PHO)
%分别代表协方差矩阵、特征值、贡献率
% 为了更加直观,以元胞数组形式显示结果
result1(1,:) = {'特征值', '差值', '贡献率', '累积贡献率'};
result1(2:7,1) = num2cell(latent);
result1(2:6,2) = num2cell(-diff(latent));
result1(2:7,3:4) = num2cell([explained, cumsum(explained)])
% 以元胞数组形式显示主成分表达式
s = {'标准化变量';'x1:身高';'x2:坐高';'x3:胸围';'x4:手臂长';'x5:肋围';'x6:腰围'};
result2(:,1) = s ;
result2(1, 2:4) = {'Prin1', 'Prin2', 'Prin3'};
result2(2:7, 2:4) = num2cell(COEFF(:,1:3))

 2.2Python代码

from sklearn.decomposition import PCA
import pandas as pd
import ospath=".csv"#存放文件路径
df=pd.read_csv(path)#读取文件pca=PCA()#创建对象
df=(df.iloc[:,2:]-df.iloc[:,2:].mean())/df.iloc[:,2:].std()#对数据进行中心化处理
#print(df)
pca.fit(df)
print(pca.components_)#返回模型的各个特征向量
print(pca.explained_variance_ratio_)#返回各个成分各自的方差百分比
pca=PCA(2)#设置转化主成分个数两个
pca.fit(df)
low_d=pca.transform(df)
print(low_d)#返回降维后的数据

 三、实用案例

下表列出了2007年我国31个省、市、自治州和直辖市的农村居民家庭平均每人全年消费性支出的8个主要变量数据。是根据这8个主要变量的观测数据,进行主成分分析。 

单位:元

地区

食  品

衣  着

居  住

家庭设备

及服务

交通和通讯

文教娱乐

用品及服务

医疗保健

 北  京

2132.51

513.44

1023.21

340.15

778.52

870.12

629.56

 天  津

1367.75

286.33

674.81

126.74

400.11

312.07

306.19

 河  北

1025.72

185.68

627.98

140.45

318.19

243.30

188.06

 山  西

1033.68

260.88

392.78

120.86

268.75

370.97

170.85

 内蒙古

1280.05

228.40

473.98

117.64

375.58

423.75

281.46

 辽  宁

1334.18

281.19

513.11

142.07

361.77

362.78

265.01

 吉  林

1240.93

227.96

399.11

120.95

337.46

339.77

311.37

 黑龙江

1077.34

254.01

691.02

104.99

335.28

312.32

272.49

 上  海

3259.48

475.51

2097.21

451.40

883.71

857.47

571.06

 江  苏

1968.88

251.29

752.73

228.51

543.97

642.52

263.85

 浙  江

2430.60

405.32

1498.50

338.80

782.98

750.69

452.44

 安  徽

1192.57

166.31

479.46

144.23

258.29

283.17

177.04

 福  建

1870.32

235.61

660.55

184.21

465.40

356.26

174.12

 江  西

1492.02

147.71

474.49

121.54

277.15

252.78

167.71

 山  东

1369.20

224.18

682.13

195.99

422.36

424.89

230.84

 河  南

1017.43

189.71

615.62

136.37

269.46

212.36

173.19

 湖  北

1479.04

168.64

434.91

166.25

281.12

284.13

178.77

 湖  南

1675.16

161.79

508.33

152.60

278.78

293.89

219.95

 广  东

2087.58

162.33

763.01

163.85

443.24

254.94

199.31

 广  西

1378.78

86.90

554.14

112.24

245.97

172.45

149.01

 海  南

1430.31

86.26

305.90

93.26

248.08

223.98

95.55

 重  庆

1376.00

136.34

263.73

138.34

208.69

195.97

168.57

 四  川

1435.52

156.65

366.45

142.64

241.49

177.19

174.75

 贵  州

998.39

99.44

329.64

70.93

154.52

147.31

79.31

 云  南

1226.69

112.52

586.07

107.15

216.67

181.73

167.92

 西  藏

1079.83

245.00

418.83

133.26

156.57

65.39

50.00

 陕  西

941.81

161.08

512.40

106.80

254.74

304.54

222.51

 甘  肃

944.14

112.20

295.23

91.40

186.17

208.90

149.82

 青  海

1069.04

191.80

359.74

122.17

292.10

135.13

229.28

 宁  夏

1019.35

184.26

450.55

109.27

265.76

192.00

239.40

 新  疆

939.03

218.18

445.02

91.45

234.70

166.27

210.69

clear;clc
[X,textdata] = xlsread('examp12_4_1.xls');
XZ = zscore(X);% 调用princomp函数根据标准化后原始样本观测数据作主成分分析
[COEFF,SCORE,latent,tsquare] = pca(XZ)% 为了直观,定义元胞数组result1,用来存放特征值、贡献率和累积贡献率等数据
explained = 100*latent/sum(latent);
[m, n] = size(X);
result1 = cell(n+1, 4);
result1(1,:) = {'特征值', '差值', '贡献率', '累积贡献率'};
result1(2:end,1) = num2cell(latent);
result1(2:end-1,2) = num2cell(-diff(latent));
result1(2:end,3:4) = num2cell([explained, cumsum(explained)])% 为了直观,定义元胞数组result2,用来存放前2个主成分表达式的系数数据
varname = textdata(3,2:end)';
result2 = cell(n+1, 3);
result2(1,:) = {'标准化变量', '主成分Prin1', '主成分Prin2'};
result2(2:end, 1) = varname;
result2(2:end, 2:end) = num2cell(COEFF(:,1:2))% 为了直观,定义元胞数组result3,用来存放每一个地区总的消费性支出,以及前2个主成分的得分数据
cityname = textdata(4:end,1);
sumXZ = sum(XZ,2);
[s1, id] = sortrows(SCORE,1);
result3 = cell(m+1, 4);
result3(1,:) = {'地区', '总支出', '第一主成分得分y1', '第二主成分得分y2'}; 
result3(2:end, 1) = cityname(id);
result3(2:end, 2:end) = num2cell([sumXZ(id), s1(:,1:2)])% 为了直观,定义元胞数组result4,用来存放前2个主成分的得分数据,以及(食品+其他)-(衣着+医疗)
cloth = sum(XZ(:,[1,8]),2) - sum(XZ(:,[2,7]),2);
[s2, id] = sortrows(SCORE,2);
result4 = cell(m+1, 4);
result4(1,:) = {'地区','第一主成分得分y1','第二主成分得分y2' ,'(食+其他)-(衣+医)'};
result4(2:end, 1) = cityname(id);
result4(2:end, 2:end) = num2cell([s2(:,1:2), cloth(id)])%***************************前两个主成分得分散点图***************************
for i = 1:length(X)
plot(SCORE(i,1),SCORE(i,2),'ko');
text(SCORE(i,1)+0.02,SCORE(i,2)+0.05,cityname{i},'FontSize',10,'fontname','宋体');
hold on
end
xlabel('第一主成分得分');
ylabel('第二主成分得分');
set(gca,'FontName','宋体');result5 = sortrows([cityname, num2cell(tsquare)],2);
[{'地区', '霍特林T^2统计量'}; result5]

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

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

相关文章

html文件查找关键词,批处理查找文件关键字下一行内容

批处理命令 显示所要查找字符串所在行和下面一行内假设查找内容为“问问”&#xff0c;查找文件为“a.txt”&#xff0c;输出文件为“b.txt”。 在线等Echo Off&Setlocal EnabledelayedexpansionFor /f "tokens1* delims:" %%i in (Type a.txt^|Findstr /n "…

Dev C++ 实现Hello World

新建源文件 打开 Dev C&#xff0c;在上方菜单栏中选择“文件 --> 新建 --> 源代码”&#xff1a; 或者按下CtrlN组合键&#xff0c;都会新建一个空白的源文件&#xff0c;如下图所示&#xff1a; 在空白文件中输入本文开头的代码 注意 *表示源文件没有保存 在上方菜…

没有bug队——加贝——Python 练习实例 19,20

19.题目&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 程序分析&#xff1a;请参照程序python实例14。我就不在这里过多介绍了。 for j in range(2,1001):k []n …

数据包络分析(DEA)详解(以第八届宁夏省赛为例)

目录 一、基本介绍 1.1原理 1.2CCR模型 1.3BCC模型 二、代码 2.1MATLAB代码 2.2Python代码 三、案例分析 3.1案例介绍 3.2案例分析 3.3案例求解 一、基本介绍 1.1原理 数据包络分析有多种模型&#xff0c;主要为&#xff1a;CCR模型&#xff0c;BBC模型、交叉模型、A&…

Spring Boot EasyUI datagrid

jQueryEasyUI详解 jQuery EasyUI是一组基于jQuery的UI插件集合体&#xff0c;而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面。 开发者不需要编写复杂的javascript&#xff0c;也不需要对css样式有深入的了解&#xff0c;开发者需要了解的只…

MATLAB使用教程(三)——在文件中编程

1.把matlab编码调整为utf-8编码 首先&#xff0c;删除这个部分&#xff08;一定先备份这个lcdata.xml文件&#xff0c;备份就是拷贝一个副本&#xff09;&#xff0c;我的是2016版&#xff0c;大概在这里&#xff0c;你们可以搜索以下&#xff1a; 然后&#xff0c;找到这个部分…

Spring Boot EasyUI edatagrid 扩展

edatagrid扩展组件详解 edatagrid组件是datagrid的扩展组件&#xff0c;增加了统一处理CRUD的功能&#xff0c;可以用在数据比较简单的页面。使用的时候需要额外引入jquery.edatagrid.js为了能够把后台自动捕获的异常显示到前台这里必须使用最新版本的jquery.edatagrid.js文件能…

MATLAB使用教程(4)——悄悄滴上手项目

目录 1.计算一元二次方程 2.看一元方程的图形 有个小疑问&#xff1f; 惊喜&#xff1a; 总结 1.计算一元二次方程 这一讲我们以科学计算开始&#xff0c;使用matlab计算精确度很高&#xff0c;我们可以尝试来计算一下黄金分割率&#xff08;定义大家可以自行百度一下&am…

两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案

数据采集习题参考答案&#xff0c;会持续更新&#xff0c;点个关注防丢失。为了方便寻找&#xff0c;按照头歌的门类从新整理了实训的分类&#xff0c;朋友们记得看标题哦&#xff0c;按标题寻找&#xff01; 该篇为爬虫知识储备&#xff01; 文章目录 实训一&#xff1a;HTM…

Spring Boot swagger之前后端分离

前后端分离详解 现在的趋势发展&#xff0c;需要把前后端开发和部署做到真正的分离做前端的谁也不想用Maven或者Gradle作为构建工具做后端的谁也不想要用Grunt或者Gulp作为构建工具前后端需要通过接口来协作 可能是JSON格式的RESTFul的接口可能是XML的接口重点是后台只负责数据…

MATLAB基础教程(5)——斐波那契数列

目录 前言 正文开始啦&#xff1a; 总体思路&#xff1a; 首先创建文件&#xff1a; 编写 fibo_use.m 文件的内容代码 编写 fibonacci_mine.m 文件中的代码 代码运行 总结&#xff1a; 前言 斐波那契数列是一个很有趣的数列&#xff0c;有趣的地方在两点&#xff0c;在…

数据采集与清洗基础习题(二)Python爬虫常用模块,头歌参考答案

数据采集习题参考答案&#xff0c;会持续更新&#xff0c;点个关注防丢失。为了方便查找&#xff0c;已按照头歌重新排版&#xff0c;朋友们按照头歌所属门类查找实训哦&#xff0c;该篇为Python爬虫常用模块。 创作不易&#xff0c;一键三连给博主一个支持呗。 文章目录 实…

Spring Boot freemarker导出word下载

freemarker详解 FreeMarker是一款模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本&#xff08;HTML网页、电子邮件、配置文件、源代码等&#xff09;的通用工具。 它不是面向最终用户的&#xff0c;而是一个Java类库&#xff0c;是一款程序…

学生用计算机怎么累加,计算机一级OFFICE辅导:累加小技巧

我们在工作中常常需要在已有数值的单元格中再增加或减去另一个数。一般是在计算器中计算后再覆盖原有的数据。这样操作起来很不方便。考试大编辑推荐一个小技巧&#xff0c;可以有效地简化老式的工作过程。(1).创建一个宏&#xff1a;选择Excel选单下的“工具→宏→录制新宏”选…

不同进制之间的转化

将二进制、八进制、十六进制转换为十进制 二进制、八进制和十六进制向十进制转换都非常容易&#xff0c;就是“按权相加”。所谓“权”&#xff0c;也即“位权”。 假设当前数字是 N 进制&#xff0c;那么&#xff1a; 对于整数部分&#xff0c;从右往左看&#xff0c;第 i 位…

[刨根问底] 五分钟搞懂组合评价模型—模糊Borda (以2021 年大学生数模国赛C题为例)

组合评价模型—模糊Borda(Matlab) 我们的征途是星辰大海&#xff0c;而并非烟尘人间。 目录 组合评价模型—模糊Borda(Matlab) 一、模糊Borda法简介 二、模糊Borda法主要步骤 &#xff08;1&#xff09;计算隶属度 &#xff08;2&#xff09;计算模糊频数 &#xff08;…

计算机桌面右键新建展不开,Win10右键新建不见了怎么办?Win10电脑桌面右键新建没有了解决方法...

近期有Win10用户遇到一个问题&#xff0c;也就是电脑桌面右键新建没有了&#xff0c;比如想要创建一个文本文档、文件夹、Word&#xff0c;没有新建功能无法创建&#xff0c;那么Win10右键新建不见了怎么办&#xff1f;下面装机之家分享一下Win10电脑桌面右键新建没有了解决方法…

最常用的客观赋权方法——熵权法

我们的征途是星辰大海&#xff0c;而并非烟尘人间。 文章目录 一、熵权法的原理 1.1 信息熵 1.2 熵权法 二、熵权法的主要步骤 2.1 数据标准化 2.2 求各指标在各方案下的比值 2.3 求各指标的信息熵。 2.4 确定各指标的权重 2.4.1 通过信息熵计算各指标的权重&#…

2017韩老师计算机网络,2017年计算机等考三级网络技术辅导:计算机网络拓扑结构...

1&#xff0e;计算机网络拓扑的定义计算机网络设计的第一步就是网络拓扑设计。拓扑学是几何学的一个分支。计算机网络拓扑是通过网中结点与通信线路之间的几何关系表示网络结构&#xff0c;反映出网络各实体之间的结构关系。2&#xff0e;网络拓扑的分类网络拓扑可以根据通信子…

Spring Boot html页面解析之jsoup

目的 我们要对一个页面进行数据抓取&#xff0c;并导出doc文档 html解析器 jsoup 直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于JQuery的操作方法来取出和操作数据。 htmlparser 提供了线性和嵌套两种方…