PCA(主成分分析)核心原理

一、PCA(主成分分析)核心原理

即主成分分析技术,又称主分量分析技术,旨在利用降维的思想,把多指标转化为少数几个综合指标。在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。
1️⃣ 数学本质
  • 目标:找到一组正交基,使得数据投影到这些基上的方差最大化
  • 数学推导
    1. 计算协方差矩阵 C = 1 n X T X C = \frac{1}{n}X^TX C=n1XTX
    2. 特征值分解 C = V Λ V T C = V\Lambda V^T C=VΛVT
    3. 选择前k大特征值对应的特征向量组成投影矩阵 W k W_k Wk
2️⃣ 方差解释率
  • 单个主成分 λ i ∑ λ j \frac{\lambda_i}{\sum \lambda_j} λjλi
  • 累计解释率 ∑ i = 1 k λ i ∑ λ j \frac{\sum_{i=1}^k \lambda_i}{\sum \lambda_j} λji=1kλi

二、Python代码实现

1️⃣ 基础应用(Scikit-learn)
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(load_iris().data)

# PCA降维
pca = PCA(n_components=0.95)  # 保留95%方差
X_pca = pca.fit_transform(X_scaled)

print(f"原始维度: {X_scaled.shape[1]}")
print(f"降维后维度: {X_pca.shape[1]}")
print(f"各主成分方差解释率: {pca.explained_variance_ratio_}")
2️⃣ 特征可视化
import matplotlib.pyplot as plt

plt.scatter(X_pca[:,0], X_pca[:,1], c=load_iris().target)
plt.xlabel('PC1 ({:.1f}%)'.format(pca.explained_variance_ratio_[0]*100))
plt.ylabel('PC2 ({:.1f}%)'.format(pca.explained_variance_ratio_[1]*100))
plt.title('PCA Projection')
plt.show()

三、关键参数解析

参数类型作用推荐设置
n_componentsint/float指定保留主成分数或方差比例0.85~0.99(常用0.95)
svd_solverstr选择SVD求解器‘auto’(自动选择)
whitenbool是否白化数据需要时设为True

四、工业级最佳实践

1️⃣ 数据预处理流程
原始数据
缺失值处理
异常值处理
标准化/Z-score
PCA降维
2️⃣ 主成分数量选择
  • 肘部法则:绘制累计方差曲线,选择拐点
pca = PCA().fit(X_scaled)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.axhline(y=0.95, color='r', linestyle='--')
plt.xlabel('主成分数量')
plt.ylabel('累计方差解释率')

五、应用场景与案例

领域应用方式案例效果
图像处理人脸识别(Eigenfaces)500x500 → 100维,准确率保持90%+
金融风控去除多重共线性VIF从50降至<5
生物信息学基因表达数据降维20000基因 → 50主成分
推荐系统用户-物品矩阵降维提升协同过滤效率3倍

六、常见问题解答

1️⃣ PCA前为什么要标准化?
  • 消除量纲影响,防止方差大的特征主导主成分方向
2️⃣ PCA与LDA的区别?
特性PCALDA
监督性无监督有监督
优化目标最大方差类间最大/类内最小
降维上限无限制最多c-1维(c为类别数)
3️⃣ PCA是否损失信息?
  • 是,但通过控制累计方差解释率(如≥95%)可最大限度保留有效信息

七、进阶技巧

1️⃣ 增量PCA(处理大数据)
from sklearn.decomposition import IncrementalPCA

ipca = IncrementalPCA(n_components=10, batch_size=100)
for batch in np.array_split(X_scaled, 10):
    ipca.partial_fit(batch)
X_ipca = ipca.transform(X_scaled)
2️⃣ 核PCA(处理非线性)
from sklearn.decomposition import KernelPCA

kpca = KernelPCA(n_components=2, kernel='rbf', gamma=0.04)
X_kpca = kpca.fit_transform(X_scaled)

八、数学验证(手工计算)详解

让我们通过一个简单示例逐步推导,理解PCA的数学本质:

步骤1:准备数据
X = np.array([[1,2], 
             [3,4], 
             [5,6]])  # 3个样本,2个特征
步骤2:中心化数据
  1. 计算每个特征的均值:

    • 特征1均值:(1+3+5)/3 = 3
    • 特征2均值:(2+4+6)/3 = 4
  2. 中心化(每个特征减去均值):

原始数据 → 中心化后数据
[1,2] → [-2, -2]
[3,4] → [0, 0]
[5,6] → [2, 2]
步骤3:计算协方差矩阵

协方差矩阵公式:

C = 1 n − 1 X T X C = \frac{1}{n-1}X^TX C=n11XTX

实际计算:

