首页 > 编程语言 >PCA (principal component analysis)算法

PCA (principal component analysis)算法

时间:2023-11-25 22:35:51浏览次数:40  
标签:映射 Cov component 矩阵 analysis 协方差 PCA 数据 冗余

一、 PCA算法

PCA(principal component analysis)是一种应用广泛的降维算法,其基本思想是想通过找到一个低维的“最具有代表性”的方向,并将原数据映射到这个低维空间中去,从而实现数据的降维。

1. 算法原理

  我们先从二维数据简单说明,假设我们有n个二维数据组成的数据集\(D_{n\times 2}\)(如图),现在我们想要将其映射到一维空间,并且我们的目的是尽可能保留信息。那问题是如何寻找这个主方向?假设我们的原数据集为\(X_{n\times m}\)(n为数据维度,m为数据个数),那么上述问题就等价表述为:找到一个变换矩阵,将X从高维空间映射到低维空间中去,即:

\[Y_{k\times m} =A_{k\times n} X_{n\times m} \qquad \qquad (1) \]

image
图1. 二维PCA降维示意图(由于技术限制,本图映射并没有遵循投影规则)

  我们首先先确定我们的优化目标,即什么情况下的映射能尽可能保留我们数据的信息,又或者说映射成的数据\(Y\)要满足什么条件?

1. redundancy (冗余)

  假设在一个二维数据中,是否所有维度都应该保留?在图2中,我们对于几组不同的数据,很明显能看出,左侧图中\(r_{1},r_{2}\)两个维度相关性较弱,我们无法通过一个数据预测另一个数据值,所以这组数据具有低冗余性。对于右侧一组数据,很明显,\(r_{1},r_{2}\)具有十分强的相关关系,因此我们完全可以通过回归方程由一个数据值来预测另一个数据值,即该数据是只需要一个维度即可表示,故该数据是高度冗余的。

  为此PCA的思想就是去除那些冗余的维度,让映射到的低维空间中,每个方向都具有低的相关性,从而使映射后的数据\(Y\)冗余程度大大减小,从而实现降维的目的。

image
图2. 来自两个单独的测量 ,\(r_{1}\),\(r_{2}\) 的数据中可能存在冗余的情况。左图中的两个测量是不相关的,因为你不能从一个预测另一个。相反,右图中的两个测量高度相关,这意味着数据高度冗余。

2. 协方差矩阵

  由概率论的知识我们知道,协方差可以用来描述两个变量之间的相关性。
协方差的定义为:

\[Cov(x,y) = \frac{\sum\limits_{i=1}^{n}(x_{i}-\bar{x})(y_{i}-\bar{y})}{n-1} \]

协方差越大,两个变量的相关性越强;协方差等于0,两个变量没有相关性。

  对于一个零均值化后数据矩阵\(X_{n\times m}\)(m为数据个数,n为数据维度),其协方差矩阵的定义为:

\[Cov(X) = \frac{1}{n-1}XX^{T} = \frac{1}{n-1} \left( \begin{matrix} Cov(x_{1},x_{1})\quad Cov(x_{1},x_{2}) \quad \cdots \\ Cov(x_{2},x_{1}) \quad Cov(x_{2},x_{2}) \quad \cdots \\ \cdots \\ Cov(x_{n},x_{1})\quad Cov(x_{n},x_{2}) \quad \cdots \end{matrix} \right) \]

其中协方差矩阵对角线上的元素是每个变量自身的方差,其他元素是两个变量之间的协方差。协方差矩阵反应了数据的噪声与信号,其中对角代表着信号值,其余代表着噪声。我们不仅希望噪声越小,还希望信号越大,即我们希望保留数据方差最大所代表的方向。
   对于式(1),我们可以求得:\(Cov(X) = \frac{1}{m-1} XX^{T}\),我们希望新数据集\(Y\)的数据维度之间没有冗余,即我们希望他们之间的协方差为0,因此\(Y\)的协方差矩阵是一个对角矩阵。

3. 算法推导

由上述已知Y的协方差矩阵为一个对角矩阵,即为\(\Lambda\),由(1)及题意有:

\[Cov(Y) = \frac{1}{n-1 }AX(AX)^{T} = \frac{1}{n-1}AXX^{T}A = \Lambda \]

即:

\[ACov(X)A = \Lambda \]

由线性代数的知识我们知道,上式是一个对称矩阵的合同变换,其中对角阵\(\Lambda\)是其特征值组成的矩阵,\(A\)是其特征值对应特征向量所组成的矩阵。

  综上我们得知,如果要将X映射到Y中,只需要选取最大特征值所对应的特征向量构成变换矩阵A,则可获得映射后的数据集Y。

4. 算法步骤

  1. 将数据集X零均值化
  2. 计算X的协方差矩阵,并进行特征值分解
  3. 选取k个最大的特征值所对应的特征向量,组成变换矩阵A
  4. 得到降维后的新数据Y=AX

2. 代码补充

补充的代码如下:

######### 需要你完成: #########  
# 1. 计算数据的均值向量mu  
mu = np.mean(X,axis=0)  
X = X - mu  
  
