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

ops/2024/12/16 1:47:47/

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

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


1. PCA 的核心思想

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

2. PCA 的步骤

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

jz_{ij} = \frac{x_{ij} - \mu_j}{\sigma_j}

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

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

\mathbf{C} = \frac{1}{n-1} \mathbf{Z}^\top \mathbf{Z}

其中,\mathbf{Z} 是标准化后的数据矩阵。

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

\mathbf{Y} = \mathbf{Z} \mathbf{V}_k

其中,\mathbf{V}_k​ 是由前 k 个特征向量构成的矩阵。


3. 数学推导

最大化方差
  • 假设投影方向为单位向量 \mathbf{v},投影后的数据方差为:

\mathrm{Var}(\mathbf{v}) = \mathbf{v}^\top \mathbf{C} \mathbf{v}

  • 通过拉格朗日乘数法,约束 \|\mathbf{v}\|^2 = 1,得优化问题:

\max_{\mathbf{v}} \mathbf{v}^\top \mathbf{C} \mathbf{v}, \quad \text{subject to } \|\mathbf{v}\|^2 = 1

解得 \mathbf{v} 为协方差矩阵 \mathbf{C} 的特征向量,最大方差为对应的特征值。


4. 特点

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

5. PCA 的应用场景

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

6. 实现 PCA

手动实现 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]])# 步骤 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)

输出结果

降维后的数据:[[-0.82797019][ 1.77758033][-0.99219749][-0.27421042][-1.67580142][-0.9129491 ][ 0.09910944][ 1.14457216][ 0.43804614][ 1.22382056]]
使用 scikit-learn 实现
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)

输出结果

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

7. 主成分数选择

  1. 累计解释方差比
    • 累计解释方差比达到一定阈值(如 95%)时停止:

\text{explained variance ratio} = \frac{\lambda_i}{\sum_{j=1}^{d} \lambda_j}

  1. 碎石图(Scree Plot)
    • 观察特征值的变化,选择拐点作为主成分数。

8. PCA 的扩展

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

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


http://www.ppmy.cn/ops/142258.html

相关文章

【软件工程】一篇入门UML建模图(用例图、对象图、顺序图与协作图)

​ 🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1…

【前端】HTML

目录 一、HTML结构 1.1 HTML标签1.2 HTML文件基本结构1.3 快速生成框架 二、HTML常见标签 2.1 注释标签 !-- –2.2 标题标签 h1到h62.3 段落标签 p2.4 换行标签 br2.5 格式化标签2.6 图片标签 img2.7 超链接标签 a 三、表格标签 3.1 常用标签3.2 合并单元格 四、列表标签五、表…

玉米叶病预测数据集,使用yolo,coco,voc格式人工标注,准确率可达95.7%以上, 10884张图片,可识别叶枯病,普通锈病,灰叶斑病,健康的玉米叶

玉米叶病预测数据集,使用yolo,coco,voc格式人工标注,准确率可达95.7%以上, 10884张图片,可识别叶枯病,普通锈病,灰叶斑病,健康的玉米叶 普通锈病 灰叶斑病 健康的 叶枯病…

DAY5 C++运算符重载

1.类实现> 、<、!、||、&#xff01;和后自增、前自减、后自减运算符的重载 代码&#xff1a; #include <iostream>using namespace std; class Complex {int rel;int vir; public:Complex(){};Complex(int rel,int vir):rel(rel),vir(vir){cout << "…

杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,三)

上一节&#xff0c;我们分清了主次矛盾&#xff0c;并搞定了主要矛盾&#xff08;去掉黄色的字&#xff09;&#xff0c;这一节解决次要矛盾&#xff08;矩形色带&#xff09;。 我们的想法如图&#xff1a; 1&#xff0c;我们找到稳定黄色的最左边&#xff0c;最右边两点&…

ElementEye,网页分析器

介绍 我们经常使用Python写爬虫&#xff0c;爬到网页数据之后&#xff0c;就需要用beautifulSoup进行解析。因为写爬虫并不是我的主营工作&#xff0c;大多数只是用来分析一下想要的数据而已&#xff0c;所以经常会忘记beautifulSoup的用法。 同时&#xff0c;我们总是分析页面…

动手学深度学习-线性神经网络-softmax回归

目录 分类问题 网络架构 全连接层的参数开销 softmax运算 小批量样本的矢量化 损失函数 对数似然 softmax及其导数 交叉熵损失 信息论基础 熵 信息量 重新审视交叉熵 模型预测和评估 小结 在上上上一节中我们介绍了线性回归。 随后&#xff0c;然后在上上一节中…

java实现word转换pdf,word文件转换pdf文件,java如何将word转换pdf

1.java依赖 <dependency><groupId>com.aspose.cells</groupId><artifactId>aspose-cells</artifactId><version>8.5.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>…