降维算法之主成分分析 (Principal Component Analysis, PCA)

news2024/11/15 11:20:29

 注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

主成分分析(PCA)是一种统计方法,用于减少数据的维度,同时尽量保留原始数据中的方差。PCA在机器学习和数据可视化中有着坚实的地位,因为它可以有效地简化数据,同时保留其核心特征。

1 算法解读

什么是主成分分析(PCA)?

主成分分析是一种常用的降维方法。当我们处理的数据有很多特征(维度)时,为了更简单地理解数据,并减少计算复杂度,我们会希望减少数据的维度,但同时保留数据的主要特征。PCA就是帮助我们实现这一目标的工具。

PCA的目标是什么?

PCA的主要目标是找到原始数据中方差最大的方向(这些方向是互相正交的),并将数据投影到这些方向上,从而实现降维。方向上的方差越大,说明数据在这个方向上变化越大,携带的信息量也越丰富。我们看一个使用PCA将二维数据降至一维的例子,该例子的代码将在后续介绍。

Fig1

在上图中,我们展示了原始数据点在不同方向上的投影:

蓝色点:原始的二维数据点。

红色箭头:计算出的第一主成分方向。

绿色箭头:计算出的第二主成分方向

黑色虚线:原始数据点在第一主成分方向上的投影。

红色虚线:原始数据点在x轴(Feature 1轴)上的投影。

青色虚线:原始数据点在y轴(Feature 2轴)上的投影。

从图中可以观察到:

当数据点投影到x轴或y轴时,有很多点在投影后重叠,这导致了信息的丢失。相比之下,当数据点投影到第一主成分方向时,它们之间的距离得到了较好的保留,从而减少了信息的丢失。

这说明,与直接在某一坐标轴上进行投影相比,PCA通过寻找数据方差最大的方向进行投影,能更好地保留原始数据的结构,减少信息损失。PCA的目的就是计算得到红绿箭头这样的正交基,进行高维数据的投影降维。

2 步骤和细节

a. 中心化:

为了简化计算,并使得主成分在原点附近,我们首先要对数据进行中心化处理。这一步包括计算每个特征的均值,并用每个特征值减去对应特征的均值。

b. 计算协方差矩阵:

协方差矩阵是一个描述特征之间相关性的矩阵。协方差越大,说明两个特征越相关。计算协方差矩阵的方式是用中心化后的数据点的特征值乘以其转置,然后除以数据点的数量。

c. 求特征值和特征向量:

下一步是计算协方差矩阵的特征值和特征向量。这一步通常会使用数学工具如NumPy库来完成。特征向量表示了主成分的方向,而特征值则表示了数据在这个方向上的方差大小。为了找到方差最大的方向,我们会对特征值进行排序。

d. 选择主成分:

一旦我们得到了所有的特征值和特征向量,我们就可以选择前k个最大的特征值对应的特征向量作为主成分。这k个特征向量构成了一个投影矩阵,我们会用这个矩阵来将原始数据投影到新的k维空间。

e. 降维:

最后一步是实际的降维操作。我们使用前面得到的投影矩阵将中心化后的原始数据投影到新的k维空间。这样,原始数据就被表示为了新空间中的点,而这个新空间的维度要小于原始空间。

3 PCA与SVD的联系

相同之处:

PCA可以通过SVD来实现。具体而言,对于给定的数据矩阵X,我们可以计算其SVD分解,得到U\sum V^{T}。其中,矩阵V的列向量(右奇异向量)就对应于PCA中协方差矩阵的特征向量,而奇异值的平方则对应于特征值。 因此,我们可以通过SVD直接获得PCA的主成分,从而进行降维。

不同之处:

虽然PCA可以通过SVD实现,但本质上,它们是不同的数学技术。PCA是一种降维方法,关注数据的方差和协方差结构;而SVD是一种矩阵分解方法,可以应用于任意矩阵,不仅仅局限于协方差矩阵。

PCA需要先对数据进行中心化,而SVD不需要这一步骤。

PCA通常用于解释方差,找到数据的主要特征方向;SVD则更多地用于矩阵近似和解决线性方程组等问题。

简而言之,PCA和SVD在某些方面是相似的,特别是SVD可以用来计算PCA,但它们也有各自的特性和应用领域。

4 PCA示例

我们有一个包含五个四维数据点的数据集,可以表示为:


                                                 \left.X=\left[\begin{array}{cccc}1&2&3&4\\4&3&2&1\\2&3&4&5\\5&4&3&2\\3&4&5&6\end{array}\right.\right]

现在我们逐步进行计算:

步骤1: 中心化

1.1 计算每个特征的平均值

– 对于每一列 (特征) 计算平均值:

                                                  \mathrm{mean}_j=\frac15\sum_{i=1}^5X_{ij}

