机器学习:主成分分析笔记

主成分分析(Principal Component Analysis,PCA)是一种无监督的机器学习算法,通常用于高维数据的降维、提取主要特征、数据降噪和可视化。PCA的基本思想是将原始数据的多个变量转换为少数几个相互独立的变量(即主成分),这些主成分能够尽可能多地保留原始数据的信息。


目录

基本概念

1.主成分(Principal Component)

2.方差(Variance)

3.协方差

4.协方差矩阵

5.特征值和特征向量

工作步骤

1.准备数据矩阵

2.标准化数据

3.计算协方差矩阵

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

5.构建主成分得分

6.解释主成分

应用

1.准备数据

2.PCA降维

3.数据可视化


基本概念

          

1.主成分(Principal Component)

通过原始数据集变量的线性组合构成的新变量。第一个主成分捕获了数据中最多的信息(即最大的方差),第二个主成分捕获了剩余方差中最大的部分,且与第一个主成分正交(即无相关性),以此类推。

2.方差(Variance)

衡量数据分布的离散程度。在PCA中,方差越大,表示该成分包含的信息量越多。计算公式为:S^{2} = \frac{1}{n-1}\sum_{i=1}^{n} (x_{i} - \bar{x})^{2}  。

3.协方差

衡量两个随机变量联合变化趋势的统计量。若两变量的增减趋势相同(即一个变量增加,另一个变量也增加,呈正相关),则协方差 > 0;若一个变量增加而另一个变量减少,则协方差 < 0。计算公式为:

Cov(x, y) = \frac{1}{n-1}\sum_{i=1}^{n} (x_{i} - \bar{x}) (y_{i} - \bar{y})  。

4.协方差矩阵

表示各变量间协方差的矩阵,不仅包含变量自身的方差,还包含变量间的协方差。表示为:

C_{p\times p} = \begin{pmatrix} S^{2}(x_{1}) & Cov(x_{1}, x_{2}) & ... & Cov(x_{1}, x_{p}) \\ & & & \\ Cov(x_{2}, x_{1}) & S^{2}(x_{2}) & ... & Cov(x_{2}, x_{p}) \\ & & & \\ . & . & ... & . \\ . & . & ... & . \\ . & . & ... & . \\ & & & \\ Cov(x_{p}, x_{1}) & Cov(x_{p}, x_{2}) & ... & S^{2}(x_{p}) \end{pmatrix}   ,其中 p表示变量数。

若已知 n×p的数据矩阵A,其中 n表示观测数。则经过标准化处理,协方差矩阵可以这样计算:C = \frac{1}{n-1}A^{T}A  。

5.特征值和特征向量

即协方差矩阵的特征值和特征向量,揭示了数据的内在结构。特征向量表示方向,即主成分的方向,是单位向量;特征值表示方差的大小,反映原始数据点映射到主成分方向上与中心的距离。满足:C \vec{v} = \lambda \vec{v}  。



工作步骤

1.准备数据矩阵

将原始数据整理成一个矩阵,每一行代表一个观测(或样本),每一列代表一个变量。对于有 n个样本和 p个变量的数据集,将得到一个 n×p的矩阵。

2.标准化数据

当变量的量纲量级差异较大时,会高估或低估其表达的信息量,从而影响分析,因此在应用PCA之前通常需要对数据进行标准化(又称中心化)。常用 z-score标准化,即使每个变量满足均值为0,标准差为1。计算公式为:z = \frac{x_{i}-\bar{x}}{s}  。

3.计算协方差矩阵

计算经标准化后数据矩阵的协方差矩阵。协方差矩阵反映了数据中变量之间的线性关系。

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

计算协方差矩阵的特征值和对应的特征向量。特征值有多个解,因为协方差矩阵是一个方阵,所以其特征值 ≤ p。按特征值的大小,将对应的特征向量从大到小排序,特征值越大,对应的主成分就越重要(即在该方向上数据的变异性越大)。最后,根据需要保留的信息量(如保留总方差的90%),选择前 k个最大的特征值对应的特征向量作为主成分。

5.构建主成分得分

利用选定的主成分对应的特征向量,将原始数据转换为一组新的低维数据。转换方法为:将数据矩阵与特征向量矩阵相乘得到低维空间的数据矩阵。计算公式为:

A_{低维} = A_{高维}V,其中 V = \begin{pmatrix} v_{1} & v_{2} & ... & v_{k} \end{pmatrix}

k亦可以解释为原始数据在最重要的 k个方向上的投影。

6.解释主成分

根据特征向量的元素(即载荷),可以用原始变量来表达主成分,并反映原始变量的贡献程度。载荷反映了原始变量在新的主成分方向上的权重,表示为:

