当前位置: 首页 > news >正文

Python机器学习中的主成分分析(PCA)全面解析与应用

🎯 Python机器学习中的主成分分析(PCA)全面解析与应用

📖 目录

  1. 🌟 主成分分析 (PCA) 的概念和原理
  2. 🔎 PCA的数学基础
  3. 🛠 Python 实现 PCA 的步骤详解
  4. 📊 如何选择适合的主成分数量
  5. ⚙️ 实践:使用 PCA 进行图像降维
  6. 🧩 PCA 与其他降维算法的对比

1. 🌟 主成分分析 (PCA) 的概念和原理

主成分分析(Principal Component Analysis,PCA)是机器学习和数据科学中最常用的降维技术之一。它主要用于高维数据集的降维,帮助简化数据结构,消除冗余信息,使模型更容易训练,同时也能防止模型过拟合。

PCA 的基本思想是将原始数据通过某种方式变换,使得数据投影到一个新的坐标系中,在新坐标系中,不同坐标轴(也称为主成分)表示数据的最大方差方向。通过选择前几个主成分来表示数据,我们可以有效降低数据的维度。

在应用 PCA 时,原始高维数据可能存在很多冗余信息,这些冗余信息导致了数据的维度高且信息不集中。PCA 通过找到数据方差最大的方向,重新构造数据的线性组合,压缩数据的维度,但同时保留大部分信息。这一特性使得 PCA 在数据可视化、特征提取和预处理等多个领域得到广泛应用。

PCA 的核心目标是将数据从高维空间映射到低维空间,从而使得数据的主要结构被保留。其关键步骤可以归纳为以下几个方面:

  1. 标准化数据:因为不同特征的量纲不同,PCA 在使用前必须对数据进行标准化处理。
  2. 计算协方差矩阵:PCA 通过协方差矩阵分析特征之间的关系,找到数据的主成分。
  3. 特征值分解:对协方差矩阵进行特征值分解,获取主成分的方向。
  4. 降维:根据特征值的大小,选择前k个主成分对原始数据进行降维处理。

在使用 PCA 进行数据降维时,往往会牺牲一些细节信息,但能显著提高模型的训练效率,同时减少计算资源的消耗。


2. 🔎 PCA的数学基础

在深入理解 PCA 之前,首先需要了解其背后的数学原理,尤其是线性代数中的几个重要概念,包括协方差矩阵、特征值和特征向量。

2.1 协方差矩阵

PCA 依赖于协方差矩阵来识别数据集中各个特征之间的相关性。协方差矩阵是一个对称矩阵,描述了每个特征与其他特征的共同变化情况。协方差矩阵的大小由特征的数量决定,计算公式为:

在这里插入图片描述

2.2 特征值和特征向量

PCA 的降维实质上是通过特征值分解,将数据映射到新的特征空间中。协方差矩阵的特征值代表了每个主成分的重要性,而特征向量则定义了这些主成分的方向。

假设 ( \Sigma )
是协方差矩阵,其特征值分解公式为:

在这里插入图片描述

其中,( v ) 是特征向量,( \lambda ) 是特征值。特征值越大,表示该方向上的方差越大,也就是信息量越多,因此在降维时,通常选择特征值较大的前几个主成分。


3. 🛠 Python 实现 PCA 的步骤详解

在 Python 中实现 PCA 非常简单,常用的库是 scikit-learn,其中提供了高度优化的 PCA 模型。下面我们详细解析如何使用 scikit-learn 实现 PCA,并应用于实际的数据集中。

3.1 导入必要的库和数据

# 导入库
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt# 生成样例数据
np.random.seed(42)
data = np.random.rand(100, 5)  # 100行5列的随机数据# 数据标准化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)# 打印标准化后的数据形状
print(f'标准化后的数据形状:{data_scaled.shape}')

3.2 应用 PCA 进行降维

# 使用PCA将数据降维到2个主成分
pca = PCA(n_components=2)
data_pca = pca.fit_transform(data_scaled)# 打印降维后的数据形状
print(f'降维后的数据形状:{data_pca.shape}')

3.3 解释 PCA 结果

# 输出主成分所解释的方差比例
print(f'各主成分解释的方差比例:{pca.explained_variance_ratio_}')

在上述代码中,explained_variance_ratio_ 表示各个主成分解释的方差比例,通过观察这个结果,可以判断选择的主成分是否足够解释原始数据中的信息。

3.4 数据可视化