X_centered = np.array([[-2, -2],
                      [ 0,  0],
                      [ 2,  2]])

C = np.cov(X_centered.T)  # 转置后计算协方差矩阵
print(C)
# 输出:[[4. 4.]
#       [4. 4.]]
步骤4:特征值分解

求解特征方程:

∣ C − λ I ∣ = 0 |C - \lambda I| = 0 CλI=0

即:

∣ 4 − λ 4 4 4 − λ ∣ = 0 \begin{vmatrix} 4-\lambda & 4 \\ 4 & 4-\lambda \end{vmatrix} = 0 4λ444λ =0

展开方程:

( 4 − λ ) 2 − 16 = 0 λ 2 − 8 λ = 0 λ ( λ − 8 ) = 0 (4-\lambda)^2 - 16 = 0 \\ \lambda^2 - 8\lambda = 0 \\ \lambda(\lambda - 8) = 0 (4λ)216=0λ28λ=0λ(λ8)=0

得到特征值:

λ 1 = 8 , λ 2 = 0 \lambda_1 = 8, \quad \lambda_2 = 0 λ1=8,λ2=0

步骤5:求特征向量

对于λ=8
解方程 ( C − 8 I ) v = 0 (C - 8I)v = 0 (C8I)v=0

[ − 4 4 4 − 4 ] [ v 1 v 2 ] = 0 \begin{bmatrix} -4 & 4 \\ 4 & -4 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = 0 [4444][v1v2]=0

v 1 = v 2 v_1 = v_2 v1=v2,归一化得:

v 1 = [ 1 2 1 2 ] v_1 = \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{bmatrix} v1=[2 12 1]

对于λ=0
解方程 ( C − 0 I ) v = 0 (C - 0I)v = 0 (C0I)v=0

[ 4 4 4 4 ] [ v 1 v 2 ] = 0 \begin{bmatrix} 4 & 4 \\ 4 & 4 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = 0 [4444][v1v2]=0

v 1 = − v 2 v_1 = -v_2 v1=v2,归一化得:

v 2 = [ − 1 2 1 2 ] v_2 = \begin{bmatrix} -\frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{bmatrix} v2=[2 12 1]


几何解释可视化

import matplotlib.pyplot as plt

# 原始数据与主成分方向
plt.figure(figsize=(10,4))

# 原始数据
plt.subplot(121)
plt.scatter(X_centered[:,0], X_centered[:,1], c='r')
plt.axhline(0, color='gray', lw=0.5)
plt.axvline(0, color='gray', lw=0.5)
plt.title("原始中心化数据")
plt.grid(True)

# 添加主成分方向
plt.subplot(122)
plt.scatter(X_centered[:,0], X_centered[:,1], c='r')
plt.quiver(0,0, 1/np.sqrt(2), 1/np.sqrt(2), angles='xy', scale_units='xy', scale=1, color='b', label='PC1 (λ=8)')
plt.quiver(0,0, -1/np.sqrt(2), 1/np.sqrt(2), angles='xy', scale_units='xy', scale=1, color='g', label='PC2 (λ=0)')
plt.axis('equal')
plt.title("主成分方向")
plt.legend()
plt.show()

在这里插入图片描述

关键结论

  1. PC1方向(蓝色箭头):数据在该方向的投影方差最大(λ=8)
  2. PC2方向(绿色箭头):投影方差为0 → 数据在该方向无变化
  3. 降维选择:只需保留PC1即可100%保留原始信息(因为第二个主成分方差为0)

思考题

假设有以下数据:

X_new = np.array([[2,3], [4,5], [6,7]])

尝试手工计算其协方差矩阵和主成分方向,验证是否也满足其中一个主成分方差为0?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot-模拟SSE对话交互

SpringBoot-模拟SSE对话交互 后端使用SSE进行会话&#xff0c;前端使用Html模拟大模型的问答交互->【前端】【后端】 1-学习目的 本项目代码仓库&#xff1a;https://gitee.com/enzoism/springboot_sse 1-核心知识点 1&#xff09;什么是SSE协议->客户端发起一次请求&am…

2025DNS二级域名分发PHP网站源码

安装教程 1.程序必须使用PHP8.1 2.将扩展ixed.8.1.lin放入/www/server/php/81/lib/php/extensions/no-debug-non-zts-20210902 3.打开宝塔→软件商店→PHP8.1→配置文件 4.放入&#xff1a;extensionixed.8.1.lin 5.重启PHP8.1 6.新建站点&#xff08;mysql5.6-5.7andPHP8.1&a…

Matlab实现车牌识别

