机器学习——主成分分析(PCA)

article/2025/6/7 11:21:25

一、PCA思想

1.1  PCA定义

        PCA(Principal Component Analysis,主成分分析)是一种统计学方法,用于对数据进行降维处。它通过线性变换将原始数据转换到一个新的坐标系统中,使得在这个新坐标系下,数据的方差沿着坐标轴被最大化。PCA的目标是提取数据中最重要的信息(即主成分),同时去除冗余信息,从而降低数据的维度,同时保留数据的主要特征

1.2  主要思想

1.数据降维与特征提取

  • 原始数据可能包含许多维度(特征),但并非所有维度都对数据的结构和信息有重要贡献。PCA通过寻找数据中的主要方向(主成分),将数据投影到这些方向上,从而减少数据的维度,同时保留数据的主要信息
  • 例如,在一个二维数据集中,如果数据点主要沿着某个方向分布,PCA可以将数据投影到这个方向上,从而将二维数据降为一维

2.方差最大化

  • PCA的核心是最大化数据在新坐标系中的方差。方差越大,数据在这个方向上的变化越显著,因此该方向被认为包含了更多的信息。PCA通过计算数据的协方差矩阵,找到其特征值和特征向量,特征值越大,对应的特征向量方向上的方差越大,这些特征向量即为主成分 
  • 具体来说,第一个主成分是数据方差最大的方向,第二个主成分是与第一个主成分正交且方差次大的方向,以此类推

3.去除冗余信息

  • 原始数据中可能存在相关性较高的特征,这些特征包含重复或冗余的信息。PCA通过将数据投影到主成分方向上,去除这些冗余信息,使得降维后的数据特征之间相互独立。  
  • 例如,如果两个特征高度相关,PCA会将它们合并为一个主成分,从而减少数据的冗余

4.数据重构与信息损失

  • PCA不仅用于降维,还可以用于数据重构。通过选择前k个主成分,可以将数据从高维空间映射到低维空间,然后再通过逆变换重构数据。虽然重构后的数据会丢失一些信息(即方差较小的主成分所对应的细节),但这些信息通常是不重要的,因此PCA在降维的同时尽量保留了数据的主要结构和特征

5.正交变换

  • PCA的变换是正交变换,即新的坐标轴(主成分)之间相互正交。这意味着主成分之间没有相关性,每个主成分都独立地表示了数据的一个主要方向。这种正交性使得PCA在处理高维数据时非常有效,因为它可以清晰地分离出数据中的不同特征

二、PCA原理

2.1  数据预处理

在进行PCA之前,通常需要对数据进行预处理,主要包括以下两个步骤:

1.中心化(均值归零)

PCA要求数据的均值为零。因此,需要对每个特征减去其均值,使数据的中心移动到原点。具体来说,对于数据集 X 中的每个特征 x_{i} ,计算其均值 u_{i},然后对每个数据点进行如下变换:

