第二次作业:PCA主成分分析(2021.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_x
newImg = Image.fromarray(uint8(recove_image))
newImg.show()

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

参考链接:

  1. 线性降维
  2. 图像主成分分析

PCA主成分分析法详解相关推荐

  1. python sklearn.decomposition.PCA 主成分分析, 原理详解

    引用文章1: 主成分分析(PCA)原理详解 https://blog.csdn.net/program_developer/article/details/80632779 引用文章2: 彻底理解样本 ...

  2. PCA(主成分分析)原理详解

    PCA概念 PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法.PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称 ...

  3. 主成分分析(PCA)原理详解 2016/12/17 · IT技术 · 主成分分析, 数学 分享到: 21 原文出处: 中科春哥 一、PCA简介 1. 相关背景 主成分分析(Principa

    主成分分析(PCA)原理详解 2016/12/17 · IT技术 · 主成分分析, 数学 分享到:21 原文出处: 中科春哥    一.PCA简介 1. 相关背景 主成分分析(Principal Co ...

  4. 数学建模——主成分分析算法详解Python代码

    数学建模--主成分分析算法详解Python代码 import matplotlib.pyplot as plt #加载matplotlib用于数据的可视化 from sklearn.decomposi ...

  5. 安卓miracast花屏_创维酷开电视多屏互动Miracast玩法详解

    创维酷开电视多屏互动Miracast玩法详解 安卓手机是可以通过多屏互动Miracast玩法直接让我们手机与创维酷开电视进行无线投屏的,但是有些创维电视的Miracast功能找不到怎么办? 创维酷开电 ...

  6. 视频教程-沐风老师3DMAX室内建模挤出法详解-3Dmax

    沐风老师3DMAX室内建模挤出法详解 沐风课堂创始人,专栏作家,独立媒体人,资深互联网从业者. 沐风老师 ¥12.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP ...

  7. 单链表的头尾插法详解

    单链表头尾插法详解 头插法构造单链表 代码实现 头插法过程 尾插法构造单链表 代码实现 尾插法过程 单链表头尾插法对比 #include "stdio.h" #include &q ...

  8. java指数表示法_Java指数计数法详解

    Java指数计数法详解 时间:2017-10-16     来源:华清远见Java培训中心 Java指数计数法并不是一个很难的运算,关键是你要理解应用,很多朋友不理解Java指数计数法,所以也无从运用 ...

  9. 创维linux怎么连接wifi,创维酷开电视多屏互动Miracast玩法详解

    创维酷开电视多屏互动Miracast玩法详解 安卓手机是可以通过多屏互动Miracast玩法直接让我们手机与创维酷开电视进行无线投屏的,但是有些创维电视的Miracast功能找不到怎么办? 创维酷开电 ...

最新文章

  1. 棋盘格检测--Automatic camera and range sensor calibration using a single shot
  2. 32GSSD组建RAID0后对硬盘的加速效果
  3. python读取配置文件 分段_Python3读写ini配置文件的示例
  4. 1000万粉丝女主播一年从未露脸,网友爆出嘴唇照,比腐团儿还好看
  5. 关于EOF,转自新浪微博
  6. 云计算---openstack基础构架以及服务方式详解
  7. java异常断点数组_使用IDEA异常断点来定位java.lang.ArrayStoreException的问题
  8. 搭建keepalived遇到的问题
  9. 在哪里学python-python在哪学
  10. 在Red Hat Enterprise Linux 5 64-bit安装oracle11g r2
  11. NTFS For Mac的兼容性问题
  12. QT designer将按钮改成圆形
  13. Beta-VAE论文阅读笔记
  14. Win11怎么进行屏幕休眠时间的设置
  15. iOS - UIButton连续点击事件控制
  16. 董卫凤:不服输的华丽转身(三)
  17. 树莓派2model B 通过蓝牙实现A2DP协议连接手机播放音乐
  18. swagger转换成word文档
  19. HotFix移动热修复详解
  20. uni-app 启动广告页

热门文章

  1. (转)手机网站前端开发经验总结
  2. Unity UGUI开发设计及案例讲解
  3. 检测某向量在另一向量的左边还是右边
  4. 一席长文让你看懂LED灯需要做哪些检测
  5. 计算机主板上实时时钟晶振频率为,电脑主板晶振的识别及测量方法介绍
  6. sklearn中的make_moons函数
  7. 谷歌学术搜索文章GB/T 7714索引,后面的数字是代表什么?
  8. 浅谈未来人类发展方向
  9. 构建混合型ARM Kubernetes集群
  10. 基于深度学习技术的电表大数据检测系统