【机器学习】机器学习的基本分类-无监督学习-主成分分析(PCA:Principal Component Analysis)

主成分分析(Principal Component Analysis, PCA)

主成分分析(PCA)是一种常用的降维技术,用于将高维数据投影到低维空间,同时尽可能保留原数据的主要信息(方差)。


1. PCA 的核心思想

  1. 目标:找到新的坐标轴(主成分),使得数据投影到这些轴上的方差最大化。
  2. 主成分:数据的主要变化方向。第一个主成分捕获最多的方差,第二个主成分与第一个正交,捕获剩余的最大方差,依此类推。
  3. 降维:选取前 k 个主成分,舍弃次要主成分,达到数据压缩的目的。

2. PCA 的步骤

步骤 1:标准化数据
  • 数据集的不同特征可能具有不同的量纲和尺度,标准化将每个特征的均值设为 0,标准差设为 1:

其中, 是特征 j 的均值, 是特征 j 的标准差。

步骤 2:计算协方差矩阵
  • 协方差矩阵表示各特征之间的线性关系:

其中, 是标准化后的数据矩阵。

步骤 3:计算特征值和特征向量
  • 解出协方差矩阵的特征值 和对应的特征向量 ,特征向量表示主成分的方向,特征值表示对应的方差大小。
步骤 4:选择主成分
  • 按特征值从大到小排序,选择前 k 个最大的特征值对应的特征向量。
步骤 5:投影数据到主成分空间
  • 将原数据投影到选择的主成分方向:

其中,​ 是由前 k 个特征向量构成的矩阵。


3. 数学推导

最大化方差
  • 假设投影方向为单位向量 ,投影后的数据方差为:
  • 通过拉格朗日乘数法,约束 ,得优化问题:

解得 为协方差矩阵 的特征向量,最大方差为对应的特征值。


4. 特点

优点
  1. 降维:减少数据维度,降低计算复杂度。
  2. 特征解耦:发现数据中的主要变化方向。
  3. 去噪:通过忽略小的主成分去除噪声。
缺点
  1. 线性假设:PCA 假设数据是线性可分的,不适用于非线性数据。
  2. 信息损失:降维可能会丢失重要信息。
  3. 解释性差:主成分是线性组合,可能难以直观解释其物理意义。

5. PCA 的应用场景

  1. 数据可视化
    • 将高维数据投影到二维或三维空间,便于可视化。
  2. 降维加速
    • 在机器学习任务中减少特征数量,提高模型训练速度。
  3. 去噪
    • 提取主要特征,过滤掉噪声。
  4. 图像压缩
    • 在图像处理中减少数据存储需求。

6. 实现 PCA

手动实现 PCA
python 复制代码
import numpy as np

# 数据
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7], [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])

# 步骤 1: 标准化数据
X_mean = np.mean(X, axis=0)
X_std = X - X_mean

# 步骤 2: 计算协方差矩阵
cov_matrix = np.cov(X_std.T)

# 步骤 3: 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

# 步骤 4: 选择主成分
idx = np.argsort(eigenvalues)[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]

# 步骤 5: 投影数据
k = 1  # 选择一个主成分
principal_components = eigenvectors[:, :k]
X_pca = X_std.dot(principal_components)

print("降维后的数据:\n", X_pca)

输出结果

Matlab 复制代码
降维后的数据:
 [[-0.82797019]
 [ 1.77758033]
 [-0.99219749]
 [-0.27421042]
 [-1.67580142]
 [-0.9129491 ]
 [ 0.09910944]
 [ 1.14457216]
 [ 0.43804614]
 [ 1.22382056]]
使用 scikit-learn 实现
python 复制代码
from sklearn.decomposition import PCA
import numpy as np

# 数据
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0], [2.3, 2.7], [2, 1.6], [1, 1.1], [1.5, 1.6], [1.1, 0.9]])

# PCA 降维
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)

print("降维后的数据:\n", X_pca)

输出结果

python 复制代码
降维后的数据:
 [[-0.82797019]
 [ 1.77758033]
 [-0.99219749]
 [-0.27421042]
 [-1.67580142]
 [-0.9129491 ]
 [ 0.09910944]
 [ 1.14457216]
 [ 0.43804614]
 [ 1.22382056]]

7. 主成分数选择

  1. 累计解释方差比
    • 累计解释方差比达到一定阈值(如 95%)时停止:
  1. 碎石图(Scree Plot)
    • 观察特征值的变化,选择拐点作为主成分数。

8. PCA 的扩展

  1. Kernel PCA:将数据映射到高维空间,处理非线性数据。
  2. Sparse PCA:增加稀疏性约束,选择更少的特征。
  3. Incremental PCA:适合大规模数据集,分批处理数据。

PCA 是降维领域的重要工具,尽管其本质是线性投影,但通过合理使用可以显著提升数据处理效率和模型性能。

相关推荐
大丈夫立于天地间19 分钟前
ISIS基础知识
网络·网络协议·学习·智能路由器·信息与通信
old_power26 分钟前
【PCL】Segmentation 模块—— 基于图割算法的点云分割(Min-Cut Based Segmentation)
c++·算法·计算机视觉·3d
通信.萌新34 分钟前
OpenCV边沿检测(Python版)
人工智能·python·opencv
ARM+FPGA+AI工业主板定制专家37 分钟前
基于RK3576/RK3588+FPGA+AI深度学习的轨道异物检测技术研究
人工智能·深度学习
赛丽曼39 分钟前
机器学习-分类算法评估标准
人工智能·机器学习·分类
Bran_Liu40 分钟前
【LeetCode 刷题】字符串-字符串匹配(KMP)
python·算法·leetcode
伟贤AI之路42 分钟前
从音频到 PDF:AI 全流程打造完美英文绘本教案
人工智能
涛ing42 分钟前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
weixin_3077791343 分钟前
分析一个深度学习项目并设计算法和用PyTorch实现的方法和步骤
人工智能·pytorch·python
helianying551 小时前
云原生架构下的AI智能编排:ScriptEcho赋能前端开发
前端·人工智能·云原生·架构