x_{i}^{'}=x_{i}-u_{i}

这一步是为了确保PCA的目标是最大化数据的方差,而不是均值

2.标准化(可选)

如果数据的各个特征的量纲不同或方差差异较大,可以进一步对数据进行标准化,即对每个特征进行缩放,使其标准差为1。标准化的公式为:

x_i' = \frac{x_i - \mu_i}{\sigma_i}

其中 {\sigma_i} 是特征 x_{i} 的标准差。标准化后,PCA会更加公平地对待每个特征,避免某些特征因方差过大而主导分析结果

2.2  计算协方差矩阵

PCA的核心是通过协方差矩阵来衡量数据中各特征之间的相关性。协方差矩阵是一个对称矩阵,其对角线元素表示各特征的方差,非对角线元素表示特征之间的协方差。对于中心化后的数据矩阵 X ,协方差矩阵 \sum 的计算公式为:

\sum =\frac{1}{n-1}X^{T}X

其中,n 是数据点的数量,X^{T} 是数据矩阵的转置

2.3  特征值分解

        PCA的目标是找到一组新的坐标轴(主成分),使得数据在这些坐标轴上的方差最大化。这些坐标轴的方向由协方差矩阵的特征向量决定,而特征值则表示数据在这些方向上的方差大小

  • 特征值和特征向量的计算:对协方差矩阵 \sum 进行特征值分解,得到特征值 \lambda_1, \lambda_2, \ldots, \lambda_d 和对应的特征向量 \mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_d ,其中 d 是数据的维度 
  • 特征值的排序:将特征值按照从大到小的顺序排列,对应的特征向量即为数据的主成分。第一个主成分对应最大的特征值,表示数据方差最大的方向;第二个主成分对应次大的特征值,表示与第一个主成分正交且方差次大的方向,依此类推

2.4  选择主成分

根据特征值的大小,选择前 k 个主成分,其中 k < d 。这些主成分构成了新的特征空间,用于降维后的数据表示。通常,选择的主成分数量 k 会根据累计方差贡献率来确定,即选择足够多的主成分,使得它们的方差贡献率达到一个较高的比例(如95%)

累计方差贡献率:计算前 k 个主成分的累计方差贡献率:

cumulative explained variance ratio= \frac{\sum_{i=1}^{k} \lambda_i}{\sum_{i=1}^{d} \lambda_i}

选择 k 使得累计方差贡献率接近1,表示保留了大部分数据的方差信息

2.5  数据投影

将原始数据投影到选定的主成分方向上,得到降维后的数据。具体来说,设前 k 个主成分对应的特征向量构成矩阵 V_{k} ,则降维后的数据 Y 可以通过以下公式计算:

Y=XV_{k}

其中,Y 是降维后的数据矩阵,其维度为 n * k 

三、PCA实验

3.1  代码实现

import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt# 1. 加载ORL_Faces数据集
def load_images(base_path):data = []labels = []image_paths = []  # 保存图片路径以便后续显示if not os.path.exists(base_path):raise FileNotFoundError(f"数据集目录不存在: {base_path}")print(f"正在查找数据集: {base_path}")for i in range(1, 41):  # s1 to s40folder = os.path.join(base_path, f's{i}')if not os.path.exists(folder):print(f"警告: 子文件夹不存在,跳过: {folder}")continueprint(f"正在处理文件夹: {folder}")for filename in os.listdir(folder):if filename.endswith('.pgm'):img_path = os.path.join(folder, filename)try:img = Image.open(img_path).convert('L')  # 转换为灰度图img_array = np.array(img).flatten()  # 展平为一维向量data.append(img_array)labels.append(i)  # 记录类别image_paths.append(img_path)  # 记录图片路径except Exception as e:print(f"加载图片 {img_path} 出错: {e}")if not data:raise ValueError("未找到任何有效的 .pgm 图片。")return np.array(data), np.array(labels), image_paths# 2. 手动实现PCA
def manual_pca(X, n_components):# 标准化数据X_mean = np.mean(X, axis=0)X_std = np.std(X, axis=0)X_std_data = (X - X_mean) / X_std# 计算协方差矩阵cov_matrix = np.cov(X_std_data.T)# 特征值分解eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)# 按特征值从大到小排序idx = np.argsort(eigenvalues)[::-1]eigenvalues = eigenvalues[idx]eigenvectors = eigenvectors[:, idx]# 计算解释方差比explained_variance_ratio = eigenvalues / np.sum(eigenvalues)print(f"解释方差比: {np.sum(explained_variance_ratio[:n_components]):.4f}")# 选择前n_components个特征向量selected_vectors = eigenvectors[:, :n_components]# 投影到主成分空间X_pca = np.dot(X_std_data, selected_vectors)# 返回重建所需的数据return X_pca, selected_vectors, X_mean, X_std, explained_variance_ratio# 3. 可视化原始和重建图片
def visualize_reconstruction(original_data, reconstructed_data, image_paths, img_shape, num_samples=5):# 随机选择 num_samples 张图片indices = np.random.choice(original_data.shape[0], num_samples, replace=False)# 设置支持中文的字体plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 创建子图fig, axes = plt.subplots(num_samples, 2, figsize=(8, num_samples * 4))if num_samples == 1:axes = [axes]  # 确保单张图片时 axes 可迭代for i, idx in enumerate(indices):# 原始图片original_img = original_data[idx].reshape(img_shape)axes[i, 0].imshow(original_img, cmap='gray')axes[i, 0].set_title(f'原始图片 (ID: {idx})')axes[i, 0].axis('off')# 重建图片reconstructed_img = reconstructed_data[idx].reshape(img_shape)axes[i, 1].imshow(reconstructed_img, cmap='gray')axes[i, 1].set_title(f'PCA 重建图片 (ID: {idx})')axes[i, 1].axis('off')plt.suptitle('原始图片与 PCA 重建图片对比')plt.tight_layout(rect=[0, 0, 1, 0.95])plt.show()# 4. 主程序
def main():# 数据集路径base_path = '文件路径'  # 请确认实际路径try:X, y, image_paths = load_images(base_path)except Exception as e:print(f"加载图片失败: {e}")return# 保存原始数据和图片尺寸X_original = X.copy()img_shape = (112, 92)  # ORL Faces 图片尺寸,通常为 112x92# 应用手动PCAn_components = 50  # 降维后的维度X_pca, selected_vectors, X_mean, X_std, explained_variance = manual_pca(X, n_components)# 重建数据X_reconstructed = np.dot(X_pca, selected_vectors.T)  # 逆投影X_reconstructed = X_reconstructed * X_std + X_mean  # 恢复标准化前的尺度# 设置支持中文的字体plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False# 可视化前两个主成分plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis')plt.xlabel('第一个主成分')plt.ylabel('第二个主成分')plt.title('ORL Faces 数据集的手动 PCA 结果')plt.colorbar(label='类别')plt.show()# 可视化原始和重建图片visualize_reconstruction(X_original, X_reconstructed, image_paths, img_shape, num_samples=5)# 保存降维后的数据np.save('X_pca_manual.npy', X_pca)if __name__ == '__main__':main()

3.2  实验效果截图

1.代码运行截图

2.数据集手动PCA结果图像显示截图

3.PCA重建图片与原图对比截图

四、实验总结

本次PCA实验在ORL Faces数据集上取得了以下效果:

  • 成功地将高维数据投影到二维空间,并通过可视化展示了数据的分布情况
  • 通过PCA重建的图像在保留主要特征的同时实现了数据压缩
  • 较高的解释方差比表明选择的主成分能够有效地捕捉数据的主要变化

 这些结果表明PCA是一种有效的降维和特征提取方法,可以用于图像处理和模式识别等领域。然而,需要注意的是,尽管PCA能够保留数据的主要特征,但在某些情况下可能会丢失一些细节信息,因此在实际应用中需要根据具体需求权衡降维的效果和信息损失


http://www.hkcw.cn/article/pJFlgjyLyP.shtml

相关文章

ONLYOFFICE 与 LocalAI:在 Ubuntu 上搭建 AI 文档编辑环境

如果你希望在本地 Ubuntu 设备上使用 AI 模型编辑文档、电子表格和演示文稿&#xff0c;ONLYOFFICE 桌面编辑器 与 GPT4ALL 的搭配并不是唯一的选择。 还有另一个本地 AI 平台可供选择。它安装方便&#xff0c;并可以通过 AI 模型处理本地办公文件。这个平台叫做 LocalAI&…

【OCCT+ImGUI系列】011-Poly-Poly_Triangle三角形面片

Poly_Triangle 是什么&#xff1f; Poly_Triangle 是一个非常轻量的类&#xff0c;用于表示一个三角网格中的单个三角形面片。它是构成 Poly_Triangulation&#xff08;三角网格对象&#xff09;的基本单位之一。之后会写关于碰撞检测的相关文章&#xff0c;三角面片是非常重要…

分布式拜占庭容错算法——权益证明(PoS)算法详解

Java 实现权益证明&#xff08;PoS&#xff09;算法详解 一、PoS 核心机制 #mermaid-svg-8VcpJQY92Jtxe9m1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8VcpJQY92Jtxe9m1 .error-icon{fill:#552222;}#mermaid-s…

Pycharm的使用技巧总结

目录 一、高效便捷的快捷键 二、界面汉化处理 1.设置 2.插件 3.汉化插件安装 三、修改字体大小、颜色 1.选择文件-设置 2.选择编辑器-配色方案-python 3.修改注释行颜色 4.修改编辑器字体颜色 一、高效便捷的快捷键 序号快捷键功能场景效果1Ctrl /快速注释/取消注释…

从 Docker 到 Containerd:Kubernetes 容器运行时迁移实战指南

一、背景 Kubernetes 自 v1.24 起移除了 dockershim&#xff0c;不再原生支持 Docker Engine&#xff0c;用户需迁移至受支持的 CRI 兼容运行时&#xff0c;如&#xff1a; Containerd&#xff08;推荐&#xff0c;高性能、轻量级&#xff09; CRI-O&#xff08;专为 Kuberne…

基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案

在工业系统开发中&#xff0c;**“稳定”**往往比“先进”更重要。设备一旦部署&#xff0c;生命周期动辄 5~10 年&#xff0c;系统重启或异常恢复成本高昂。 这时候&#xff0c;一套“值得托付”的软硬件组合&#xff0c;就显得尤为关键。 ✅ NXP —— 提供稳定、长期供货的工…

03.搭建K8S集群

K8S集群搭建的方式 目前主流的搭建k8s集群的方式有kubeadm、minikube、二进制包三种方式&#xff1a; kubeadm&#xff08;本案例搭建方式&#xff09; 是一个工具&#xff0c;用于快速搭建kubernetes集群&#xff0c;目前应该是比较方便和推荐的&#xff0c;简单易用 kubea…

Redis底层数据结构之快链表(QuickList)

QuickList基本结构 用一句话来说&#xff0c;QuickList是一个双端链表&#xff0c;每一个链表节点中存储的是ZipList&#xff0c;参照下面这张图可以更好地理解QuickList的结构组成&#xff1a; QuickList在Redis6.0中一共定义了6个结构体&#xff0c;分别为&#xff1a; quick…

Mac查看MySQL版本的命令

通过 Homebrew 查看&#xff08;如果是用 Homebrew 安装的&#xff09; brew info mysql 会显示你安装的版本、路径等信息。 你的终端输出显示&#xff1a;你并没有安装 MySQL&#xff0c;只是查询了 brew 中的 MySQL 安装信息。我们一起来看下重点&#xff1a; &#x1f9fe…

Spring Boot 自动配置原理:从入门到精通

Spring Boot 的自动配置是其核心特性之一&#xff0c;它极大地简化了 Spring 应用的开发&#xff0c;让开发者可以专注于业务逻辑&#xff0c;而无需编写大量的配置代码。 本文将深入探讨 Spring Boot 自动配置的原理&#xff0c;帮助你理解其工作机制&#xff0c;并能灵活运用…

网络原理1

协议 在网络通信中&#xff0c;协议是非常重要的概念。协议是在网络通信过程中的约定。发送方和接收方需要提前商量好数据的格式&#xff0c;才能确保正确进行沟通。 应用层协议 应用层&#xff0c;对应着应用程序&#xff0c;是跟我们程序员打交道最多的一层。调用操作系统…

【JSON-to-Video】设置背景视频片断

欢迎来到JSON转视频系列教程。今天要教大家如何添加背景视频片断&#xff0c;在视频制作中&#xff0c;巧妙运用背景视频&#xff0c;能为作品增添独特魅力。下面就为大家详细讲解具体步骤。 JSON转视频教程&#xff0c;添加背景视频片断 设置bgVideo字段 {"bgVideo"…

工作服/反光衣检测算法AI智能分析网关V4安全作业风险预警方案:筑牢矿山/工地/工厂等多场景安全防线

一、方案背景​ 在工地、矿山、工厂等高危作业场景&#xff0c;反光衣是保障人员安全的必备装备。但传统人工巡查存在效率低、易疏漏等问题&#xff0c;难以实现实时监管。AI智能分析网关V4基于人工智能技术&#xff0c;可自动识别人员着装状态&#xff0c;精准定位未穿反光衣…

Java垃圾回收机制深度解析:从理论到实践的全方位指南

Java垃圾回收(GC)是Java虚拟机(JVM)的核心功能&#xff0c;它自动管理内存分配与回收&#xff0c;避免了C/C中常见的内存泄漏问题。本文将深入剖析Java垃圾回收的工作原理、算法实现、收集器类型及调优策略&#xff0c;助你全面掌握JVM内存管理的精髓。 一、垃圾回收基础概念 …

实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题。主要涉及方差分析。 YieldDesign <-expand.grid(A gl(3, 1, labels c("-", "0","…

Vue内置组件Teleport和Suspense

一. Vue内置组件Teleport 认识Teleport( teleport&#xff1a;允许我们把组件的模板渲染到特定的元素上) 1.1. 在组件化开发中&#xff0c;我们封装一个组件A&#xff0c;在另外一个组件B中使用 组件A中template的元素&#xff0c;会被挂载到组件B中template的某个位置&#xf…

冷雨泉教授团队:新型视觉驱动智能假肢手,拟人化抓握技术突破,助力截肢者重获生活自信

研究背景&#xff1a;日常生活中&#xff0c;健康人依靠手完成对物体的操作。对于手部截肢患者&#xff0c;手部的缺失导致他们难以有效地操作物体&#xff0c;进而影响正常的日常生活。拥有一个能够实现拟人地自然抓取多种日常物体的五指动力假手是手部截肢患者的夙愿&#xf…

Ansys Zemax | 手机镜头设计 - 第 4 部分:用 LS-DYNA 进行冲击性能分析

附件下载 联系工作人员获取附件 该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分&#xff0c;它涵盖了相机镜头的显式动态模拟&#xff0c;以及对光学性能的影响。使用 Ansys Mechanical 和 LS - DY…

windows可视化粘贴使用剪贴板

复制 ctrl c可视化粘贴 win v选择要粘贴的内容

【QT】认识QT

文章目录 1. 认识Qt2. 创建QT项目3. 认识对象树4. 其它4.1 窗口坐标系4.2 快捷键 1. 认识Qt 什么是QT Qt 是⼀个跨平台的C图形用户界⾯应用程序框架。 它为应用程序开发者提供了建立艺术级图形界⾯所需的所有功能。它是完全⾯向对象的&#xff0c;很容易扩展。Qt为开发者提供…