主成分分析(PCA)Python
实际问题研究中,常常遇到多变量问题,变量越多,问题往往越复杂,且各个变量之间往往有联系。于是,我们想到能不能用较少的新变量代替原本较多的旧变量,且使这些较少的新变量尽可能多地保留原来变量所反映的信息。
比如说一件上衣,有身长、袖长、胸围、腰围等等十多个指标,将型号分这么多很麻烦,因此,厂家将十多项指标综合成3项指标,分别反映长度、胖瘦、特殊体型。
变量具有相关性,同时就意味着反映的信息有重叠性,主成分分析就是将重复的变量(关系紧密的变量)删去,建立尽可能少的、互相无关的新变量。
设法将原来变量重新组合成一组新的互相无关的几个综合变量,同时根据实际需要从中取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析法,也是数学上用来降维的一种方法。
通过PCA将n维原始特征映射到k维上(k<n),称这k维为主成分。
找新的维度实质上要使数据间的方差够大,即在新维度下坐标点足够分散、数据间有区分。本质上也就是在做基变换。
下图是一个例子,将5个点降维到一条直线上。

代数上,可以理解为m × n的原始样本X,与n×k阶的矩阵W做矩阵乘法,得到m×k阶低维矩阵Y。
分析思想
假设有n个样板,p个指标,则可以构成大小为n×p的样本矩阵X:
假设我们想找到新的一组变量,其满足
系数确定原则:
与
(
) 线性无关
是
线性组合中方差第k大者,称原变量指标的第k主成分
PCA计算步骤
- 标准化处理
- 计算标准化样本的协方差矩阵
- 计算R的特征值和特征向量(特征值从大到小排序)
- 计算主成分贡献率以及累计贡献率
- 贡献率
- 累计贡献率
- 写出主成分:一般取累计贡献率超过80%的特征值所对应的第1,2,...,m个主成分。其中第 i 个是
(
是第i个特征向量)
- 根据系数分析主成分代表的意义
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()
结果