v_{k} = \begin{pmatrix} a_{k1}\\ a_{k2}\\ .\\ .\\ .\\ a_{kp}\\ \end{pmatrix}   ,其中 k表示为主成分的个数,p表示为原始变量的个数,a_{k1},a_{k2},...,a_{kp} 表示为第 k个主成分的载荷,v_{k} 表示为第 k个主成分的特征向量。故主成分可以表示为:

Z_{1} = a_{11}X_{1} + a_{12}X_{2} + ... + a_{1p}X_{p}

Z_{2} = a_{21}X_{1} + a_{22}X_{2} + ... + a_{2p}X_{p}

...

Z_{k} = a_{k1}X_{1} + a_{k2}X_{2} + ... + a_{kp}X_{p}

其中 Z_{k} 表示为第 k个主成分,X_{p} 表示为第 p个原始变量。

通过分析每个主成分的载荷,我们可以进一步解释每个主成分的含义:

高载荷变量:对于第 k个主成分,载荷的绝对值较大的变量对该主成分的形成贡献较大,因此这些变量在解释主成分时更为重要;

载荷的符号:载荷的符号(正或负)有助于理解变量之间的关系。同一主成分中,载荷符号相同的变量表现为正相关,符号不同的变量表现为负相关。



应用

通过 Python sklearn库实现 PCA:

1.准备数据

随机生成一组6维的数据集。

import numpy as npnp.random.seed(42)  # 确保数据可重复
mean = np.zeros(6)  # 随机生成6维数据的均值向量
cov = np.diag(np.arange(1, 7))  # 创建一个6x6的协方差矩阵,方差从1到6
X = np.random.multivariate_normal(mean, cov, 200)  # 随机生成200个数据点
X

2.PCA降维

将数据降维到2维。

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 应用PCA
pca = PCA(n_components=2)  # 降至2维
X_pca = pca.fit_transform(X_scaled)

3.数据可视化

import matplotlib.pyplot as pltplt.figure(figsize=(8, 8))
plt.scatter(X_pca[:, 0], X_pca[:, 1], s=40, alpha=1, edgecolors='black', linewidths=0.5)
plt.title('PCA Result', fontsize=20)
plt.xlabel('Principal Component 1', fontsize=15)
plt.ylabel('Principal Component 2', fontsize=15)
plt.grid(True)# 保存为PDF格式
plt.savefig('PCA_Result_scatter.pdf', format='pdf')plt.show()

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

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

相关文章

shadertoy 游戏《来自星尘》摇杆复刻

正确的做法应该是上 noise 而不是叠加 sin 波&#xff0c;不过如果不想麻烦的话叠波还是一个不错的选择&#xff1a;整体效果如下&#xff0c;已经非常形似 直接上链接&#xff1a;Shader - Shadertoy BETA float radiusScale 0.9; float variation(vec2 v1, vec2 v2, float …

传感器---触摸传感器

一、模块选型概述 芯片型号&#xff1a;TTP223B 供电电压&#xff1a;3-5V 控制接口&#xff1a;共三个引脚&#xff08;GND、VCC、SIG&#xff09;&#xff0c;GND为地&#xff0c;VCC为供电电源&#xff0c;SIG为数字信号输出脚&#xff1b; PCB尺寸&#xff1a;24 x 24 mm 触…

Linux中服务端开发

1 创建socket,返回一个文件描述符lfd---socket(); 2 将lfd和IP&#xff0c;PROT进行绑定---bind(); 3 将lfd由主动变成被动监听---listen(); 4 接收一个新的连接&#xff0c;得到一个的文件描述符cfd--accept() --该文件描述符用于与客户端通信 5 while(1) { 接受数据&a…

网络安全: Kali Linux 使用 docker-compose 部署 openvas

目录 一、实验 1.环境 2.Kali Linux 安装docker与docker-compose 3.Kali Linux 使用docker-compose方式部署 openvas 4. KaliLinux 使用openvas 二、问题 1. 信息安全漏洞库 2.信息安全漏洞共享平台 3.Windows 更新指南与查询 4.CVE 查询 5.docker-compose 如何修改o…

前后端分离项目Docker部署指南(上)

目录 前言 一.搭建局域网 1.搭建net-ry局域网&#xff0c;用于部署若依项目 2.注意点 二.安装redis 创建目录 将容器进行挂载 ​编辑 测试是否安装成功 ​编辑 三. 安装MySQL 创建文件夹 上传配置文件并且修改 .启动MySQL容器服务 充许远程连接 四.部署后端 使用…

LLVM clang_tokenize 的示例

1&#xff0c; 环境搭建 如同上篇 git clong llvm-project git checkout llmvorg-3.4.0 # or llvmorg-18.1.rc /bin/bash ./confiure --prefix....... # or cmake Debug make -j32 make -j install 2&#xff0c; 示例代码 Makefile&#xff1a;如同上篇 LLVM_CON…