车牌识别技术作为现代智能交通系统、安防监控以及诸多车辆管理应用场景中的关键环节&#xff0c;正发挥着日益重要的作用&#xff0c;它能够自动、快速且精准地从车辆图像或视频流中提取车牌信息&#xff0c;实现车辆身份的智能化识别。 技术原理 车牌识别主要依托于图像处理、…

C语言——链表

大神文献&#xff1a;https://blog.csdn.net/weixin_73588765/article/details/128356985 目录 一、链表概念 1. 什么是链表&#xff1f; 1.1 链表的构成 2. 链表和数组的区别 数组的特点&#xff1a; 链表的特点&#xff1a; 二者对比&#xff1a; 二…

国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡

基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于 FPGAJFM7K325T 芯片&#xff0c;pin_to_pin兼容FPGAXC7K410T-2FFG900 &#xff0c;支持PCIeX8、64bit DDR3容量2GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持PXIE标准协议&#xff0c;其中XJ3…

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…

K8S学习之基础十七:k8s的蓝绿部署

蓝绿部署概述 ​ 蓝绿部署中&#xff0c;一共有两套系统&#xff0c;一套是正在提供服务的系统&#xff0c;一套是准备发布的系统。两套系统都是功能完善、正在运行的系统&#xff0c;只是版本和对外服务情况不同。 ​ 开发新版本&#xff0c;要用新版本替换线上的旧版本&…

STM32之I2C硬件外设

注意&#xff1a;硬件I2C的引脚是固定的 SDA和SCL都是复用到外部引脚。 SDA发送时数据寄存器的数据在数据移位寄存器空闲的状态下进入数据移位寄存器&#xff0c;此时会置状态寄存器的TXE为1&#xff0c;表示发送寄存器为空&#xff0c;然后往数据控制寄存器中一位一位的移送数…

Linux基础--用户管理

目录 查看用户 使用命令: id 创建用户 使用命令: useradd ​编辑 为用户设置密码 使用命令: passwd ​编辑 删除用户 使用命令: userdel 创建用户组 使用命令: groupadd 删除用户组 使用命令: groupdel 用户设置 使用命令: usermod 将用户从组中去除 使用…

VSTO(C#)Excel开发3:Range对象 处理列宽和行高

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

本地YARN集群部署

请先完成HDFS的前置部署&#xff0c;部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…

每日一练之移除链表元素

题目&#xff1a; 画图解析&#xff1a; 方法&#xff1a;双指针 解答代码&#xff08;注&#xff1a;解答代码带解析&#xff09;&#xff1a; //题目给的结构体 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* }…

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片&#xff0c;运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具&#xff0c;如基本参数调整、HSL&#xff08;色相、饱和度、明亮度&#xff09;调整、曲线工具等改变照片原本的色彩、明度、对比度等属性&#xff0c;将…

【GPT入门】第8课 大语言模型的自洽性

【GPT入门】第8课 大语言模型的自洽性 1.自洽性概念2.代码&#xff08;观察执行结果&#xff09;3.自洽性核心思想 1.自洽性概念 大模型的自洽性&#xff08;self - consistency&#xff09;是指在推理阶段&#xff0c;大模型通过生成多个答案并选择出现频率最高的那个&#x…

深度学习(斋藤康毅)学习笔记(六)反向传播3

上一篇文章介绍了反向传播的自动化&#xff0c;但也存在一些问题&#xff0c;本章用于说明这些问题&#xff0c;并修改原有框架&#xff0c;使其支持复杂计算图的运行&#xff1a; 问题一&#xff1a;重复使用一个变量&#xff0c;梯度不会累计 也就是说&#xff0c;反向传播时…

3.6c语言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…

element-plus中table组件的使用

1、table组件的基本使用 注意&#xff1a; ①对象集合&#xff0c;要从后端查询。 ②prop是集合中的对象的属性名&#xff1b;label是表格表头的名称。 2、将性别一列的71转为男&#xff0c;72转为女 问题描述&#xff1a; 解决步骤&#xff1a; ①将el-table-column变成双标签…

.NET CAD 二次开发中的 Transform 与数学矩阵详解

.NET CAD 二次开发中的 Transform 与数学矩阵详解 一、Transform 的定义与作用 在 .NET CAD 二次开发中,Transform 是通过数学矩阵对图形实体进行几何变换的核心机制,包括平移、旋转、缩放、镜像和切变等操作。这些操作通过矩阵乘法实现,能够高效地修改图形的位置、方向和…

【js逆向】iwencai国内某金融网站实战

地址&#xff1a;aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中随便输入关键词 查看请求标头&#xff0c;请求头中有一个特殊的 Hexin-V,它是加密过的&#xff1b;响应数据包中全是明文。搞清楚Hexin-V的值是怎么生成的&#xff0c;这个值和cooki…