其中, mean_j是第 j 列的平均值,X_{ij}是矩阵 X 中第 i 行第 j 列的元素。

– 计算得到的每个特征的平均值为: [3.0,3.2,3.4,3.6]

1.2 中心化数据

– 用每个元素减去对应特征的均值:

                                             X_{\text{centered },ij}=X_{ij}-\text{ mean }_j

– 中心化后的数据为:


                                        \left.\left[\begin{array}{cccc}-2.0&-1.2&-0.4&0.4\\1.0&-0.2&-1.4&-2.6\\-1.0&-0.2&0.6&1.4\\2.0&0.8&-0.4&-1.6\\0.0&0.8&1.6&2.4\end{array}\right.\right]

步骤2: 计算协方差矩阵

– 使用中心化后的数据计算协方差矩阵: Cov_{jk}=\frac14\sum_{i=1}^5X_{centered,ij}X_{centered,ik}其中, Cov_{jk}是协方差矩阵的第 j 行第 k 列元素。

– 计算得到的协方差矩阵为:

                                           \left.\left[\begin{array}{cccc}2.5&1.0&-0.5&-2.0\\1.0&0.7&0.4&0.1\\-0.5&0.4&1.3&2.2\\-2.0&0.1&2.2&4.3\end{array}\right.\right]

步骤3: 求协方差矩阵的特征值和特征向量

1. 计算特征值和特征向量:

对协方差矩阵进行特征值分解,得到特征值和对应的特征向量:

                                               \mathrm{Cov}\left(X_{\text{centered }}\right)v=\lambda v

其中, λ 是特征值, v 是对应的特征向量。

2. 排序特征值并选择主成分:

将特征值进行降序排序,并选择前两个最大的特征值对应的特征向量作为主成分。

– 计算得到的特征值为:

                       \begin{bmatrix}6.49,&2.31,&8.86\times10^{-17},&-2.97\times10^{-16}\end{bmatrix}

– 对应的特征向量为:


              \begin{bmatrix}-0.45947273&-0.69920298&-0.48060841&0.26270811\\-0.03920365&-0.54631774&0.83662228&0.00794688\\0.38106544&-0.3934325&-0.23141933&-0.80401809\\0.80133452&-0.24054726&-0.12459454&0.5333631\end{bmatrix}

– 选择了最大的两个特征值对应的特征向量作为主成分,它们分别为:               

                                         \begin{bmatrix}-0.45947273&-0.69920298\\-0.03920365&-0.54631774\\0.38106544&-0.3934325\\0.80133452&-0.24054726\end{bmatrix}

步骤4: 降维

– 使用选定的主成分将中心化后的原始数据投影到新的二维空间。这可以通过矩阵乘法来实现:  

                                                  X_{\mathrm{PCA}}=X_{\mathrm{centered}}\cdot V

其中, V 是由选定的特征向量组成的矩阵。

降维后的数据为:

                                                \begin{bmatrix}1.13409747&2.11514135\\-3.06859337&0.58628893\\1.81782105&0.23564087\\-2.38486979&-1.29321155\\2.50154464&-1.64385961\end{bmatrix}

这些值是新二维空间中的坐标值,分别对应原始四维空间中的五个数据点在两个主成分方向 上的投影。

至此,我们完成了从四维降至二维的PCA的全部计算步骤。希望这个详细的例子能帮助你更好地理解PCA的原理和计算过程。

5 代码示例

为了直观地解释PCA的作用,我们将通过一个二维数据集的例子,演示如何使用PCA将其降至一维。

import  numpy as np
# 生成一个二维数据集
np.random.seed(0)
X = np.dot(np.random.rand(2, 2), np.random.randn(2, 50)).T
# 计算PCA
mean_X = np.mean(X, axis=0)
X_centered = X - mean_X
cov_matrix = np.cov(X_centered, rowvar=False)
eigvals, eigvecs = np.linalg.eigh(cov_matrix)
top_eigvec = eigvecs[:, np.argmax(eigvals)]
# 计算投影数据点
X_projected = np.dot(X_centered, top_eigvec.reshape(-1, 1))
# 计算第二主成分方向(由于在二维空间,第二主成分是第一主成分的正交方向)
second_eigvec = np.array([-top_eigvec[1], top_eigvec[0]])
下面,我们对上述PCA的结果进行绘图可视化,代码如下。
# 创建绘图对象
plt.figure(figsize=(10, 8))
# 绘制原始数据点
plt.scatter(X[:, 0], X[:, 1], alpha=0.5, color='blue', label='Original Data Points')
# 绘制主成分方向
plt.quiver(mean_X[0], mean_X[1], top_eigvec[0], top_eigvec[1],
           angles='xy', scale_units='xy', scale=1, color='red', width=0.005, label='Principal Component 1')
