主成分分析基本概念及python代码使用
目录
1. 前言
2. 主成分分析的基本概念
3. PCA的适应场景
4. PCA算法的理论基础
4.1 标准化数据
4.2 计算协方差矩阵
4.3 求解特征值和特征向量
4.4 选择主成分
4.5 投影到新坐标系
5. 完整的PCA示例
5.1 使用手写数字数据集
5.2 可视化降维后的数据
6. PCA的优缺点
7. 总结
1. 前言
在数据科学领域,我们经常需要处理高维数据。高维数据虽然包含丰富的信息,但也带来了存储空间大、计算复杂等问题。主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维技术,能帮助我们从高维数据中提取关键信息,同时减少数据的维度。本文将深入浅出地介绍PCA的原理、应用和实现方法,并结合Python代码演示其应用。
2. 主成分分析的基本概念
主成分分析是一种统计方法,旨在将高维数据投影到低维空间,同时尽可能保留原始数据的关键信息。它通过构造数据的线性组合,找到数据中最大的方差方向,从而捕捉数据的主要结构特征。
让我们用一个简单的例子来理解PCA:假设你有一组二维数据点,这些点大致沿着某个方向分布。PCA会寻找一个坐标轴,使得数据在这个轴上的投影具有最大的方差。这个轴就是第一主成分,它代表了数据的主要变化方向。
运用python代码需要一定的库:
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
3. PCA的适应场景
PCA在多种场景下都能发挥作用:
-
维度约简:在处理高维数据时降低数据维度,提高计算效率。
-
特征提取:从高维数据中提取关键特征,用于后续分析或建模。
-
数据可视化:将高维数据降至二维或三维,便于可视化展示。
-
噪声过滤:PCA能去除数据中的次要变化,保留主要特征。
4. PCA算法的理论基础
4.1 标准化数据
在应用PCA之前,我们通常需要标准化数据,使每个特征的均值为0,标准差为1。标准化可以消除数据的量纲差异,确保各个特征在分析中具有相同的权重。
# 生成随机数据用于演示
np.random.seed(42)
X = np.dot(np.random.random(size=(2, 2)), np.random.normal(size=(2, 100))).T
X_scaled = StandardScaler().fit_transform(X)
StandardScaler
是 scikit-learn 库中的一个类,用于标准化特征。StandardScaler
假设数据服从正态分布,并通过减去均值和除以标准差的方式,将数据转换为标准正态分布(均值为 0,标准差为 1)
.fit_transform(X)
这个方法结合了两个步骤:
-
fit :计算数据的均值和标准差。
-
transform :使用计算出的均值和标准差对数据进行标准化。
具体来说,对于数据集 X 中的每个特征(列),计算其均值(mean)和标准差(std),然后对每个特征值进行如下转换: X_scaled = (X - mean) / std
np.dot()对前面生成的两个矩阵进行矩阵乘法操作(点乘)。这个操作将 2x2 的随机矩阵与 2x100 的正态分布矩阵相乘,结果是一个 2x100 的矩阵。这个矩阵的行代表特征,列代表样本。通过这种方式,我们引入了特征之间的相关性。
4.2 计算协方差矩阵
协方差矩阵用于衡量数据的不同维度之间的相关性。通过计算标准化后的数据的协方差矩阵,可以了解各个特征之间的线性关系。
cov_matrix = np.cov(X_scaled, rowvar=False)
print("协方差矩阵:", cov_matrix)
4.3 求解特征值和特征向量
协方差矩阵的特征值表示各个主成分解释的方差大小,特征向量则确定了主成分的方向。
# 用NumPy计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
print("特征值:", eigenvalues)
print("特征向量:", eigenvectors)
4.4 选择主成分
根据特征值选择主要的主成分。通常,我们选择累积解释方差达到一定比例(如95%)的主成分。
# 排序特征值并选择主要的主成分
sorted_indices = np.argsort(eigenvalues)[::-1]
eigenvalues_sorted = eigenvalues[sorted_indices]
eigenvectors_sorted = eigenvectors[:, sorted_indices]# 计算累积解释方差
cumulative_variance = np.cumsum(eigenvalues_sorted) / np.sum(eigenvalues_sorted)
print("累积解释方差:", cumulative_variance)
4.5 投影到新坐标系
最后,将原始数据投影到由选定的主成分构成的新坐标系中。
# 选择前K个主成分
k = 1 # 假设我们选择一个主成分进行降维
pca_projector = eigenvectors_sorted[:, :k]
X_pca = np.dot(X_scaled, pca_projector)print("降维后的数据形状:", X_pca.shape)
5. 完整的PCA示例
5.1 使用手写数字数据集
为了更好地理解PCA的应用,我们将使用经典的手写数字数据集(MNIST),并展示如何使用PCA进行降维和可视化。
from sklearn.datasets import load_digits# 加载手写数字数据集
digits = load_digits()
X, y = digits.data, digits.target# 标准化数据
X_scaled = StandardScaler().fit_transform(X)# 创建PCA对象并拟合数据
pca = PCA(n_components=0.95) # 保留95%的方差
X_pca = pca.fit_transform(X_scaled)print("原始数据维度:", X.shape)
print("降维后的数据维度:", X_pca.shape)
5.2 可视化降维后的数据
降维后的数据可以通过散点图进行直观展示。我们可以通过不同颜色代表不同数字类别,观察数据的分布情况。
# 可视化降维后的数据
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', alpha=0.6)
plt.colorbar(scatter)
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的手写数字数据')
plt.show()
6. PCA的优缺点
优点:
-
有效减少数据维度,提高计算效率。
-
去除噪声,保留数据的主要结构特征。
-
提供数据的直观可视化。
缺点:
-
PCA是线性方法,对非线性数据效果不佳。
-
主成分的解释性可能较差,难以直接关联到原始特征。
7. 总结
主成分分析(PCA)是一种强大而实用的数据降维方法,在数据预处理、特征提取和可视化中发挥着重要作用。通过本文,我们了解了PCA的基本原理、适应场景以及Python实现方法。在实际应用中,PCA可以帮助我们更好地理解和处理高维数据,为后续分析和建模奠定基础。然而,在使用PCA时,我们也应注意其适用性和局限性,合理选择参数以获得最佳效果。
相关文章:
主成分分析基本概念及python代码使用
目录 1. 前言 2. 主成分分析的基本概念 3. PCA的适应场景 4. PCA算法的理论基础 4.1 标准化数据 4.2 计算协方差矩阵 4.3 求解特征值和特征向量 4.4 选择主成分 4.5 投影到新坐标系 5. 完整的PCA示例 5.1 使用手写数字数据集 5.2 可视化降维后的数据 6. PCA的优缺…...
MCP如何助力智能交通系统?从数据融合到精准决策
MCP如何助力智能交通系统?从数据融合到精准决策 近年来,智能交通系统(ITS)正在全球范围内快速发展,它结合人工智能(AI)、物联网(IoT)和数据分析,致力于提高交通效率、减少拥堵、增强安全性。而MCP(Multi-Constraint Pathfinding,多约束路径寻优)技术作为一种复杂…...
什么是抽象类?是所有函数都是纯虚函数吗?
什么是抽象类? 抽象类(Abstract Class)是一种特殊的类,它不能被直接实例化,但可以作为基类被其他类继承。抽象类的主要用途是定义一组接口规范,这些规范由派生类实现。 在C中,抽象类是通过包含…...
计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
以下是一个结合ARIMA、鲸鱼优化算法(WOA)、CNN和LSTM进行时间序列预测的Python实现框架。由于完整代码和数据量较大,此处提供核心代码结构和示例数据集,您可根据需求扩展。 1. 数据准备(示例数据) 使用airline-passengers.csv(航空乘客数据集): import pandas as pd…...

