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

主成分分析(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 …

node.js 封装分页查询

node.js封装sql分页查询 方法&#xff1a; /*** 生成分页查询sql* param {string} table 表名* param {number} pageNum 分页页数 * param {number} pageSize 分页条数 * param {object} query 查询对象 例&#xff1a;{id:1,name:小明}* returns sql语句*/ const limit (ta…

Java零基础-反射

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

springboot/ssm供应商管理系统Java货物进销存管理系统web

springboot/ssm供应商管理系统Java货物进销存管理系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysq…

传感器---触摸传感器

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

图像传感器与信号处理——SFR算法/ISO 12233解读

图像传感器与信号处理——SFR算法/ISO 12233解读 图像传感器与信号处理——SFR算法/ISO 12233解读 1. 前言 2. 基于视觉的分辨率测量方法 3. 基于边界的SFR算法 4. 基于正弦波的SFR算法 图像传感器与信号处理——SFR算法/ISO 12233解读 SFR的全称是Spatial Frequency Response&…

蓝桥集训之统计子矩阵

统计子矩阵 核心思想&#xff1a;矩阵前缀和 双指针 用i和j双指针 遍历所有子矩阵的列用s和t双指针 遍历所有子矩阵的行求其子矩阵的和 若>k 将s向下移动 矩阵和必定减小(元素个数减少)直到满足<k 因为列一定 行数即为方案数(从t行往上数到s行 共t-s1个区间[t,t][t-1,t]…

PESTEL分析

PESTEL分析是一种用于评估宏观环境对组织或企业的影响的工具。PESTEL是对政治、经济、社会、技术、环境和法律六个方面进行分析的首字母缩写。 - 政治因素&#xff08;Political&#xff09;&#xff1a;涉及政府政策、政治稳定性、法律和法规等因素对企业的影响。 - 经济因素&…

Linux中服务端开发

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

MySQL——存储引擎

存储引擎 InnoDB 是 MySQL 默认的存储引擎&#xff0c;只有在需要它不支持的特性时&#xff0c;才会考虑其他存储引擎 实现了 4 个标准的隔离级别&#xff0c;默认级别可重复度。在可重复度隔离级别下&#xff0c;通过 MVCC 间隙锁防止幻读 主索引是聚簇索引 内部做了很多…

Docker 日志存储大小限制,默认会充爆磁盘

背景 在容器化部署的时候&#xff0c;因为没有指定日志的最大存储时间&#xff0c;导致磁盘被充爆。查看日志 一般使用docker logs -f --tail 行数 容器名称 来查看容器的运行日志&#xff0c;但是在容器被初始化的时候&#xff0c;需要指定日志的最大存储时间&#xff0c;因为…

React学习笔记

1、React初步认识 React构建Web和原生交互界面的库,相较于其它前端框架的优势,具有丰富的生态跨平台支持。 1.1、React的开发依赖 开发React必须依赖三个库: react:包含react所必须的核心代码;react-dom:react渲染在不同平台所需要的核心代码 ;babel:将jsx转换成Rea…

白云山板蓝根,一年四季都得备着

上班半年&#xff0c;每天都感觉在行尸走肉&#xff0c;长时间地坐在电脑前真的不行&#xff01;身体越来越差&#xff0c;面相也越来越糟糕&#xff0c;不仅有黑眼圈&#xff0c;痘痘也冒出来了不少&#xff0c;堪比整容&#xff0c;朋友们都纷纷调侃我&#xff0c;说我上半年…

限流、流量削峰?

学MQ的时候&#xff0c;经常会有人拿秒杀这个场景去介绍流量削峰。这很好理解&#xff0c;将请求放到一个中转站去暂存&#xff0c;虽然生产者生产很快&#xff0c;但消费者可以慢慢去中转站获取。 关于限流&#xff0c;之前一直以为限流的思想类似MQ&#xff0c;不过是内存中…

网络安全: 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…

机器学习中的 K-均值聚类算法及其优缺点。

K-均值聚类算法是一种常用的无监督学习算法&#xff0c;用于将数据集划分为K个不重叠的类别。该算法基于数据点之间的距离度量&#xff0c;通过不断迭代的方式将数据点分配给最近的聚类中心&#xff0c;并更新聚类中心的位置&#xff0c;直到达到收敛条件或最大迭代次数。 K-均…

关于“定时器中断干扰串口中断,导致串口中断数据接收不完整”的问题

问题描述 最近在做的项目&#xff0c;基于modbusRTU&#xff0c;上位机通过wifi模块给单片机发数据。 上位机每隔100ms&#xff0c;周期性发送0x03和0x10。 因为要及时的处理上位机发来的指令&#xff0c;我是在一个10ms的定时器中断中进行modbus数据处理。这就导致一个问题&…

MySQL JSON 路径表达式语法

MySQL JSON 路径表达式语法 语法 MySQL中支持的许多JSON函数&#xff0c;需要路径表达式以便识别JSON文档中的特定元素。路径由路径的作用域和一个或多个路径段组成。在MySQL JSON函数中使用的路径中&#xff0c;作用域始终是正在搜索或以其他方式操作的文档&#xff0c;由前…