数学建模学习-主成分分析(Principal Component Analysis)教程(12)

数学建模学习-主成分分析(Principal Component Analysis)教程(12)

写在最前

注意本文的相关代码及例子为同学们提供参考,借鉴相关结构,在这里举一些通俗易懂的例子,方便同学们根据实际情况修改代码,很多同学私信反映能否添加一些可视化,这里每篇教程都尽可能增加一些可视化方便同学理解,但具体使用时,同学们要根据实际情况选择是否在论文中添加可视化图片。

系列教程计划持续更新,同学们可以免费订阅专栏,内容充足后专栏可能付费,提前订阅的同学可以免费阅读,同时相关代码获取可以关注博主评论或私信。

目录

  1. 算法简介
  2. 算法特点
  3. 环境准备
  4. 代码实现
  5. 运行结果
  6. 总结

算法简介

主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取方法。它通过线性变换将原始数据投影到一个新的坐标系统中,使得数据在新坐标系下的方差最大化,同时保持数据的主要特征。PCA的主要目标是找到数据中的主要模式,并减少数据的维度,同时尽可能保留原始数据的信息。

数学原理

PCA的数学原理主要基于以下步骤:

  1. 数据中心化:
    X c e n t e r e d = X − X ˉ X_{centered} = X - \bar{X} Xcentered=XXˉ

  2. 计算协方差矩阵:
    C = 1 n − 1 X c e n t e r e d T X c e n t e r e d C = \frac{1}{n-1}X_{centered}^TX_{centered} C=n11XcenteredTXcentered

  3. 计算协方差矩阵的特征值和特征向量:
    C v = λ v C\mathbf{v} = \lambda\mathbf{v} Cv=λv

  4. 选择最大的k个特征值对应的特征向量作为主成分。

算法特点

  1. 降维能力:能够有效减少数据维度,同时保留主要信息。
  2. 去除相关性:转换后的特征之间正交,消除了特征间的线性相关性。
  3. 数据压缩:可以用较少的特征表示原始数据,实现数据压缩。
  4. 噪声过滤:通过只保留主要成分,可以过滤掉数据中的噪声。
  5. 可视化:可以将高维数据投影到低维空间进行可视化。

环境准备

本教程需要以下Python库:

numpy==1.21.0
pandas==1.3.0
scikit-learn==0.24.2
matplotlib==3.4.2
seaborn==0.11.1

代码实现

我们将通过一个简单的例子来演示PCA的使用。首先,我们生成一些相关的三维数据,然后使用PCA进行降维和分析。

数据准备

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 生成示例数据
np.random.seed(42)
n_samples = 300

# 创建相关的特征
x = np.random.normal(0, 1, n_samples)
y = 0.8 * x + np.random.normal(0, 0.5, n_samples)
z = 0.6 * x - 0.4 * y + np.random.normal(0, 0.2, n_samples)

# 将数据组合成特征矩阵
X = np.column_stack((x, y, z))

数据预处理和PCA实现

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 创建PCA对象并拟合数据
pca = PCA()
X_pca = pca.fit_transform(X_scaled)

# 计算解释方差比
explained_variance_ratio = pca.explained_variance_ratio_

可视化代码

# 绘制原始数据的散点图
plt.figure(figsize=(10, 8))
ax = plt.axes(projection='3d')
scatter = ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=X[:, 0], cmap='viridis')
plt.colorbar(scatter)
ax.set_xlabel('特征1')
ax.set_ylabel('特征2')
ax.set_zlabel('特征3')
plt.title('原始三维数据分布')
plt.savefig('images/original_data.png', bbox_inches='tight', dpi=300)
plt.close()

# 绘制解释方差比
plt.figure(figsize=(8, 6))
plt.bar(range(1, len(explained_variance_ratio) + 1), explained_variance_ratio)
plt.xlabel('主成分')
plt.ylabel('解释方差比')
plt.title('各主成分解释方差比')
plt.savefig('images/explained_variance.png', bbox_inches='tight', dpi=300)
plt.close()

# 绘制累积解释方差比
plt.figure(figsize=(8, 6))
plt.plot(range(1, len(explained_variance_ratio) + 1), 
         np.cumsum(explained_variance_ratio), 
         marker='o')
plt.xlabel('主成分数量')
plt.ylabel('累积解释方差比')
plt.title('累积解释方差比曲线')
plt.grid(True)
plt.savefig('images/cumulative_variance.png', bbox_inches='tight', dpi=300)
plt.close()

# 绘制降维后的数据
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=X_pca[:, 0], cmap='viridis')
plt.colorbar()
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的数据分布 (PC1 vs PC2)')

plt.subplot(122)
sns.boxplot(data=pd.DataFrame(X_pca, columns=['PC1', 'PC2', 'PC3']))
plt.title('各主成分的分布情况')
plt.ylabel('值')

plt.tight_layout()
plt.savefig('images/pca_results.png', bbox_inches='tight', dpi=300)
plt.close()

运行结果

运行代码后,我们可以得到以下可视化结果:

  1. 原始三维数据分布:
    在这里插入图片描述

  2. 各主成分解释方差比:
    在这里插入图片描述

  3. 累积解释方差比曲线:
    在这里插入图片描述

  4. PCA降维结果:
    在这里插入图片描述

从结果可以看出:
5. 第一主成分解释了大部分的数据方差
6. 通过累积解释方差比曲线可以看出,使用前两个主成分就可以解释超过90%的数据方差
7. 降维后的数据分布显示了数据在新坐标系下的投影情况

总结

PCA是一种强大的降维工具,它可以:

  1. 有效减少数据维度,降低计算复杂度
  2. 去除数据中的冗余信息
  3. 保留数据中最重要的特征
  4. 帮助可视化高维数据

在实际应用中,PCA常用于:

  • 图像压缩
  • 特征提取
  • 数据预处理
  • 降噪
  • 数据可视化

需要注意的是,PCA是一种线性降维方法,对于非线性关系的数据,可能需要考虑其他非线性降维方法,如t-SNE或UMAP。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值