1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > PCA主成分分析法详解

PCA主成分分析法详解

时间:2021-08-20 03:50:06

相关推荐

PCA主成分分析法详解

第二次作业:PCA主成分分析(.03.18)

主成分分析(Principal Component Analysis,PCA)是一种常见的线性降维方法,广泛应用于图像处理、人脸识别、数据压缩、信号去噪等领域。

算法思想与原理:

设原数据大小为 N × M,经过PCA降维后的数据大小为 N × K,其中 K < M。

PCA的中心思想是:将高维数据投影到具有最大方差的低维空间中

从概念上看可能有点模糊,下面从一个例子上来理解。

从例子理解PCA:

为了方便理解,下面以一个具体实例来说明PCA的这种思想。

假设某地的房子面积和总价在理想情况下符合如下正比关系:

这些数据在二维平面中可以表示为:

然而在实际中并非如此,由于各种原因总会产生一些波动,有可能会是如下表所示的关系。

同样的,这些数据在二维平面中可以表示为:

若把第二个表中的数据当作一个矩阵来看,就变成:

从第一个表中的数据来看,在理想情况下,房子面积和总价符合正比关系,也就是说房子面积和总价具有很大的相关性,若把它当成一个 2 × 5 的矩阵的话,它的秩为1,这说明用表1中的10个数据来描述房子面积和总价的这种关系显得有些冗余,我们只需要一行数据(5个)就可以描述清楚这种关系。在实际情况中,第二个表的两行数据虽然不满足完全的正比关系,但是它们也非常接近正比关系,因此,他们之间的相关性也是非常大的。为了将 X 中的数据用一行数(也就是从二维降到一维)来表示,由前面相关性分析可知,要对其进行“去相关性”操作,也就是要使两行数据通过一个变换,使其相关性变小。

数学里通常用方差协方差来描述数据的相关性,方差定义如下:

其中E(X)是向量 x 期望。方差是描述一个向量(维度)内数据的分散程度(相关性)的度量,矩阵形式用协方差来描述数据之间的相关性:

数量高于2个的 N 维数据通常用协方差矩阵来表示:

假设数据已经经过中心化处理,数据矩阵 X 的协方差矩阵就可以写成:

其中,X1 和 X2 分别为 X 的第一行和第二行。

在这个例子中,协方差如下图所示:

如上图所示,将各个数据点分别对横轴和纵轴做投影,横轴上交点的分散程度(方差)对应了 C 中的cov(x,x),而纵轴上的交点的分散程度就对应了 C 中的cov(y,y)cov(y,x)则表示 x 和 y 之间的相关程度。

那么由PCA的中心思想:将高维数据投影到具有最大方差的低维空间中,可以知道只要将数据投影到方差最大的低维(K维)空间中就行。如下图所示,数据不仅可以投影到横轴和纵轴,还可以360°旋转,投影到任何直线(1维空间)上,对于图中的 pc1 方向和 pc2 方向,可以直观的看出投影到 pc1 方向要好一点,因为投影之后的数据点更分散

数据投影到一个维度越分散在一定程度上就说明两类数据的相关性越小,故只需要将 CX 中的两个协方差cov(X1,X2)cov(X2,X1)变成0就可以了,这就意味着将 CX 变成对角矩阵就行。

由于 CX 是一个对称矩阵,通过特征值分解:

CX 是 M 阶对称矩阵,则必有正交矩阵 P 使得:

P-1CXP = PTCXP = Λ

其中 Λ 是以 CX 的 M 个特征值为对角元

因此我们只要找到这个正交矩阵 P 和它对应的特征值,然后取前 K 个最大的特征值及其对应的特征向量就可以,这实际上就是进行特征值分解:

也可以通过奇异值分解来解决问题:

经过奇异值分解后得到的 Σ 中最大的 K 个奇异值及其对应的 U 中的 K 个列向量组成的矩阵就是变换矩阵。如果用右奇异矩阵 U 的话就是对 X 的列进行降维了。

K 个特征值与 K 个特征向量构成了一个 K 维空间,而特征值正是衡量每一维空间所占的分量的,特征值越大,说明这一维度所包含的信息量越大,权重就越大。前 K 个最大特征值组成的空间当然是权重最大的,从而矩阵 X 投影到这 K 维空间中足够分散,也就是说方差足够大。

上面的这种解释可能也不是特别理解,所以又找到了下面这种理解。

PCA 另外一种理解是:

PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的。

这其实就是找新的正交基的过程,计算原始数据在这些正交基上投影的方差,方差越大,就说明在对应正交基上包含了更多的信息量。

而原始数据协方差矩阵的特征值越大,对应的方差越大,在对应的特征向量上投影的信息量就越大。反之,如果特征值较小,则说明数据在这些特征向量上投影的信息量很小,可以将小特征值对应方向的数据删除,从而达到了降维的目的。

PCA实例求解:

用上述例题,即某地房子面积与总价的问题作为例子来总结PCA算法步骤。

步骤1:数据去中心化: 步骤2:计算协方差矩阵: 步骤3:对协方差矩阵进行奇异值分解: 步骤4:取最大的 K 个特征值与特征向量构成一个变换矩阵 PK (取 K = 1) 步骤5:将原始数据投影到 K 维空间:

最后结果的投影线如图所示:

PCA的应用:

PCA在特征工程、计算机视觉、人脸识别、去噪等领域有很广泛的应用。参考的文章是使用matlab测试 PCA 在图像压缩上的效果,在此我们使用python进行图像降维。

实验步骤:

(1)分别求每个维度的平均值,然后对于所有的样例,都减去对应维度的均值,得到去中心化的数据;

(2)求协方差矩阵C:用去中心化的数据矩阵乘上它的转置,然后除以(N-1)即可,N为样本数量;

(3)求协方差的特征值和特征向量;

(4)将特征值按照从大到小排序,选择前k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵;

(5)将样本点从原来维度投影到选取的k个特征向量,得到低维数据;

(6)通过逆变换,重构低维数据,进行复原。

我们将使用下图作为操作对象:

代码如下:

from cv2 import *from numpy import *from PIL import Imageimg = Image.open("xxx/Desktop/01.jpeg")#图像转矩阵data = img.convert("L")data = mat(data)#np.mat和np.array的区别在于,*可以直接表示矩阵乘法,等价于np.dot()#去中心化mean_x = mean(data,axis=1)#按行计算均值data = data.astype("float64")#就是说float64和unit8不能直接相减,所以要转换下data -= mean_x#协方差矩阵计算cov_mat = 1.0/(data.shape[0]-1) * data * data.T#求协方差矩阵的特征值特征向量evalue, evector = linalg.eig(cov_mat)#寻找主要特征值对应的特征向量,因为协方差矩阵和对角矩阵特征值相同,所以对应的特征向量的位置一样,所以可通过对角阵的主要特征值找出特征向量evalue_index = argsort(evalue)[::-1]#argsor是按从小到大的顺序排列,所以取反k = input("你想要的保留的维度:")evalue_index = evalue_index[:int(k)]principal_evector = evector[:,evalue_index]#信息损失率#获取原始数据在改组基上的坐标loc = principal_evector.T.dot(data)#获取原始数据在本组基下的表现形式recover_mat = principal_evector.dot(loc)#将矩阵数据转成图像recove_image = recover_mat + mean_xnewImg = Image.fromarray(uint8(recove_image))newImg.show()

输入你想要保留的维度,该图像可降到任何维度。

下图为维度为64时的图像:

参考链接:

线性降维图像主成分分析

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。