机器学习实战(8):降维技术——主成分分析(PCA)
第8集:降维技术——主成分分析(PCA)
在机器学习中,降维(Dimensionality Reduction) 是一种重要的数据处理技术,用于减少特征维度、去除噪声并提高模型效率。主成分分析(Principal Component Analysis, PCA) 是最经典的线性降维方法之一,广泛应用于数据可视化、特征提取和图像压缩等领域。今天我们将深入探讨 PCA 的数学原理,并通过实践部分使用 MNIST 手写数字数据集 进行降维与可视化。
维度灾难问题
什么是维度灾难?
随着特征维度的增加,数据的稀疏性会急剧上升,导致模型训练变得更加困难。这种现象被称为 维度灾难(Curse of Dimensionality)。高维数据不仅增加了计算复杂度,还可能导致过拟合。因此,降维技术成为解决这一问题的重要工具。
图1:维度灾难示意图
(图片描述:三维空间中展示了低维数据点的分布较为密集,而高维空间中数据点变得稀疏,难以捕捉模式。)
PCA 的数学原理
PCA 的核心思想
PCA 的目标是通过线性变换将原始高维数据投影到一个低维子空间,同时尽可能保留数据的主要信息。具体步骤如下:
- 标准化数据:对每个特征进行零均值化和单位方差缩放。
- 计算协方差矩阵:衡量特征之间的相关性。
- 特征分解:求解协方差矩阵的特征值和特征向量。
- 选择主成分:按特征值大小排序,选择前 $ k $ 个特征向量作为主成分。
- 投影数据:将原始数据投影到主成分构成的低维空间。
公式如下:
Covariance Matrix: Σ = 1 n X T X \text{Covariance Matrix: } \Sigma = \frac{1}{n} X^T X Covariance Matrix: Σ=n1XTX
Eigen Decomposition: Σ v = λ v \text{Eigen Decomposition: } \Sigma v = \lambda v Eigen Decomposition: Σv=λv
其中:
- $ \Sigma $ 是协方差矩阵。
- $ \lambda $ 是特征值,表示主成分的重要性。
- $ v $ 是特征向量,表示主成分的方向。
如何解释主成分
主成分是数据变化方向的线性组合,每个主成分解释了数据总方差的一部分。我们可以通过以下指标评估主成分的重要性:
- 特征值占比:每个主成分对应的特征值占总特征值的比例。
- 累计贡献率:前 k 个主成分解释的总方差比例。
图2:主成分累计贡献率图
(图片描述:折线图展示了前 $ k $ 个主成分的累计贡献率,随着主成分数量增加,累计贡献率逐渐接近 100%。)
PCA 在图像压缩中的应用
PCA 可以用于图像压缩,通过保留最重要的主成分来减少存储空间。例如,对于一张灰度图像,可以将其像素矩阵展平为一维向量,然后使用 PCA 提取主要特征,从而实现压缩。
实践部分:使用 PCA 对 MNIST 手写数字数据集进行降维并可视化
数据集简介
MNIST 数据集包含 70,000 张 28x28 像素的手写数字图像(0-9)。每张图像被展平为 784 维向量。我们将使用 PCA 将数据降维到二维空间,并对其进行可视化。
完整代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler# 加载 MNIST 数据集
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist['data'], mnist['target']# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 使用 PCA 降维到二维
pca = PCA(n_components=2, random_state=42)
X_pca = pca.fit_transform(X_scaled)# 可视化降维结果
plt.figure(figsize=(12, 8))
for i in range(10): # 遍历 0-9 数字类别plt.scatter(X_pca[y.astype(int) == i, 0], X_pca[y.astype(int) == i, 1], label=f'Digit {i}', alpha=0.6)
plt.title('MNIST Data Visualization using PCA', fontsize=16)
plt.xlabel('Principal Component 1', fontsize=12)
plt.ylabel('Principal Component 2', fontsize=12)
plt.legend()
plt.grid()
plt.show()# 输出主成分的累计贡献率
explained_variance_ratio = pca.explained_variance_ratio_
print(f"主成分1解释的方差比例: {explained_variance_ratio[0]:.2f}")
print(f"主成分2解释的方差比例: {explained_variance_ratio[1]:.2f}")
print(f"累计贡献率: {sum(explained_variance_ratio):.2f}")
运行结果
降维结果可视化
图3:PCA 降维后的 MNIST 数据分布
(图片描述:二维散点图展示了不同数字类别的分布情况,每个类别用不同颜色表示,清晰地展示了数字之间的聚类效果。)
输出结果
主成分1解释的方差比例: 0.06
主成分2解释的方差比例: 0.04
累计贡献率: 0.10
总结
本文介绍了 PCA 的数学原理及其在降维和图像压缩中的应用,并通过实践部分展示了如何使用 PCA 对 MNIST 数据集进行降维和可视化。希望这篇文章能帮助你更好地理解 PCA!
参考资料
- Scikit-learn 文档: https://scikit-learn.org/stable/documentation.html
- MNIST 数据集: https://www.openml.org/d/554*
相关文章:
机器学习实战(8):降维技术——主成分分析(PCA)
第8集:降维技术——主成分分析(PCA) 在机器学习中,降维(Dimensionality Reduction) 是一种重要的数据处理技术,用于减少特征维度、去除噪声并提高模型效率。主成分分析(Principal C…...
面试编程题
1. 请写出string类的定义,要求有构造函数,析构函数,拷贝,赋值函数。 #include <cstring> #include <algorithm>class String { public:explicit String(const char* str nullptr){if(str){str_ new char[strlen(st…...
Transformer多头注意力并行计算原理与工业级实现:从数学推导到PyTorch工程优化
一、核心数学原理剖析 1.1 多头注意力矩阵分解 Q XW^Q ∈ R^{nd_k} K XW^K ∈ R^{nd_k} V XW^V ∈ R^{nd_v} 多头分解公式: head_i Attention(QW_i^Q, KW_i^K, VW_i^V) 其中 W_i^Q ∈ R^{d_kd_k/h}, W_i^K ∈ R^{d_kd_k/h}, W_i^V ∈ R^{d_vd_v/h} (h为头数…...
我的2025年计划
新春佳节已过去了,又是一年伊始,即将步入漫长的工作、生活中了。一年之计在于春,我也不能免俗。 本文从工作生活两方面,列出一些计划。到年底,再回过头来看看,有哪些实现了,有哪些未实现。 工作…...
软件开源与AI开源的区别
一.软件开源 软件开源是指软件的源代码对公众开放,允许用户自由使用、修改和分发的软件。 核心特性:低成本(通常免费)、高可定制性(源代码可用,开发人员可以修改)、社区支持(庞大的…...
前端插件使用xlsx-populate,花样配置excel内容,根据坐添加标替换excel内容,修改颜色,合并单元格...。
需求要求:业务人员有个非常复杂得excel表格,各种表头等,但是模板是固定得。当然也可以实现在excel上搞出各种表格,但是不如直接用已有模板替换其中要动态得内容方便,这里我们用到CSDN得 xlsx-populate 插件。 实列中我…...
分布式大语言模型服务引擎vLLM论文解读
论文地址:Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型(LLMs)的高吞吐量服务需要一次对足够多的请求进行批处理。然而,现有系统面临困境,因为每个请求的键值…...
如何开发一个大模型应用?
1. 背景 AIGC技术的突破性进展彻底改变了技术开发的范式,尤其是以GPT为代表的LLM,凭借其强大的自然语言理解与生成能力,迅速成为全球科技领域的焦点。2023年末,随着ChatGPT的爆火,AIGC技术从实验室走向规模化应用&…...
01-零基础入门嵌入式系统
1.什么是嵌入式系统 首先我们要知道计算机系统分为大型机、通用计算机和嵌入式系统三大类。 计算机系统的发展,经历了由1台计算机系统为N个人服务的大型机时代到由1台计算机系统为1个人服务的PC时代,正在步入由N台计算机系统为1个人服务的嵌入式时代。 嵌…...
【机器学习】CNN与Transformer的表面区别与本质区别
仅供参考 表面区别 1. 结构和原理: CNN:主要通过卷积层来提取特征,这些层通过滑动窗口(卷积核)捕捉局部特征,并通过池化层(如最大池化)来降低特征的空间维度。CNN非常适合处理具有网格状拓扑结构的数据,如图像。Transformer:基于自注意力(Self-Attention)机制,能…...
[数据结构]二叉搜索树详解
目录 一、二叉搜索树的概念 二、二叉搜索树的性能分析 三、二叉搜索树的中序遍历用于排序去重 四、二叉搜索树的查找 1、查找的非递归写法 2、查找的递归写法 五、二叉搜索树的插入 1、插入的非递归写法 2、插入的递归写法 六、二叉搜索树的删除 1、删除的非递归写法…...
撕碎QT面具(2):groupBox内容居中显示
问题描述: 当笔者在GroupBox中使用Form Layout构建图中内容时,不能居中显示。 解决方案: 1、首先在form layout左右添加横向弹簧,并ctrl进行选中这三个控件。点击水平布局,让中间的控件不变形。 2、选中groupBox&#…...
SpringBoot速成(14)文件上传P23-P26
1. 什么是 multipart/form-data? 想象一下,你有一个包裹要寄给朋友,但包裹里有不同类型的东西:比如一封信(文字)、一张照片(图片)和一个小礼物(文件)。为了确…...
图论入门算法:拓扑排序(C++)
上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…...
PTA:使用指针方式求一个给定的m×n矩阵各行元素之和
本题要求编写程序,使用指针方式求一个给定的mn矩阵各行元素之和。(例如:scanf("%d", *(matrix i) j); // 使用指针方式访问二维数组元素) 输入格式: 输入第一行给出两个正整数m和n(1<m<6, 1<n&…...
【iOS】SwiftUI状态管理
State ObservedObject StateObject 的使用 import SwiftUIclass CountModel: ObservableObject {Published var count: Int 0 // 通过 Published 标记的变量会触发视图更新init() {print("TimerModel initialized at \(count)")} }struct ContentView: View {State…...
自制简单的图片查看器(python)
图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…...
ChatGPT行业热门应用提示词案例-AI绘画类
AI 绘画指令是一段用于指导 AI 绘画工具(如 DALLE、Midjourney 等)生成特定图像的文本描述。它通常包含场景、主体、风格、色彩、氛围等关键信息,帮助 AI 理解创作者的意图,从而生成符合要求的绘画作品。 ChatGPT 拥有海量的知识…...
Visual Studio Code的下载安装与汉化
1.下载安装 Visual Studio Code的下载安装十分简单,在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了...
分词器(Tokenizer) | 有了分词器,为什么还需要嵌入模型
文章目录 什么是tokenizer有了分词器,为什么还需要嵌入模型分词器为什么在transformers 里Hugging Face的Tokenizer大模型不同tokenizer训练效果对比分词器库选择当前顶尖大模型所采用的 Tokenizer 方法与词典大小 参考 什么是tokenizer Tokenizers huggingface官方…...
scala中 隐式转换
一、 隐式转换: 编译器 偷偷地,自动地帮我们把一种数据类型转换为另一种类型 例如: int --> double object test {// 复习隐式转换// 隐式转换: 编译器 偷偷地,自动地帮我们把一种数据类型转换为另一…...
实战开发coze应用-姓氏头像生成器(上)
欢迎关注【AI技术开发者】 上次,我们开发了一个对话形式的头像生成器智能体(Agents),广受大家欢迎。 同时也接收到一些用户的反馈,生成前无法看到头像样式、初次使用不会用等等。 对此,我准备使用Coze开…...
【Node.js】express框架
目录 1初识express框架 2 初步使用 2.1 安装 2.2 创建基本的Web服务器 2.3 监听方法 2.3.1 监听get请求 2.3.2 监听post请求 2.4 响应客户端 2.5 获取url中的参数(get) 2.5.1 获取查询参数 2.5.2 获取动态参数 2.6 托管静态资源 2.6.1 挂载路径前缀 2.6.2 托管多…...
JS逆向实战三:1688工厂信息
本文说明:B站学习笔记整理,仅供学习参考~~ 网站:https://sale.1688.com/factory/category.html 1. 页面分析与解密 刷新页面,通过对关键词进行搜索,实现接口定位。 通过多次刷新页面或者页面翻页,找到变化…...
Pipeline 获取 Jenkins参数
Pipeline 获取 Jenkins参数 Jenkins 提供了一系列默认的环境变量,这些变量在构建过程中可以被使用。以下是一些常见的 Jenkins 默认环境变量: WORKSPACE: 当前构建的工作目录路径 JOB_NAME: 当前构建的作业名称 BUILD_NUMBER: 当前构建的编号ÿ…...
ESP32 在IDF_V5.3.1版本下实现AP无线热点模式!(带WIFI事件处理)
一、什么是ESP32的AP无线热点模式? ESP32 的 AP(Access Point)模式 是指 ESP32 作为无线接入点运行,它自己创建一个 Wi-Fi 网络,允许其他设备(如手机、电脑、平板等)直接连接到它上面࿰…...
Elasticsearch:探索 CLIP 替代方案
作者:来自 Elastic Jeffrey Rengifo 及 Toms Mura 分析图像到图像和文本到图像搜索的 CLIP 模型的替代方案。 在本文中,我们将通过一个模拟房地产网站的实际示例介绍 CLIP 多模态模型,探索替代方案,并分析它们的优缺点,…...
Nginx 在Linux中安装、使用
Nginx 在Linux中安装、使用 一、官网下载Nginx 官网地址:http://nginx.org/en/download.html 二、上传到服务器解压 1、上传到指定的服务器地址 上传的地址自己决定,我上传到 /data/home/prod/nginx/ 2、解压 使用命令: tar -zxvf “你的N…...
CodeGPT 使用教程(适用于 VSCode)
CodeGPT 使用教程(适用于 VSCode) CodeGPT 是一个 VSCode 插件,可以让你在代码编辑器中直接调用 GPT 进行代码补全、优化、调试等操作。以下是详细的安装和使用步骤: 1. 安装 CodeGPT 方式 1:从 VSCode 插件市场安装…...
Python常见面试题的详解9
1. 如何找出整数数组中第二大的数 要点 定义一个函数用于在整数数组里找出第二大的数。 若数组元素少于 2 个,则返回 None。 借助两个变量 first 和 second 来跟踪最大数和第二大数。 可以添加异常处理,以应对输入非整数数组的情况。 若数组包含重复…...