【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统
转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/146409453 作者:CSDN|Ringleader| 1 结构 1.1 状态机 1.2 SMB 2 代码实现 2.1 核心控制 Player_Base_SMB 继承 StateMachineBehaviour ,控制变量初始…...
C/C++的OpenCV 进行图像梯度提取
使用 C/OpenCV 进行图像梯度提取 图像梯度表示图像中像素强度的变化率和方向。它是图像分析中的一个基本概念,广泛应用于边缘检测、特征提取和物体识别等任务。OpenCV 提供了多种计算图像梯度的函数。本文将介绍几种常用的梯度算子及其在 C/OpenCV 中的实现。 预备…...
Redis 缓存使用的BigKey问题
一、什么是 BigKey? BigKey 指在 Redis 中存储的 单个 Key 对应的 Value 过大,通常表现为: String 类型:Value 长度 > 10KB。Hash/List/Set/ZSet:元素数量 > 5,000 或总大小 > 10MB。 二、BigKey 的危害 问…...

【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰
一、消息队列:分布式系统的核心枢纽 在分布式架构日益普及的今天,消息队列(Message Queue, MQ)已成为解决系统复杂性的核心组件。它通过异步通信、系统解耦和流量控制等能力,有效应对高并发场景下的数据流动挑战。 1.1 核心特性:异步、解耦与弹性 1.1.1 异步通信:释放…...