NOIP 2010普及组初赛试题及解析

NOIP 2010普及组初赛试题及解析 一. 单项选择题 &#xff08;共20题&#xff0c;每题1.5分&#xff0c;共计30分。每题有且仅有一个正确答案.&#xff09;。二. 问题求解&#xff08;共2题&#xff0c;每题5分&#xff0c;共计10分&#xff09;三. 阅读程序写结果&#xff08;共…

基于YOLOv8深度学习的农作物幼苗与杂草检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

kafka启动命令、查看topic命令、查看消息内容命令

kafka启动命令 cd /opt/kafka/kafka_2.12-3.5.1/bin ./kafka-server-start.sh ../config/server.properties Windows环境下用kafka Tool 连不上虚拟机的broker报了unable to connect broker 0&#xff0c; 但是zookeeper可以连接上 server.properties的listeners改为listene…

006-CSS-常见问题汇总

常见问题汇总 1、伪元素与伪类2、偏门但好用的样式3、文字溢出三个点展示4、空白折叠问题5、文字的垂直居中6、 Vue项目中 在父组件中修改子组件样式7、BFC 概念7.1、兄弟元素外边距合并7.2、父子元素外边距塌陷 8、box-sizing8.1、box-sizing: border-box8.2、box-sizing: con…

Vue.js 深度解析:nextTick 原理与应用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

英特尔/ARM/国产化EMS储能控制器解决方案

新型储能是建设新型电⼒系统、推动能源绿⾊低碳转型的重要装备基础和关键⽀撑技术&#xff0c;是实现碳达峰、碳中和⽬标的重要⽀撑。说到储能&#xff0c;大众首先想到的就是电池&#xff0c;其好坏关系到能量转换效率、系统寿命和安全等重要方面&#xff0c;但储能要想作为一…

三、Distributed DataParallel分布式数据并行原理与应用

帮up宣传一下&#xff0c;优质up值得信赖&#xff01; B站UP&#xff1a;你可是处女座啊 文章目录 原理一、 DDP二、基本概念三、分布式训练中的通信 实战初始化进程组当前 进程 到底使用哪些数据&#xff1f;模型处理启动改造 loss 打印改造准确率改造数据划分训练前数据打乱…

网络编程 24/3/4 作业

1、广播 发送端 #include <myhead.h> int main(int argc, const char *argv[]) {//创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}//设置当前套接字允许广播属性int broadcast1;if(setsockopt(sfd,SOL_SOCKET…

vue点击按钮同时下载多个文件

点击下载按钮根据需要的id调接口拿到返回需要下载的文件 再看返回的数据结构 数组中一个对象&#xff0c;就是一个文件&#xff0c;多个对象就是多个文件 下载函数 // 下载tableDownload(row) {getuploadInventoryDownload({ sysBatch: row.sysBatch, fileName: row.fileName…

深入了解直播美颜SDK,美颜SDK是什么?

在实现直播美颜功能的背后&#xff0c;美颜SDK扮演了重要的角色。今天&#xff0c;笔者将为大家讲解美颜SDK的定义、功能以及在直播行业中的应用。 一、美颜SDK的定义 美颜SDK是一种软件开发工具包&#xff0c;旨在为应用开发者提供一套实现美颜功能的接口和算法。它通常包含…

【C语言】动态内存管理------常见错误,以及经典笔试题分析,柔性数组【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】动态内存管理------常见错误&#xff0c;以及经典笔试题分析&#xff0c;柔性数组【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 在了解完内存操作中最关键的一节---动…

13 环境变量

基本概念 一般指在操作系统中用来指定操作系统运行环境的一些参数 如c/c链接的时候我们不知道动静态库在哪里&#xff0c;照样可以连接成功&#xff0c;原因就是有相关环境编译帮助编译器查找 环境变量有特殊用途&#xff0c;在系统中通常具有全局属性 常见环境变量 PATH&am…

【神经网络与深度学习】时间卷积网络(TCN)

概述 时间卷积网络&#xff08;Temporal Convolutional Network&#xff0c;TCN&#xff09;是一种用于处理时序数据的深度学习模型。它基于卷积神经网络&#xff08;CNN&#xff09;的思想&#xff0c;通过卷积操作来提取和学习时序数据中的特征&#xff0c;并在一系列时序预…

leetcode 热题 100_和为 K 的子数组

题解一&#xff1a; 前缀和数组哈希表&#xff1a;可以计算所有子数组之和暴力求解&#xff0c;但复杂度太高。对于子数组求和的过程&#xff0c;我们可以采用前缀和数组进行优化&#xff0c;前缀和数组中pre[index]代表nums[0]~nusm[index]之和&#xff0c;当我们要计算子数组…