【机器学习】机器学习的基本分类-无监督学习-主成分分析(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 是降维领域的重要工具,尽管其本质是线性投影,但通过合理使用可以显著提升数据处理效率和模型性能。

相关推荐
whaosoft-1431 分钟前
51c深度学习~合集9
人工智能
L_cl7 分钟前
【NLP 11、Adam优化器】
人工智能·深度学习·自然语言处理
LJ_Kindi8 分钟前
高科技行业搭建帮助中心:从半导体到无人机
人工智能·科技·chatgpt·无人机
博士僧小星11 分钟前
人工智能|自然语言处理——机器翻译评价指标Bleu和Rouge
人工智能·自然语言处理·bleu·rouge·机器翻译
shiming887911 分钟前
python基于基于自然语言处理技术的话题文本分类
人工智能·python·自然语言处理·django
C++oj13 分钟前
普及组集训--图论最短路径设分层图
数据结构·算法·图论·最短路径算法
In 202917 分钟前
图论【Lecode_HOT100】
算法·图论
荒古前29 分钟前
小发现,如何高级的顺序输出,逆序输出整数的每一位(栈,队列)
数据结构·c++·算法
Y编程小白36 分钟前
Leetcode经典题7--跳跃游戏
算法·leetcode·游戏