软媒魔方——一款集合多种系统辅助组件的软件
停更4年,但依旧吊炸天! 亲们,是不是觉得电脑用久了就像老牛拉车,慢得让人着急?别急,我今天要给大家安利一个超好用的电脑优化神器——软媒魔方! 软件介绍 首先,这货真心是免费的&a…...
Unity场景的加载与卸载
Unity场景的加载与卸载 使用方法:把SceneLoader 脚本代码挂在场景中 使用示例: SceneLoader.Instance.LoadAdditiveScene(8);//通过场景索引加载SceneLoader.Instance.UnloadScene("ShiWaiScene");//通过场景名字卸载脚本代码如下࿱…...

多路径可靠传输协议(比如 MPTCP)为什么低效
可靠就不能多路径,多路径求可靠必然要多费劲。这不难理解,多路径必异步,这无疑增加了可靠性判断的难度。 前文 多路径传输(比如 MPTCP)对性能的意义 阐述了作为单连接的多子流 MPTCP 对传输性能的意义是无意义,本文接着阐述作为隧…...

塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路
在工厂的能耗构成中,制冷系统是重要的耗能环节。传统的水蓄冷和冰蓄冷技术在实际应用中存在一些局限性,难以满足工厂对节能和成本控制的更高要求。塔能科技的高温冰蓄冷技术,凭借其独特的优势,为工厂能耗精准节能提供了创新的解决…...

内存优化笔记1
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 问题提出 在很多工业软件中,需要对对象进行微分细化,这样会产生很多(几百万到几千万)对象。随着业务的发展,…...

人脸识别,使用 deepface + api + flask, 改写 + 调试
1. 起因, 目的, 感受: github deepface 这个项目写的很好, 继续研究使用这个项目,改写 api。增加一个前端 flask app 2. 先看效果 3. 过程: 大力改写原始项目中 api 这部分的代码, 原始项目的文件结构太繁杂了: 我把…...

代码管理平台Gitlab如何通过快解析实现远程访问?
一、Gitlab功能介绍 Gitlab是被广泛使用的基于git的开源代码管理平台,用于管理、存储开发人员代码,同时可以协同开发 二、外网试用Gitlab遇到的问题 运维人员将Gitlab服务器部署在总部机房,而分公司开发人员和出差运维人员就无法访问Gitlab…...

