主成分分析(PCA)Python

news2024/11/17 7:53:05

         实际问题研究中,常常遇到多变量问题,变量越多,问题往往越复杂,且各个变量之间往往有联系。于是,我们想到能不能用较少的新变量代替原本较多的旧变量,且使这些较少的新变量尽可能多地保留原来变量所反映的信息

比如说一件上衣,有身长、袖长、胸围、腰围等等十多个指标,将型号分这么多很麻烦,因此,厂家将十多项指标综合成3项指标,分别反映长度、胖瘦、特殊体型。

 变量具有相关性,同时就意味着反映的信息有重叠性,主成分分析就是将重复的变量(关系紧密的变量)删去,建立尽可能少的、互相无关的新变量。

设法将原来变量重新组合成一组新的互相无关的几个综合变量,同时根据实际需要从中取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析法,也是数学上用来降维的一种方法。 

通过PCA将n维原始特征映射到k维上(k<n),称这k维为主成分。

找新的维度实质上要使数据间的方差够大,即在新维度下坐标点足够分散、数据间有区分。本质上也就是在做基变换。

下图是一个例子,将5个点降维到一条直线上。

 代数上,可以理解为m × n的原始样本X,与n×k阶的矩阵W做矩阵乘法,得到m×k阶低维矩阵Y

分析思想

        假设有n个样板,p个指标,则可以构成大小为n×p的样本矩阵X:

x=\begin{bmatrix} x_{11} &x_{12} &... &x_{1p} \\ x_{21} &x_{22} & ...& x_{2p} \\ ... &... & ... & ...\\ x_{n1} &x_{n2} &... & x_{np} \end{bmatrix}=(x_1,x_2,...x_p)

假设我们想找到新的一组变量z_1,z_2,...,z_m(m\le p),其满足

\left\{\begin{matrix} z_1=l_{11}x_1+l_{12}x_2+...+l_{1p}x_p\\ z_2=l_{21}x_1+l_{22}x_2+...+l_{2p}x_p\\ ...\\ z_m=l_{m1}x_1+l_{m2}x_2+...+l_{mp}x_p \end{matrix}\right. 

系数l_{ij}确定原则:

  • z_iz_j(i\neq j;i,j=1,2,...,m) 线性无关
  • z_kx_1,x_2,...x_p线性组合中方差第k大者,称原变量指标的第k主成分

PCA计算步骤

  1. 标准化处理X_{ij}=\frac{x_{ij}-\overline{x_j}}{S_j}
  2. 计算标准化样本的协方差矩阵R=\begin{bmatrix} r_{11} &r_{12} &... &r_{1p} \\ r_{21} &r_{22} & ...& r_{2p} \\ ... &... & ... & ...\\ r_{n1} &r_{n2} &... & r_{np} \end{bmatrix}
  3. 计算R的特征值和特征向量(特征值从大到小排序)
  4. 计算主成分贡献率以及累计贡献率
  5. 贡献率\alpha_i=\frac{\lambda_i}{\sum_{k=1}^{p}\lambda_k}(i=1,2,...,p)
  6. 累计贡献率\sum G=\frac{\sum_{k-1}^{i}\lambda}{\sum_{k=1}^{p} \lambda_k }(i=1,2,...,p)
  7. 写出主成分:一般取累计贡献率超过80%的特征值所对应的第1,2,...,m个主成分。其中第 i 个是F_i=a_{1i}X_1+a_{2i}X_2+...+a_{pi}X_p(i=1,2,...,m) (a_i是第i个特征向量)
  8. 根据系数分析主成分代表的意义

 Python代码

         这段代码将Iris数据集降维到二维空间,并使用散点图展示不同类别的鸢尾花在降维后的空间中的分布情况。详见注释。

import matplotlib.pyplot as plt  # 加载matplotlib用于数据的可视化
from sklearn.decomposition import PCA  # 加载PCA算法包
from sklearn.datasets import load_iris  # 从sklearn库中导入load_iris函数,用于加载Iris数据集。

data = load_iris()  # 使用load_iris函数加载Iris数据集。
y = data.target  # 提取数据集的标签(目标变量),表示不同种类的鸢尾花。
x = data.data  # 提取数据集的特征,表示鸢尾花的四个特征。
pca = PCA(n_components=2)  # 加载PCA算法,设置降维后主成分数目为2
reduced_x = pca.fit_transform(x)  # 对原始数据进行PCA降维,将数据转换为新的二维空间。
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
#  初始化三个颜色类别(红色、蓝色、绿色)的坐标列表。
for i in range(len(reduced_x)):  # 遍历降维后的数据
    if y[i] == 0:  # 如果数据点属于第一类鸢尾花。
        red_x.append(reduced_x[i][0])
        red_y.append(reduced_x[i][1])
        # 将该点在降维后的第一个主成分的坐标添加到红色类别的x坐标列表中。
        # 将该点在降维后的第二个主成分的坐标添加到红色类别的y坐标列表中。
    elif y[i] == 1:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])
    else:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