# 2. 计算数据的协方差矩阵S  
S = np.cov(X.T)  
  
# 3. 对S进行特征值分解,求得其特征值L以及对应的特征向量U  
L,U = np.linalg.eig(S)  
L = np.real(L)  
  
# 4. 选取L中前k个最大的特征值所对应的特征向量构成降维矩阵W  
idx = np.argsort(L)[::-1]  
W = U[:, idx[:k]]  
###############################

3. 实验效果

原始图片(图3)及降维后图片(图4)如下:

image
图3. 原始图像展示
image
图4. 保留不同数量的主成分后的降维图片

4. 参考文献

[1] J.Shlens "A Tutorial on Principal Component Analysis" arXiv preprint, arXiv:1404.1100v1

标签:映射,Cov,component,矩阵,analysis,协方差,PCA,数据,冗余
From: https://www.cnblogs.com/C-qian/p/17856239.html

相关文章

  • python3使用libpcap给ESL命令添加日志记录
    操作系统:CentOS7.6_x64FreeSWITCH版本:1.10.9python版本:3.9.12libpcap版本:1.11.0b7 FreeSWITCH的ESL模块用起来很方便,可以控制FreeSWITCH实现具体业务需求,但该模块没有提供ESL命令执行日志,不便于排查问题,本文展示一种使用python3基于libpcap实现ESL命令执行日志的方法,并......
  • Probabilistic principal component analysis-based anomaly detection for structure
    SHMcanprovidealargeamountofdatathatcanrevealthevariationinthestructurecondition什么是压缩传感,数据重构,研究背景与意义,怎么用基于模型的方法不可避免的缺点是模型的不确定性,因为很难创建能够模拟真实物理情况的可靠的结构模型。为了克服基于模型的方法的缺......
  • C/C++ 运用Npcap发送UDP数据包
    Npcap是一个功能强大的开源网络抓包库,它是WinPcap的一个分支,并提供了一些增强和改进。特别适用于在Windows环境下进行网络流量捕获和分析。除了支持通常的网络抓包功能外,Npcap还提供了对数据包的拼合与构造,使其成为实现UDP数据包发包的理想选择。本章将通过Npcap库构造一......
  • Visual Components软件典型功能描述 衡祖仿真
    1、即点即用,即插即用vc提供大量的组件模块,组件都已经赋子行为和渲染,看起来复杂的模拟场景,可以通过简单拖拉组合,即可成为一条运动的仿真。节省更多的时间,让布局更灵动。2、PLC功能过去,PLC程序的调试都是必须等到所有的设备都到场安装好了之后再联机调试。通过此软件,PLC设备通过软件......
  • Visual Components软件典型功能描述 衡祖仿真
    1、即点即用,即插即用vc提供大量的组件模块,组件都已经赋子行为和渲染,看起来复杂的模拟场景,可以通过简单拖拉组合,即可成为一条运动的仿真。节省更多的时间,让布局更灵动。2、PLC功能过去,PLC程序的调试都是必须等到所有的设备都到场安装好了之后再联机调试。通过此软件,PLC设备通过......
  • Tomcat报错Pailed to start component [StandardEngine[CatalinalStandardHost[localh
    话不多说直接上图就完了就下边这个错困扰了我一两个小时,到现在说实话我也没找到到底是什么原因,就是之前的一个版本war包还可以在tomcat上边运行但是最近更新的war包就不行就会报一个这个错,我看到网上有人说是tomcat的问题,我看其他war包都能正常使用我就没想到会是这个问题但最终的......
  • 【问题记录】【IDEA工具】升级了个版本- -启动报错 com.intellij.ide.util.Properties
    1 启动报错Causedby:java.lang.ClassNotFoundException:com.intellij.ide.util.PropertiesComponentImplPluginClassLoader(plugin=PluginDescriptor(name=BetterIntelliJ,id=org.example.BetterIntelliJ,descriptorPath=plugin.xml,path=~/Library/ApplicationSuppor......
  • ElasticSearch之cat component templates API
    命令样例如下:curl-XGET"https://localhost:9200/_cat/component_templates?v=true&pretty"--cacert$ES_HOME/config/certs/http_ca.crt-u"elastic:ohCxPH=QBE+s5=*lo7F9"执行结果输出如下:nameversionalias_countm......
  • Android深入学习之ComponentActivity.registerForActivityResult()方法
    ComponentActivity.startActivityForResult()和ComponentActivity.onActivityResult()已经废弃,如下图所示,取而代之的是统一它俩的ActivityResultLauncher。  ActivityResultLauncher对象可以通过ComponentActivity.registerForActivityResult()方法获取。该方法有两个重载。......
  • NS-3源码学习(三)Pcap文件分析
    NS-3源码学习(三)Pcap文件分析Pcap文件生成NS-3生成.pcap文件相关函数有EnablePcap()和EnalePcapAll(),支持第一个函数的类有ns3::YansWifiPhyHelperPointToPointEmuHelperCsmaHelper支持第二个函数的类有ns3::YansWifiPhyHelperPointToPointInternetStackHelper......