# 数据可视化
plt.figure(figsize=(8, 6))
plt.scatter(data_pca[:, 0], data_pca[:, 1], c='blue', label='Data after PCA')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('Data Projection on Principal Components')
plt.legend()
plt.show()

这段代码展示了降维后的数据分布,将高维数据投影到 2 维空间,方便进行可视化分析。


4. 📊 如何选择适合的主成分数量

PCA 的核心在于通过选择几个主要的主成分来达到降维效果,但关键在于如何确定要保留多少个主成分。在实践中,常用以下几种方法来确定主成分的数量:

4.1 累积方差解释率

PCA 的一个重要指标是累积方差解释率,它表示前 (k) 个主成分能够解释原始数据中方差的比例。当累积方差解释率达到一定阈值(例如 95%)时,通常认为选择的主成分数量已经足够。

# 输出累积方差解释率
cum_var = np.cumsum(pca.explained_variance_ratio_)
print(f'累积方差解释率:{cum_var}')

通过观察累积方差解释率的曲线,常见的做法是选择解释率达到 90%-95% 的主成分数量。

4.2 碎石图法(Scree Plot)

碎石图法是一种直观的图形方法,通过绘制各主成分的方差解释率图形,选择拐点处的主成分数量。

# 碎石图法
plt.figure(figsize=(8, 6))
plt.plot(np.arange(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, 'o-', label='Explained Variance')
plt.xlabel('Number of Principal Components')
plt.ylabel('Explained Variance Ratio')
plt.title('Scree Plot')
plt.legend()
plt.show()

从图中可以观察到,拐点处之后的主成分对数据的解释能力下降,通常可以选择拐点之前的主成分数量。


5. ⚙️ 实践:使用 PCA 进行图像降维

PCA 在图像处理领域也有广泛的应用,尤其是对高维图像数据进行压缩时,它能够有效减少图像维度,而不明显损失图像的细节信息。以下是一个使用 PCA 对手写数字数据集进行降维的实例。

# 导入手写数字数据集
from sklearn.datasets import load_digits# 加载数据
digits = load_digits()
data = digits.data
print(f'原始数据形状:{data.shape}')  # 输出(1797, 64) 表示1797个64维的数据# 数据标准化
scaler = StandardScaler()
data_scaled= scaler.fit_transform(data)# PCA降维
pca = PCA(n_components=10)  # 将数据降维到10个主成分
data_pca = pca.fit_transform(data_scaled)
print(f'降维后的数据形状:{data_pca.shape}')

在该实例中,原始手写数字图像的维度为 64(即 8x8 像素),通过 PCA 降维至 10 维,能够显著减少数据的维度,同时保留大部分图像的关键信息。


6. 🧩 PCA 与其他降维算法的对比

PCA 是最经典的降维算法之一,但在实际应用中,还有其他多种降维算法。与 PCA 相比,其他算法如 t-SNE、LDA(线性判别分析)等具有不同的特性和适用场景。

6.1 t-SNE

t-SNE(t-分布邻域嵌入)是一种非线性降维方法,特别适用于高维数据的可视化,它在低维空间中保留了高维数据的局部结构。在聚类任务中,t-SNE 的表现通常优于 PCA。

6.2 LDA

LDA 是一种监督式降维方法,它的目标是在保留类别信息的前提下,找到各类别之间差异最大的方向。与 PCA 不同,LDA 需要标签信息来进行降维,因此常用于分类问题的数据预处理。

# LDA 实现代码
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA# LDA降维
lda = LDA(n_components=2)
data_lda = lda.fit_transform(data_scaled, digits.target)
print(f'LDA降维后的数据形状:{data_lda.shape}')

通过以上分析可以看出,PCA 主要适用于无监督学习的降维任务,而 LDA 则专注于有监督学习。因此,根据任务需求选择合适的降维算法是至关重要的。

相关文章:

Python机器学习中的主成分分析(PCA)全面解析与应用

🎯 Python机器学习中的主成分分析(PCA)全面解析与应用 📖 目录 🌟 主成分分析 (PCA) 的概念和原理🔎 PCA的数学基础🛠 Python 实现 PCA 的步骤详解📊 如何选择适合的主成分数量⚙️…...

MySQL 安装和基本使用

MySQL 介绍 MySQL 的特性 MySQL 是基于开源协议发布的,可以免费使用,也可以基于源码进行二次开发。 MySQL 使用标准 SQL 语言进行管理。 MySQL 可以运行于多个系统上,具有跨平台特性,并且支持多种语言。 MySQL 使用插件式存储…...

RequestBody接收参数报错com.fasterxml.jackson.databind.exc.MismatchedInputException

目录: 1、错误现象2、解决办法3、最终验证 1、错误现象 报错的现象和代码如下: 2、解决办法 查了很多都说参数类型对不上,最后只有换接收方式后验证是可以的;最终想了一下,觉得是请求的是json,需要用json接…...

大数据治理的关键技术:构建稳固的数据基石

在这个信息爆炸的时代,数据已经成为企业最宝贵的资产之一。然而,随着数据量的爆炸性增长,如何有效治理这些数据成为了一个巨大的挑战。今天,我们就来聊聊大数据治理的关键技术,看看如何构建一个稳固的数据基石&#xf…...

OS管理和进程的学习

1.冯诺依曼体系结构 1.1 输入设备:键盘,鼠标,键盘,网卡(网络接受),磁盘... 输出设备:显示器,磁盘,网卡(网络发送) .... 存储器&…...

Linux 部署 Harbor 镜像仓库详解

文章目录 安装 Docker安装 Harbor访问 Harbor 安装 Docker 本次部署流程使用的是1台阿里云ECS,Ubuntu 22.04,2核4G。 首先需要做的是在当前服务器上,安装好 Docker,参考链接如下: https://blog.csdn.net/weixin_4659…...

怎么把flv格式转换成mp4?将flv格式换成MP4格式的简单方法

怎么把flv格式转换成mp4?flv这一昔日网络视频领域的璀璨明星,凭借其小巧的文件体积与卓越的流媒体传输性能,曾在网络视频时代初期大放异彩,成为无数网络视频爱好者的首选。然而,随着科技的日新月异与多媒体设备的多元化…...

原型模式和建造模式的区别

原型模式(Prototype Pattern)和建造者模式(Builder Pattern)虽然都是创建型设计模式,但它们的应用场景和实现方式有着显著的区别。以下是二者的详细对比: 1. 意图和应用场景 原型模式: 意图&a…...

最新 client-java 调用 k8s ApiServer

创建权限绑定 sa-role.yaml apiVersion: v1 kind: ServiceAccount metadata:name: my-admin #账号名namespace: kube-system--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: "true…...

TCP单包数据大于1460字节会被拆包的问题

关于TCP单包数据大于1460字节会被拆包的问题 1、问题背景: 最近在用STM32W5500做项目,需要STM32通过TCP协议发送数据到上位机并显示。当数据量小的时候上位机显示正常,一旦数据量大过大上位机就会出现数据丢失的情况,甚至数据直接…...

苏宁关键字搜索接口技术解析与实战

在当今的电商领域,搜索功能无疑是用户寻找心仪商品的最重要途径之一。苏宁作为国内知名的电商平台,其提供的API接口服务为开发者提供了丰富的商品数据。本文将详细介绍如何使用苏宁的关键字搜索接口,通过编写代码实现商品搜索功能。 接口概述…...

Java学习教程,从入门到精通,Java 基本数据类型详解(5)

Java 基本数据类型详解 Java是一种强类型语言,这意味着在Java程序中,每个变量都必须明确声明其数据类型。Java提供了八种基本数据类型(Primitive Data Types),这些类型都是预先定义好的,并且每种类型都占用…...

使用Flask实现本机的模型部署

前言 模型部署是指将大模型运行在专属的计算资源上,使模型在独立的运行环境中高效、可靠地运行,并为业务应用提供推理服务。其目标是将机器学习模型应用于实际业务中,使最终用户或系统能够利用模型的输出,从而发挥其作用。 一、设…...

基于SSM的校园跑腿网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 课题来源及研究的目的和意义 随着网络技术的不断完善与发展,各种互联网公司不断如雨后春笋般不断涌现,丰富了人们生活的各个方面。近年来由于 Online To 0ffline即线上到线下(020)模式的发展和兴起&…...

【Java】正则表达式详解

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...

Java知识巩固(七)

目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象,也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…...

Ubuntu22.04 更换源

Ubuntu22.04 更换网易163源 1、编辑/etc/apt/sources.list文件 1 sudo nano /etc/apt/sources.list 2、清空文件内容,拷贝下列163源到文本。 1 2 3 4 5 6 7 8 deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse deb http://mirro…...

江恩理论和波浪理论的结合

结合波浪理论和江恩理论需要综合考虑市场波动的形态以及时间和价格的关系。这两者都是技术分析中的重要工具,能够帮助投资者更好地理解市场的趋势和未来的走势。 波浪理论(Elliott Wave Theory) 波浪理论是由Ralph Nelson Elliott提出的&…...

AJAX——AJAX 取消请求

利用 abort()方法取消请求 本文分享到此结束,欢迎大家评论区相互讨论学习,下一篇继续分享AJAX中请求重复发送问题的学习。...

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 目录 前…...

编程分析企业奖罚制度执行数据,优化奖罚标准,做到赏罚分明,调动全体员工职场工作积极性。

定位是:商务智能(BI) Python 人力资源数据分析,可直接用于课程设计、技术博客或企业内部管理优化原型。⚠️ 说明:本方案不评价企业文化优劣、不站队劳资任何一方,仅提供数据建模与分析框架。一、实际应用…...

MATLAB人形机器人仿真实战:从零构建双足平衡控制系统的完整指南

MATLAB人形机器人仿真实战:从零构建双足平衡控制系统的完整指南 【免费下载链接】IntroductionToHumanoidRobotics Matlab code for a Springer book "Introduction to Humanoid Robotics" 项目地址: https://gitcode.com/gh_mirrors/in/IntroductionTo…...

i.MX8M Plus开发板OV5640摄像头驱动配置与调试全攻略

1. 项目概述:为i.MX8M Plus开发板适配OV5640摄像头在嵌入式视觉项目里,无论是做安防监控、工业质检的“眼睛”,还是给机器人装上感知环境的“视觉”,第一步也是最基础的一步,就是把摄像头给跑起来。最近我在一个基于NX…...

DIY改造:为Hakko FX-901烙铁打造USB-C充电电池包

1. 项目概述:打造你的专属USB充电无线烙铁 如果你和我一样,经常需要带着烙铁跑现场——无论是调试RC模型、在Maker Faire上修复作品,还是在户外临时搭建一个电子装置——那你一定对传统无线烙铁的痛点深有体会。四节AA电池,用不了…...

Orange Pi i 96开发板实战:从硬件解析到家庭服务器与物联网应用部署

1. 项目概述:为什么是Orange Pi i 96?最近在捣鼓一些边缘计算和轻量级服务器的项目,手头正好需要一块性能足够、接口丰富但又足够小巧、功耗可控的开发板。市面上树莓派当然是首选,但供货和价格嘛,你懂的。于是我把目光…...

STM32F411CEU6实战:用W25Q64给1.54寸LCD屏做个‘离线相册’,附完整源码与图片转换工具

STM32F411CEU6与W25Q64打造智能离线相册:从图片压缩到流畅显示的完整方案 在嵌入式开发领域,如何高效地存储和显示大量图片一直是个颇具挑战性的课题。传统方案往往受限于微控制器的有限内存,而外部存储与显示技术的结合为这个问题提供了优雅…...

NotebookLM讨论模块写作:为什么87%的用户输出缺乏论证纵深?3个可立即部署的认知框架

更多请点击: https://intelliparadigm.com 第一章:NotebookLM讨论模块写作的认知断层诊断 NotebookLM 的讨论模块(Discussion Panel)旨在基于用户上传的文档生成上下文感知的对话,但实践中常出现“理解正确却表达失焦…...

对比直接使用原生 API 与通过 Taotoken 调用在账单清晰度上的差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用原生 API 与通过 Taotoken 调用在账单清晰度上的差异 对于需要频繁调用多个大语言模型的团队或个人开发者而言&#x…...

基于开源项目构建智能音箱自定义电台技能:从原理到部署实践

1. 项目概述:一个为智能音箱打造的“龙虾电台”技能最近在折腾智能家居和语音助手,发现一个挺有意思的开源项目,叫“lobster-radio-skill”。光看名字,你可能会有点摸不着头脑:“龙虾电台”?这跟智能音箱有…...

单卡训练mmsegmentation模型?先把这个SyncBN改成BN(附完整配置文件修改指南)

单卡训练mmsegmentation模型?先解决SyncBN这个关键配置 当你第一次在个人电脑或实验室的单一GPU设备上运行mmsegmentation训练脚本时,屏幕上突然弹出的SyncBN相关错误信息可能会让兴奋的心情瞬间跌入谷底。这个看似简单的配置问题,实际上反映…...