# 可视化
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()

结果

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

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

相关文章

力扣1312. 让字符串成为回文串的最少插入次数

动态规划 思路&#xff1a; 通过插入字符构造回文串&#xff0c;要想插入次数最少&#xff0c;可以将字符串 s 的逆序 s 进行比较找出最长公共子序列&#xff1b;可以先分析&#xff0c;字符串 s 通过插入得到回文串 ps&#xff0c;其中间的字符应该不会变化&#xff1a; 若 s…

༺༽༾ཊ—设计-工厂-04-方法-模式—ཏ༿༼༻

名称&#xff1a;工厂方法 类型&#xff1a;创建型 目的&#xff1a;用 工厂方法 代替 new操作 创建实例 的方式 优点&#xff1a;易扩展 工厂方法模式是为了克服简单工厂模式的缺点&#xff08;主要是为了满足OCP&#xff09;而设计出来的。简单工厂模式的工厂类随着产品类…

element plus使用问题

文章目录 element plusvue.config.js注意1、有时候会报错 not a function2、使用 ElMessage 报错3、 element plus 版本过高4、警告Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined.5、报错 ResizeObserver loop completed with undelivered noti…

HTML新手教程

HTML入门 教程&#xff1a;【狂神说Java】HTML5完整教学通俗易懂_哔哩哔哩_bilibili 一.初识HTML HyperTextMarkupLanguage&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画。 HTML5的优势 世界知名浏览器厂商对HTML5的支持市场的…

IEC 104电力规约详细解读(一) - 报文结构、报文分类、ASDU

协议一般规则&#xff1a; 平衡方式传输&#xff1b;也就是说每一个过程的会话&#xff0c;没有规定谁从头发起&#xff0c;双方均可一般情况下配电主站作为TCP的客户端&#xff0c;配电终端作为TCP的服务器TCP的默认端口号是2404 一、报文结构 APCI 应用规约控制信息&#xff…

cmd如何查看端口占用情况?

①输入命令【netstat -ano】可以查看所有端口的使用情况 Windows系统的端口有以下几种状态&#xff1a; LISTENING&#xff08;侦听状态&#xff09;&#xff1a;表示该端口是开放的&#xff0c;可以提供服务。 ESTABLISHED&#xff08;已建立连接&#xff09;&#xff1a;表示…

如何用一根网线和51单片机做简单门禁[带破解器]

仓库:https://github.com/MartinxMax/Simple_Door 支持原创是您给我的最大动力… 原理 -基础设备代码程序- -Arduino爆破器程序 or 51爆破器程序- 任意选一个都可以用… —Arduino带TFT屏幕——— —51带LCD1602——— 基础设备的最大密码长度是0x7F&#xff0c;因为有一位…

[NISACTF 2022]sign-ezc++

