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

PCA的一些实际应用

PCA是一种常用的降维技术,在数据可视化、特征提取、噪声去除等方面有广泛应用。下面我将通过一个实际案例展示如何使用 Python 进行 PCA 降维。

这个例子会使用手写数字数据集,将高维特征降维到 2 维以便可视化,同时展示降维前后的分类效果对比

代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report# 1. 加载数据集
digits = load_digits()
X = digits.data  # 特征数据,8x8的图像展平成64维向量
y = digits.target  # 标签
print(f"原始数据维度: {X.shape}")  # 应该是(n_samples, 64)# 2. 数据可视化 - 展示一些原始图像
plt.figure(figsize=(10, 4))
for i in range(5):plt.subplot(1, 5, i+1)plt.imshow(X[i].reshape(8, 8), cmap=plt.cm.gray)plt.title(f"数字 {y[i]}")plt.axis('off')
plt.suptitle("原始手写数字图像")
plt.show()# 3. 应用PCA降维
# 降维到2维以便可视化
pca_2d = PCA(n_components=2)
X_pca_2d = pca_2d.fit_transform(X)
print(f"降维到2维后的数据维度: {X_pca_2d.shape}")# 计算解释方差比例
print(f"前2个主成分解释的方差比例: {pca_2d.explained_variance_ratio_}")
print(f"累计解释方差比例: {sum(pca_2d.explained_variance_ratio_)}")# 4. 可视化降维结果
plt.figure(figsize=(10, 8))
scatter = plt.scatter(X_pca_2d[:, 0], X_pca_2d[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k', alpha=0.7, s=50)
plt.colorbar(scatter, label='数字标签')
plt.xlabel(f'主成分1 (解释方差: {pca_2d.explained_variance_ratio_[0]:.2f})')
plt.ylabel(f'主成分2 (解释方差: {pca_2d.explained_variance_ratio_[1]:.2f})')
plt.title('PCA降维到2D的手写数字数据分布')
plt.show()# 5. 确定保留多少主成分
pca_full = PCA().fit(X)
plt.figure(figsize=(10, 6))
plt.plot(np.cumsum(pca_full.explained_variance_ratio_))
plt.xlabel('主成分数量')
plt.ylabel('累计解释方差比例')
plt.axhline(y=0.95, color='r', linestyle='--', label='95%方差')
plt.title('累计解释方差比例与主成分数量关系')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()# 找到解释95%方差所需的主成分数量
n_components = np.argmax(np.cumsum(pca_full.explained_variance_ratio_) >= 0.95) + 1
print(f"解释95%方差所需的主成分数量: {n_components}")# 6. 使用最佳主成分数量进行降维
pca_optimal = PCA(n_components=n_components)
X_pca = pca_optimal.fit_transform(X)
print(f"优化后的PCA降维数据维度: {X_pca.shape}")# 7. 比较降维前后的分类效果
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 使用原始数据训练分类器
rf_original = RandomForestClassifier(random_state=42)
rf_original.fit(X_train, y_train)
y_pred_original = rf_original.predict(X_test)
accuracy_original = accuracy_score(y_test, y_pred_original)
print(f"原始数据分类准确率: {accuracy_original:.4f}")# 对训练集和测试集都应用PCA降维
X_train_pca = pca_optimal.transform(X_train)
X_test_pca = pca_optimal.transform(X_test)# 使用降维后的数据训练分类器
rf_pca = RandomForestClassifier(random_state=42)
rf_pca.fit(X_train_pca, y_train)
y_pred_pca = rf_pca.predict(X_test_pca)
accuracy_pca = accuracy_score(y_test, y_pred_pca)
print(f"PCA降维后分类准确率: {accuracy_pca:.4f}")# 输出详细分类报告
print("\n原始数据分类报告:")
print(classification_report(y_test, y_pred_original))print("\nPCA降维后分类报告:")
print(classification_report(y_test, y_pred_pca))

代码解析

这个 PCA 降维的实际应用案例主要包含以下几个步骤:

数据加载:使用 sklearn 的手写数字数据集,包含 8x8 像素的手写数字图像,每个图像被展平为 64 维特征向量。

PCA 降维过程

首先将数据降维到 2 维,以便可视化不同数字的分布

计算主成分解释的方差比例,评估降维效果

通过累计解释方差比例曲线,确定保留 95% 信息所需的主成分数量

效果评估

可视化降维后的 2D 数据分布,观察不同数字的聚类情况

比较原始高维数据和降维后数据在分类任务上的表现

使用随机森林分类器评估降维对模型性能的影响

实际应用价值

通过这个例子可以看到 PCA 降维的实际价值:

数据可视化:将高维数据降到 2-3 维,便于人类理解数据分布

特征压缩:用更少的维度保留大部分信息,减少存储和计算成本

噪声去除:主成分通常对应数据的主要变化,有助于过滤噪声

模型优化:在保持相近性能的同时,减少特征维度可以加快模型训练和预测速度

在实际应用中,PCA 常用于图像识别、自然语言处理、基因数据分析等领域,作为预处理步骤来简化后续的数据分析或建模过程。

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

相关文章:

  • 详解flink java基础(一)
  • 前端项目的打包部署
  • 【MySQL学习|黑马笔记|Day7】触发器和锁(全局锁、表级锁、行级锁、)
  • Docker Compose 安装 Neo4j 的详细步骤
  • Docker之自定义jkd镜像上传阿里云
  • Docker+飞算JavaAI=未来:全流程容器化AI开发实战
  • 堆(Heap):高效的优先级队列实现
  • 适用监测农作物长势和病虫害的高光谱/多光谱相机有哪些?
  • 已开源:Highcharts.NET,Highcharts Android,与Highcharts iOS集成
  • 【Virtual Globe 渲染技术笔记】8 顶点变换精度
  • p5.js 3D 形状 “预制工厂“——buildGeometry ()
  • 积鼎科技CFD VirtualFlow:引领国产多相流仿真技术,赋能工业智造
  • 6.Ansible自动化之-管理变量和事实
  • 使用vscode的task.json来自动执行make命令,而不直接使用终端
  • 智能化管理:开启海洋牧场新时代
  • Excel 表格数据自动填充
  • C++算法竞赛:位运算
  • Android 组件封装实践:从解耦到架构演进
  • 工作中使用到的 TRPS 【Temporal Residual Pattern Similarity】和 K-sigma 算法
  • 知识点汇集-web
  • Spring 源码学习(十一)—— webmvc 配置
  • 项目发布上线清单
  • 如何在Windows系统中更改用户名(中文转英文全流程)
  • LeetCode 837.新 21 点:动态规划+滑动窗口
  • 【运维进阶】实施任务控制
  • C语言---第一个C语言程序
  • 12.web api 3
  • 网格布局 CSS Grid
  • 【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day6
  • k8s集群搭建一主多从的jenkins集群