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

主成分分析基本概念及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在多种场景下都能发挥作用:

  1. 维度约简:在处理高维数据时降低数据维度,提高计算效率。

  2. 特征提取:从高维数据中提取关键特征,用于后续分析或建模。

  3. 数据可视化:将高维数据降至二维或三维,便于可视化展示。

  4. 噪声过滤: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时,我们也应注意其适用性和局限性,合理选择参数以获得最佳效果。

http://www.lryc.cn/news/2384484.html

相关文章:

  • MCP如何助力智能交通系统?从数据融合到精准决策
  • 什么是抽象类?是所有函数都是纯虚函数吗?
  • 计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
  • 【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统
  • C/C++的OpenCV 进行图像梯度提取
  • Redis 缓存使用的BigKey问题
  • 【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰
  • 软媒魔方——一款集合多种系统辅助组件的软件
  • Unity场景的加载与卸载
  • 多路径可靠传输协议(比如 MPTCP)为什么低效
  • 塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路
  • 内存优化笔记1
  • 人脸识别,使用 deepface + api + flask, 改写 + 调试
  • 代码管理平台Gitlab如何通过快解析实现远程访问?
  • 基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
  • Redis 是否适合像 MySQL 一样当数据库使用?
  • AI是否会取代人类?浔川问答①
  • JDBC-java操作数据库
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • MySQL中TCP和套接字SSL加密连接行为分析
  • php本地 curl 请求证书问题解决
  • Callable
  • Honeywell 05701-A-0302 单通道控制卡
  • 爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式
  • 电子电路:深入理解电磁耦合的定义与应用
  • 宝塔安装的 MySQL 无法连接的情况及解决方案
  • 今日行情明日机会——20250523
  • 微服务项目->在线oj系统(Java版 - 4)
  • ReAct 与 CoAct:AI 代理的推理与行动之旅