IDA打开 int __cdecl main(int argc, const char **argv, const char **envp) {Human *v3; // rbxHuman *v4; // rbxchar v6[23]; // [rsp20h] [rbp-20h] BYREFchar v7; // [rsp37h] [rbp-9h] BYREFHuman *v8; // [rsp38h] [rbp-8h]_main(argc, argv, envp);std::allocator<…

YOLOv8-Seg改进:轻量级Slim-Neck,助力分割,轻量化的同时实现涨点

🚀🚀🚀本文改进:采用 GSConv 方法的 Slim-Neck,并充分利用深度可分离卷积 DSC 的优势 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性…

idea结合git回到某个提交点

概述&#xff1a;在IntelliJ IDEA中&#xff0c;你可以使用Git工具来回到某个提交点。 第一步&#xff1a;打开idea&#xff0c;打开git的管理面 可以看到&#xff0c;由于我的大改动&#xff0c;导致现在出问题了&#xff0c;所以我准备回退到某一版本。 点击左下角的git 点…

isctf---web

圣杯战争 php反序列 ?payloadO:6:"summon":2:{s:5:"Saber";O:8:"artifact":2:{s:10:"excalibuer";O:7:"prepare":1:{s:7:"release";O:5:"saber":1:{s:6:"weapon";s:52:"php://filter…

3 款最好的电脑硬盘数据迁移软件

您将从本页了解 3 款最好的 SSD硬盘数据迁移软件&#xff0c;磁盘供应商提供的软件和可靠的第三方软件。仔细阅读本文并做出您的选择。 什么是数据迁移&#xff1f; 数据迁移是将数据移动到其他计算机或存储设备的过程。在日常工作活动中&#xff0c;常见的数据迁移有三种&…

【Uni-App】Vuex在vue3版本中的使用与持久化

Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简而言之就是用来存数据&#xff0c;可以有效减少使用组件传参出现的问题。 基本元素&#xff1a;…

x-cmd pkg | 7za - 7-Zip 的命令行版本

目录 简介首次用户主要特征竞品和相关作品进一步阅读 简介 7za 是一个开源的文件压缩和解压工具&#xff0c;是 7-Zip 的命令行版本。 7z 是一种拥有极高压缩比的格式&#xff0c;7za 提供压缩&#xff0c;解压&#xff0c;列举文件等功能除此之外&#xff0c;7za 还支持多种…

常见电源电路(LDO、非隔离拓扑和隔离拓扑结构)

一、常见电路元件和符号 二、DC-DC转换器 DC-DC转换器&#xff1a;即直流-直流转换器&#xff0c;分为三类&#xff1a;①线性调节器&#xff1b;②电容性开关解调器&#xff1b;③电感性开关调节器&#xff1b; 2.1线性稳压器&#xff08;LDO&#xff09; 2.1.1 NMOS LDO…

力扣hot100 字符串解码 栈 辅助栈

Problem: 394. 字符串解码 文章目录 思路&#x1f496; 辅助栈 思路 &#x1f468;‍&#x1f3eb; 路飞 &#x1f496; 辅助栈 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public String decodeString(String s…

统一聚合支付系统一个支付系统包含微信支付宝支付接口可对外提供多个网站使用同一个支付系统的初探与逻辑图

#聚合支付# #小李子9479# 开发背景 作为一个合格的站长或者运营&#xff0c;基本上都有好几个网站&#xff0c;而变现的方式其中之一就是付费。经常使用的付费包含微信支付和支付宝支付。微信的jsapi支付需要使用到openid&#xff0c;而获取openid需要设置授权域名&#xff…

Android如何通过按钮实现页面跳转方法

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;在Android应用开发中&#xff0c;页面跳转是一项基本且常见的功能。通过按钮实现页面跳转可以为用户提供更好的交互体验&#xff0c;使应用更加灵活和易用。本文将介绍Android Studio中如何通过按钮实现页面跳转的方法&#xf…

力扣精选算法100题——在排序数组中查找元素的第一个和最后一个位置(二分查找专题)

目录 第一步&#xff1a;了解题意 第二步&#xff1a;算法原理 &#x1f6a9;查找区间左端点值 ❗处理细节 循环条件&#xff1a; 求中点 &#x1f6a9;查找区间右端点值 ❗处理细节 循环条件 求中点 &#x1f6a9;总结 第三步&#xff1a;代码实现 第四步:总结模…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。