目录

一、基本介绍

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. 求样本均值

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]

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

  1. 快速搞定Jupyter Notebook添加代码自动补全功能

    本次要介绍的两个功能是: (1)针对 jupyter notebook 中的 Markdown 文件自动生成目录 (2)自动补全代码 上述两个功能,都是有 python的一个 jupyter 扩展插件 ...

  2. 一行代码快速搞定Flowable断点下载(下)

    一行代码快速搞定Flowable断点下载(下) 其实这个主题对应的三篇文章真的真的非常难写,首先是感觉非常多人对于函数式编程不太熟悉,然后又有一些人对于kotlin不太熟悉.这就导致了,写这三篇文章的 ...

  3. 一行代码快速搞定Flowable断点下载(中)

    一行代码快速搞定Flowable断点下载(中) 感觉上一篇家常聊了太多,这一篇就直接进入正题,首先来看一下,通过存储化以及方法拓展技术将mComposableDisposable的相关逻辑也从抽象Ac ...

  4. 一行代码快速搞定Flowable断点下载(上)

    一行代码快速搞定Flowable断点下载(上) 之前我们大致讲了讲,到底怎么完全将disposable相关代码完全隐藏. 然后到了这里,可能有些杠精就会说了,你那个方式,我们不是完全不能拿到Flowa ...

  5. 手把手教你制作微信小程序,开源、免费、快速搞定

    最近做了个"罗孚传车"的小程序 一时兴起,做了一个小程序,将个人收集的同汽车相关的行业资讯和学习资料,分享到小程序中,既作为历史资料保存,又提供给更多的人学习和了解,还能装一下:) ...

  6. 快速搞定前端技术一面 匹配大厂面试要求学习笔记

    快速搞定前端技术一面 匹配大厂面试要求学习笔记 第1章 课程介绍[说说面试的那些事儿] 本章会出几个面试题,分析每道题目设计的知识点,然后总结出一个完整的知识体系.让我们开始 "题目-> ...

  7. 【快速搞定】教你如何快速集成环信(android端EaseUI),跳过我踩过的坑

    [快速搞定]教你如何快速集成环信(android端EaseUI),跳过我踩过的坑 一.前言 最近,公司准备集成一个即时通讯的功能,于是我找到了环信,于是我就这样被坑了,于是就有了本文来教大家如何跳出我 ...

  8. 白话经典算法系列之六 快速排序 快速搞定

    快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个 ...

  9. 【转载】白话经典算法系列之六 快速排序 快速搞定

    原文地址:http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经 ...

最新文章

  1. 超低费用将推动BCH在Token系统中脱颖而出
  2. DataSet DataTable操作
  3. 牛人主页(主页有很多论文代码)【真的好强大】
  4. python 读取geotiff_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...
  5. Randomatic mac - AE随机摆动的字母图层效果脚本
  6. 我这几年来是如何编写 Go HTTP 服务的(转载)
  7. mysql中计算日期整数差
  8. RxSwift 5官方Demo调试和学习资源
  9. [附源码]Java计算机毕业设计SSM公立医院绩效考核系统
  10. ACM算法笔记(一)模拟算法【详细解析】
  11. 记,当找不到图片时,显示默认图片
  12. java山地车 故障,十年骑龄车友总结山地车保养维修技巧
  13. 解决国外链接下载软件速度慢的方法
  14. 人民币利率互换小幅上行,通胀不乐观致紧缩预期趋浓_183
  15. 07 仿网易严选微信小程序商城
  16. android卡在gradle,Android Studio打开新项目卡在Gradle的问题
  17. Spring各jar包的作用
  18. 常用好的网址汇总(个人喜欢的)
  19. nginx的安装(亲测)
  20. STC12C5A60S2单片机-双串口通信

热门文章

  1. 陌陌运营启示录:千万别拿约炮说事
  2. 【图像识别】初探数字识别-水表(3)
  3. canvas绘制图片,图片变模糊
  4. 求根号2的小数点后10000位,字节面试题随想
  5. MSER最稳定极值区域源码分析
  6. 落地警务云平台存储标准 规范公安信息
  7. 平价质量又好的国产蓝牙耳机有哪些?
  8. 你们都开工了,我才刚开始复盘
  9. 003-驾照考试,总结
  10. 【promptulate专栏】使用ChatGPT和XMind快速构建思维导图