plt.quiver(mean_X[0], mean_X[1], second_eigvec[0], second_eigvec[1],
           angles='xy', scale_units='xy', scale=1, color='green', width=0.005, label='Principal Component 2')
# 绘制数据点在主成分方向上的投影
for i in range(X.shape[0]):
    plt.plot([X[i, 0], mean_X[0] + X_projected[i, 0] * top_eigvec[0]],
             [X[i, 1], mean_X[1] + X_projected[i, 0] * top_eigvec[1]], 'b--', alpha=1.0)
# 绘制数据点在x轴上的投影
for i in range(X.shape[0]):
    plt.plot([X[i, 0], X[i, 0]], [X[i, 1], 0], 'm--', alpha=0.2)
# 绘制数据点在y轴上的投影
for i in range(X.shape[0]):
    plt.plot([X[i, 0], 0], [X[i, 1], X[i, 1]], 'c--', alpha=0.2)
# 设置坐标轴标签和图例
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Projection of Data Points on Different Axes')
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.legend()
# 显示图像
plt.axis('equal')
plt.tight_layout()
plt.show()

6 算法评价

PCA(主成分分析)是一种常用的降维方法,它有一些显著的优点,但也存在一些局限性。下面是PCA算法的一些优缺点:

优点:

  • 方差保留:PCA试图保留数据集中的最大方差,这有助于保留数据的主要特征和结构。
  • 降噪:PCA可以将数据投影到主成分构成的低维空间,这有助于消除噪声和冗余特征。
  • 可视化:通过降低数据的维度,PCA可以帮助我们将高维数据可视化,从而更好地理解数据的结构和关系。
  • 计算效率:PCA的计算效率较高,特别是当使用SVD(奇异值分解)方法时,它可以高效地处理大规模数据集。

缺点:

  • 线性假设:PCA假定数据的主成分是线性的,这意味着它可能不适合处理具有非线性结构的数据。
  • 方差与重要性:PCA倾向于保留方差大的成分,但这并不总是与数据中的重要特征相对应。有时,方差小的成分可能包含了重要的信息。
  • 正交性假设:PCA假定不同主成分之间是正交的,这在某些情况下可能不符合实际情况。
  • 敏感性:PCA对数据的缩放和单位敏感,不同的缩放可能会导致不同的结果。因此,在应用PCA之前,通常需要对数据进行标准化。
  • 解释性:PCA产生的主成分可能难以解释,因为它们通常是原始特征的线性组合,而这些组合可能缺乏实际意义。

总之,虽然PCA是一种强大且广泛应用的降维方法,但在使用时也需要考虑其局限性,并根据具体应用的需求和数据的特性进行选择。

7 算法变体

Kernel PCA:使用核技巧处理非线性数据。当然,Kernel PCA (Kernel Principal Component Analysis) 是一个非常有用的降维技术,特别是当数据是非线性的。它通过将数据映射到一个高维特征空间,然后在该空间中应用传统的PCA,来处理非线性数据。核技巧(Kernel trick)可以让我们在原始空间中隐式地计算这种高维空间的特性,而无需真正执行映射。这个技巧我们将在SVM机器学习算法中进行展开介绍,

也可以参考文献:1. Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.

2. Schölkopf, B., & Smola, A. J. (2002). Learning with Kernels: Support Vector Machines, Regularization, Optimization, and Beyond. MIT Press.)

PCA是一种强大且直观的降维方法,尽管它基于线性假设,但在许多应用中仍然非常有效。PCA可以有效地简化数据结构,使得后续分析和可视化更为方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1516071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flask开发实战】项目介绍-防火墙规则查询系统