相关文章:
主成分分析(PCA)Python
实际问题研究中,常常遇到多变量问题,变量越多,问题往往越复杂,且各个变量之间往往有联系。于是,我们想到能不能用较少的新变量代替原本较多的旧变量,且使这些较少的新变量尽可能多地保留原来变量所反映的信…...
Leetcode—144. 二叉树的前序遍历【简单】
2023每日刷题(九十六) Leetcode—144. 二叉树的前序遍历 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr…...
混淆矩阵、准确率、查准率、查全率、DSC、IoU、敏感度的计算
1.背景介绍 在训练的模型的时候,需要评价模型的好坏,就涉及到混淆矩阵、准确率、查准率、查全率、DSC、IoU、敏感度的计算。 2、混淆矩阵的概念 所谓的混淆矩阵如下表所示: TP:真正类,真的正例被预测为正例 FN:假负类…...
ChatGPT目前的AI一哥
ChatGPT和文心一言是两个不同的AI助手,各自有其独特的特点和应用场景。以下是对它们在智能回复、语言准确性和知识库丰富度等方面的简要比较: 智能回复:ChatGPT是由OpenAI开发的语言模型,具有强大的自然语言处理和生成能力&#x…...
认识思维之熵
经常有读者问我,说: 为什么向您请教一个问题,您总能很快指出在哪篇文章里面提到过,是因为您的记忆力特别好吗? 其实不是的。更重要的原因是:如果你经过系统训练,有意识地去获取知识的话&#x…...
蓝桥杯备战——1.点亮LED灯
1.解析原理图 由上图可以看到8个共阳LED灯接到了573输出口,而573输入接到单片机P0口上。当573 LE脚输入高电平时,输出随输入变化,当LE为低电平时,输出锁存。 由上图可以看到Y4C接到了或非门74HC02的输出端,而输入端为…...
【网络协议测试】畸形数据包——圣诞树攻击(DOS攻击)
简介 TCP所有标志位被设置为1的数据包被称为圣诞树数据包(XMas Tree packet),之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。 标志位介绍 TCP报文格式: 控制标志(Control Bits)共6个bi…...
Java基础面试题-5day
泛型 什么是泛型?有什么用? 泛型是jdk5引入的新特性,通过泛型可以提高代码的可读性和稳定性;当我们使用泛型时,传入的对象类型必须是指定的泛型类型,否则就会报错 泛型的使用方式有哪些? 一…...
软通智慧启动鲲鹏原生应用开发合作
1月25日,软通智慧科技有限公司启动鲲鹏原生应用开发合作,将基于鲲鹏硬件底座、openEuler、开发套件Kunpeng DevKit和应用使能套件Kunpeng BoostKit开展面向智慧园区、政务、水利水务等行业场景的软硬件原生应用开发,并持续发布性能更优的鲲鹏…...
【STM32】STM32F4中USB的CDC虚拟串口(VCP)使用方法
文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 设置时钟频率2.4 生成代码2.5 编译并下载代码2.6 结果2.7 问题 三、回环测试3.1 打开工程3.2 添加回环代码3.3 编译烧录并测试 四、出现问题和解决方法4.1 烧录总是要自己插拔USB4.2 自己生成的工程没…...
网络协议与攻击模拟_06攻击模拟SYN Flood
一、SYN Flood原理 在TCP三次握手过程中, 客户端发送一个SYN包给服务器服务端接收到SYN包后,会回复SYNACK包给客户端,然后等待客户端回复ACK包。但此时客户端并不会回复ACK包,所以服务端就只能一直等待直到超时。服务端超时后会…...
CPU,内存和硬盘之间的关系
计算机三大件:CPU,内存,硬盘。从运算速度来看,CPU>内存>固态硬盘>机械硬盘。 电脑卡顿怎么解决? 1、清理垃圾; 2、释放C盘空间,因为系统需要C盘空间当作虚拟内存; 3、增…...
Java面试题之基础篇
文章目录 一:谈谈你对面向对象的理解二:JDK、JRE、JVM三者区别和联系三:和equals比较四:hashCode与equals五:final六:String、StringBuffer、StringBuilder七:重载与重写的区别?八&a…...
Bitbucket第一次代码仓库创建/提交/创建新分支/合并分支/忽略ignore
1. 首先要在bitbucket上创建一个项目,这个我没有权限创建,是找的管理员创建的。 管理员创建之后,这个项目给了我权限,我就可以创建我的代码仓库了。 2. 点击这个Projects下的具体项目名字,就会进入这样一个页面&#…...
c#反射用法
在 C# 中,反射是一种能够在运行时检查类型信息、访问属性和调用方法的机制。通过反射,你可以动态地操作类型、对象和程序集,而无需在编译时知道这些类型的具体信息。 反射提供了一组 API,可以让你在运行时获取和操作类型的信息。…...
WPF行为
背景:实现按钮鼠标移动到上方有点交互效果或变一下有阴影。这样使用触发器就行了,但是如果是每个控件都有效果的话使用行为更加合适 1、下载NuGet包:Microsoft.xaml.behavior.wpf 2、创建行为类EffectBehavior,对Behavior进行重写…...
N-141基于springboot,vue网上拍卖平台
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plusredi…...
Unity之Cinemachine教程
前言 Cinemachine是Unity引擎的一个高级相机系统,旨在简化和改善游戏中的相机管理。Cinemachine提供了一组强大而灵活的工具,可用于创建令人印象深刻的视觉效果,使开发人员能够更轻松地掌控游戏中的摄像机行为。 主要功能和特性包括&#x…...
java面面试面经(面试过程)
一、校招一面面经 1.1 自我介绍(2min) 1.2 要求介绍项目一项目亮点以及做的具体工作 根据介绍项目进行细挖,其中包括方案设计、场景设计等等等 由于项目一种涉及数据库源的转换问题和限流方案,所以面试官拷打的是这两块,其中包括场景题&…...
大语言模型-大模型基础文献
大模型基础 1、Attention Is All You Need https://arxiv.org/abs/1706.03762 attention is all you need 2、Sequence to Sequence Learning with Neural Networks https://arxiv.org/abs/1409.3215 基于深度神经网络(DNN)的序列到序列学习方法 3、…...
Qwen3.5-4B-Claude-Opus推理模型基础教程:Temperature/Top-P参数详解
Qwen3.5-4B-Claude-Opus推理模型基础教程:Temperature/Top-P参数详解 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答以及代码与逻辑类问题的处理能力。该模型…...
手把手教你用STM32F103驱动ST7565R芯片的JLX12864G屏幕(附取模工具配置)
STM32F103驱动ST7565R液晶屏的深度开发指南 在嵌入式显示领域,128x64分辨率的单色液晶屏因其性价比高、接口简单而广受欢迎。本文将深入探讨基于STM32F103微控制器驱动ST7565R芯片的JLX12864G液晶屏的完整技术方案,从硬件连接到高级显示功能的实现&#…...
告别龟速滚屏!Ubuntu 20.04下用imwheel调鼠标滚轮速度(附开机自启保姆级教程)
Ubuntu 20.04终极鼠标滚轮优化指南:从基础配置到系统级调优 每次在Ubuntu上浏览长网页或翻阅代码时,那个慢如蜗牛的滚动速度是否让你抓狂?作为从Windows或macOS迁移过来的用户,这种体验落差尤为明显。鼠标滚轮响应迟缓不仅影响工作…...
从按键消抖到I2C通信:深入浅出聊聊MCU上拉/下拉电阻与开漏输出的那些坑
从按键消抖到I2C通信:深入浅出聊聊MCU上拉/下拉电阻与开漏输出的那些坑 在嵌入式系统开发中,GPIO配置看似简单,却暗藏玄机。记得第一次调试I2C总线时,通信速率始终上不去,最后发现竟是上拉电阻选型不当;另一…...
tkinter表格神器tkintertable实战:5分钟搞定可拖拽编辑的数据表格(附完整代码)
tkinter表格神器tkintertable实战:5分钟搞定可拖拽编辑的数据表格(附完整代码) 在Python GUI开发中,表格控件一直是刚需但实现起来又颇为棘手的组件。传统tkinter自带的Treeview虽然能勉强实现表格功能,但在交互体验上…...
FPGA信号调试必备:Quartus中keep、preserve、noprune的正确用法与避坑指南
FPGA信号调试必备:Quartus中keep、preserve、noprune的正确用法与避坑指南 在FPGA开发过程中,信号调试是最令人头疼的环节之一。特别是当你发现仿真时明明存在的关键信号,在综合后却神秘消失时,那种挫败感简直难以言表。作为一名长…...
Windows 11终极清理优化指南:用Win11Debloat快速提升系统性能
Windows 11终极清理优化指南:用Win11Debloat快速提升系统性能 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以…...
Docker 容器中文字体及 matplotlib 环境应用
为了避开 Noto CJK 这种复杂的 TTC(TrueType Collection)大包带来的识别问题,最理想的选择是使用独立打包的 OTF 或 TTF 字体。 0. 环境检查 # 1. 更新源并安装 fontconfig apt-get update apt-get install -y fontconfig# 2. 现在 fc-cache 命令可用了,刷新系统字体 fc-…...
Burp Suite实战进阶:用LingJing内置的burp-labs靶机打通从入门到专家22关(含解题思路)
Burp Suite实战进阶:用LingJing内置的burp-labs靶机打通从入门到专家22关(含解题思路) 在网络安全领域,Burp Suite无疑是渗透测试工程师最得力的工具之一。然而,很多学习者在掌握了基础操作后,往往会陷入&q…...
MATLAB实战:用BEMD算法分解图像并提取特征(附完整代码)
MATLAB实战:二维经验模态分解(BEMD)在图像特征提取中的创新应用 当我们需要从一张X光片中识别微小病灶,或是从卫星图像中提取城市道路网络时,传统图像处理方法往往力不从心。二维经验模态分解(BEMD)就像给图像做"CT扫描"࿰…...