基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
项目背景与概述 随着足球青训行业的快速发展,如何高效、规范地管理学员、教练以及课程等日常工作,成为了青训俱乐部运营的重要课题。为了提升俱乐部的管理效率与用户体验,基于 Spring Boot 和 Vue.js 开发了一个 足球青训俱乐部管理后台系统…...
Redis 是否适合像 MySQL 一样当数据库使用?
Redis 可以在特定场景下作为数据库使用,但与 MySQL 等关系型数据库还是有很大的差异。Redis 确实有持久化功能,开启 AOF 并把 appendfsync 设置为 always 后,它会把每一次数据操作都立刻记录到文件里,相当于每发生一件事就马上记下…...
AI是否会取代人类?浔川问答①
提问者:浔川社团官方联合会 回答者:deepseek 关于AI是否会取代人类的问题,目前科技界和社会学界的主流观点认为:AI会在许多领域显著改变人类的工作和生活方式,但“完全取代人类”的可能性极低。更可能的是人机协作的深…...
JDBC-java操作数据库
1.基本结构: package com.atguigu.servlets;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement;public class JDBCemo {public static void main(String[] args) throws Exception{String url "jdbc:mysql:///mysql&qu…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...

线程调度与单例模式:wait、notify与懒汉模式解析
一.wait 和 notify(等待 和 通知) 引入 wait notify 就是为了能够从应用层面,干预到多个不同线程代码的执行顺序,可以让后执行的线程主动放弃被调度的机会,等先执行的线程完成后通知放弃调度的线程重新执行。 自助取…...

MySQL中TCP和套接字SSL加密连接行为分析
目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL(Secure S…...

php本地 curl 请求证书问题解决
错误: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解决方案 在php目录下创建证书文件夹, 执行下面生成命令, 然后在php.ini 文件中配置证书路径; 重启环境 curl --eta…...
Callable
一、Callable 接口定义 FunctionalInterface public interface Callable<V> {V call() throws Exception; // 返回类型为泛型V,可抛出异常 }二、基本使用步骤 1. 定义 Callable 任务 // 示例1:计算两个数的和 Callable<Integer> sumTask …...
Honeywell 05701-A-0302 单通道控制卡
Honeywell 05701-A-0302 是System 57系列中的单通道控制卡,专为工业气体检测和火灾报警系统设计。该控制卡为系统提供单个检测通道的完整控制解决方案,包括传感器驱动、信号采集和报警管理功能。 主要特性 单通道控制:支持单个气体传感器或火…...

爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式
随着科技的发展,尤其是国产新能源汽车的崛起,相信大家对数字钥匙的概念已经不陌生了,通过手机、智能穿戴实现对汽车的多功能控制已经是很多汽车的标配。但是目前数字钥匙也有一定的局限性,比如定位不准、安全性不强等等࿰…...

电子电路:深入理解电磁耦合的定义与应用
电场和磁场是独立存在的吗?,但实际上根据麦克斯韦理论,它们是同一现象的两个方面,通过变化相互产生。这时候需要强调时变场的重要性,以及静态场和动态场的区别。 通过电磁波的概念,说明电磁耦合如何导致电…...

宝塔安装的 MySQL 无法连接的情况及解决方案
宝塔安装的 MySQL 无法连接的情况及解决方案 宝塔面板是一款流行的服务器管理工具,其中集成的 MySQL 数据库有时会出现连接问题。本文详细介绍两种最常见的 MySQL 连接错误:“1130 - Host is not allowed to connect” 和 “1045 - Access denied”&…...

今日行情明日机会——20250523
上证指数缩量下跌,个股下跌超过4000个,总体跌多涨少,日线总体处于高位,注意风险。 深证60分钟级别下跌趋势线压制,总体日线转下跌的概率大,注意风险。 2025年5月23日涨停股主要行业方向分析 一、核心主…...

微服务项目->在线oj系统(Java版 - 4)
相信自己,终会成功 目录 B端用户管理 C端用户代码 发送验证码: 验证验证码 退出登录 登录用户信息功能 用户详情与用户编辑 用户竞赛接口 用户报名竞赛 用户竞赛报名接口查询 用户信息列表 ThreadLocalUtil Hutool工具库 常用功能介绍 B端用户管理 进行列表显示与…...