一、前言 硬件防火墙为常备主用网络安全设备,主要通过网络访问控制方式实现安全防护。 不同厂家防火墙的网络访问控制功能均采用同样的模式操作:防火墙配置若干条防火墙规则,当IP包到来,防火墙根据包的五元组属性(协…

线上会议大厅应该具备哪些功能,线上会议大厅搭建要注意什么

引言: 随着互联网和信息技术的不断发展,线上会议大厅逐渐成为各行各业进行会议和交流的重要工具。但是,真正的线上会议大厅必须具备一定的功能和特性,才能满足用户的需求,提升会议体验。 一.线上会议大厅应…

13.7 Map 接口(血干JAVA系列)

这里写目录标题 13.7.1 Map接口简介13.7.2 Map.Entry接口简介13.7.3 Map接口的常用子类1.新的子类:HashMap2.相关操作实例(1)实例操作1——向集合中增加和取出内容【例13.26】增加和取得内容 (2)实例操作2------------ 判断指定的key或value是否存在【例13.27】判断…

代码随想录day19(2)二叉树:二叉树的最大深度(leetcode104)

题目要求:求出二叉树的最大深度 思路:首先要区分二叉树的高度与深度。二叉树的高度是任一结点到叶子结点的距离,而二叉树的深度指的是任一节点到根节点的距离(从1开始)。所以求高度使用后序遍历(从下往上&…

金蝶云星空对接打通阿里宜搭逐个单据查询接口与新增表单实例接口

金蝶云星空对接打通阿里宜搭逐个单据查询接口与新增表单实例接口 数据源平台:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台。…

392.判断子序列

题目:给定字符串s和t,判断s是否为t 的子序列。 字符串的一个子序列是原始字符串删除一些字符而不改变剩余字符相对位置形成的新字符串。 解题思路:s是否是 t 的子序列,因此只要能找到任意一种 s 在 t 中出现的方式,即…

义乌购关键字搜索API接口技术详解与代码示例

义乌购关键字搜索API接口技术详解与代码示例 在电子商务蓬勃发展的今天,义乌购作为国内知名的批发市场平台,为广大商家和消费者提供了丰富的商品资源。为了方便开发者快速接入义乌购平台,实现商品信息的搜索与获取,义乌购开放了关…

ROS 语音交互(三) tts

目录 一、模型选择 二、流程 三、核心代码展示 一、模型选择 科大讯飞超拟人识别 二、流程 超拟⼈合成协议 | 讯飞开放平台文档中心 (xfyun.cn) 三、核心代码展示 # coding: utf-8 import _thread as thread import os import time import base64import base64 import …

react/vue项目刷新页面404的原因以及解决办法

项目 公司官网 背景 1、问题描述:react/vue项目,正常的页面操作跳转,不会出现404的问题,但是一旦刷新,就会出现404报错 2、产生原因:我们打开react/vue打包后生成的dist文件夹,可以看到只有一…

Windows系统下载安装Plex媒体服务结合内网穿透远程访问本地影音文件

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

web项目的搭建

使用Webstorm并创建Next.js文件 1、配置nodejs环境、安装webstorm【配置node.js可以使用nvm去管理nodejs的版本】 2、需要破解webstorm,可能会导致原本的idea失效,注册码过期 3、taobao的npm过期,导致npm is sass执行不成功,需…

python基础篇--学习记录2

1.深浅拷贝 l1 ["张大仙","徐凤年",["李淳刚","邓太阿"]] # 变量名对应的就是内存地址,这里就是将l1的内存地址给了l2 # 现在两个变量指向同一个内存地址,l1变化l2也会变化 l2 l1 现在的需求是l2是l1的拷贝版本,但是两者是完全分割…

基于FPGA的以太网传输图片通过HDMI显示(含源码)

在此之前,已经讲解过HDMI、UDP、DDR3等模块的使用,前文在使用HDMI显示图片时,由于没有讲解DDR3,使用FPGA内部的RAM存储图像数据,因为FPGA片上RAM的资源有限,导致最终显示放大的图片失真严重。 本文通过DDR3…

RabbitMQ 模拟实现【四】:虚拟主机设计

文章目录 虚拟主机设计虚拟主机分析交换机和虚拟主机之间的从属关系核心 API发布消息订阅消息应答消息消费者管理类 虚拟主机设计 虚拟主机分析 类似于 MySQL 的 database,把交换机,队列,绑定,消息…进⾏逻辑上的隔离&#xff0…

外包干了20天,技术退步明显......

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

v-model 粗略解析

v-model 粗略解析 v-model是什么? 双向数据绑定,可以从data流向页面,也可以从页面流向data通常用于表单收集,v-model 默认绑定 value 值书写形式: v-model:value"" 或 v-model v-model原理是什么&#xf…

HTML5+CSS3+JS小实例:全屏背景切换动画

实例:全屏背景切换动画 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-s…

【论文笔记合集】LSTNet之循环跳跃连接

本文作者&#xff1a; slience_me LSTNet 循环跳跃连接 文章仅作为个人笔记 论文链接 文章原文 LSTNet [25] introduces convolutional neural networks (CNNs) with recurrent-skip connections to capture the short-term and long-term temporal patterns. LSTNet [25]引入…

电脑闹钟软件,电脑上定时提醒的软件

我们生活在一个忙碌的时代&#xff0c;工作、学习、生活等各种事务时常让我们忙得不知所措。而在这样的情况下&#xff0c;一款电脑闹钟软件&#xff0c;电脑上定时提醒的软件就成为了我们不可或缺的工具之一。 电脑闹钟软件&#xff0c;电脑上定时提醒的软件&#xff0c;是一…

SpringBoot集成flyway

简介 Flyway 是一款开源的数据库版本管理工具&#xff0c;它更倾向于规约优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更&#xff0c;支持数据库版本自动升级&#xff0c;并且有一套默认的规约&#xff0c;不需要复杂的配置&#xff0c;Migrations 可以写成 …