svd pca matlab,从SVD到PCA——奇妙的数学游戏

方阵的特征值

当一个矩阵与一个向量相乘,究竟发生了什么?

cb1b68f2747d79388d466ff3cfcbc675.png

定义如下的 A 与 x:

e14b7a97e744cd62506509b1552ea5fa.png

a28d967b41fce9a452f6d1d6034312e8.png

求得 b:

9d73f549cbb15d8f9d1d7038ba7cf0d6.png

可以看到 A 乘以 x 就是将 x 的元素以线性的方式重新组合得到 b,数学上把这种重新组合叫 线性变换。

假设二维向量 x 满足如下条件:

ef90b5c609536e98b0574bbcf49f128b.png

给定一个 2×2 的方阵:

d306468930b64d2d7bd6b7d371b5a026.png

当 x 在满足约束条件的前提下取不同的值,Ax 的值的变化规律如下:

b24520e315c7defc85a05f973aa40466.gif

图中红色箭头为向量 x,蓝色箭头为矩阵 A 对 x 进行线性变换后的向量。

可以看到 A 对 x 做了两件事 : 旋转 与 伸缩。

在某些方向上,红色与蓝色向量共线,即在这些方向上 A 只对 x 进行了伸缩,称这些方向为 A 的主方向。在某个主方向上,设 A 对 x 伸缩的倍率为 λ,则:

a0238ead03d80acef1a2dd758f5fbe57.png

把 λ 叫做方阵 A 的一个特征值,x 是相应的特征向量。

随着 x 的方向从 0 变化到 2π,红蓝向量有 4 次共线出现,但真正线性无关的共线只有2个,因为各有两次共线仅是方向相反,所以 A 有 2 个特征值。

蓝色向量划出了一个椭圆轨迹,这个椭圆表示了 A 是如何对 x 做线性变换的,可以认为这个椭圆包含了 A 的全部信息(因为 x 可以任意取值)。从动图可以看出,这个椭圆以 A 的特征值 λ1 和 λ2 为长轴和短轴的长度,特征向量 x1 和 x2 为长短轴的方向,即 λ1 、λ2、x1、x2 包括了 A 的所有信息。

由于这是一个狭长的椭圆,长轴包含的信息更多,所以 λ1  与  x1 包含了 A 的大部分信息。

矩阵的奇异值分解

当矩阵不是方阵,无法为其定义特征值与特征向量,可以用一个相似的概念来代替:奇异值。

通常用一种叫奇异值分解的算法来求取任意矩阵的奇异值:

a73cf5c22c75fce989f49beb370ac705.png

抽象的概念要用具体的方式理解,来看几张图:

cd9c473572dc7327f62526312b341b1e.png

上图中的红色区域是一个以原点为中心的单位圆。圆当中的任意一点可以用向量 x 标示,且 x 满足:

a7dfc3ba3c033104e54d68a9fbc266e4.png

给定一个 2×2 的方阵:

d306468930b64d2d7bd6b7d371b5a026.png

利用 MATLAB 对 A 做奇异值分解:

649c030bf614b11fc9ddedc7a9ce0aa9.png

即:

cdb0031c1ba33ce15d35857467afaaf4.png

所以:

67b495f6cf796a89fc040e3cd6d66769.png

先看 V' 对 x 做了什么:

13d72b1de5a790ea70e096ba0c68da6a.png

V' 使 x 旋转了一个角度。

再看 SV' 对 x 做了什么:

38557ff760b4891efc602a8a1122a991.png

S 在 V'x 的基础上,在两个主方向进行了伸缩变换。

最后看 USV' 对 x 做了什么:

5e778bbd3714bd2a024532b8f0fd2f03.png

U 在 SV'x 的基础上,进行了旋转变换。

至此,奇异值分解的几何意义可谓一目了然:

A 是一个线性变换,把 A 分解成 USV',S 给出了变换后椭圆长短轴的长度, U 和 V' 一起确定了变换后的方向,所以 U、S、V' 包含了这个线性变换的全部信息。S 矩阵的对角线元素称为 A 的奇异值,与特征值一样,大的奇异值对应长轴,小的奇异值对应短轴,大的奇异值包含更多信息。

当矩阵是对称方阵时,其特征值与奇异值相等。

网上有一个很经典的案例来说明 SVD 的应用:

有一张 25×15 的图片:

59e3f1343637e173e91a9167cc52090c.png

把它用矩阵表示:

cb0ebad892af34257be47f6d7b44caf4.png

这个矩阵的秩等于 3。即矩阵只有 3 种线性无关的列,其他的列都是冗余的:

02ff4af1fe807cecc3ced234c895a47d.png

对 M 做奇异值分解,得到 3 个不为零的奇异值:

41c0e44419dcb2f056b64ce3f0fbd878.png

它们分别对应着 3 个线性无关的列。

另一种更一般的情况,处理一张有噪声的图片:

e38ebc36a676120ccd9e5bfe93854e91.png

它的奇异值为:

13d94a7cc77ab57fd824754a4d87cb51.png

可以想象在15维空间中有一个超椭球体,它有15个轴,其中有3个轴是主要的轴(对应着3个最大的奇异值),有这3个轴就可以大致勾勒出超椭球体的形状,因为它们包含了大部分信息。

如果 S 中的对角线元素从大到小排列,我们就只保留 S 左上角的 3×3 的子矩阵,并相应保留 U 和 V 的前 3 列,简化后的 U、S、V 依然保留了 M 的大部分信息:

69293dbcad6d1e926befc84527228f64.png

主成分分析

‍案例1‍

假如有 m 条1维数据,由于混入了噪音,变成了2维。

22e5425ac69437bb084bfb505a3e676e.png

在坐标系中把他们绘制出来:

d2f04b221c6db84ffb2b66fcac7bc796.png

主成分分析(PCA)可以用来排除这些噪音,把原来的维度提取出来。

首先将数据归一化,并将其所包含的信息用 协方差矩阵(协方差矩阵表示不同维度之间的相关关系,这是一个对称矩阵)来表示:

c0d5523f580000fe5d8d8137fa275975.png

Σ 有2个奇异值,例如:

1b83f59095c414d15bb8bd755cd3c9be.png

显然前者包含了大部分信息,对应的矩阵 U 的第一列就是主成分的方向:

e0808a3db3de82d03df588888d689260.png

于是就通过降维对数据实现了去噪。

在更一般的情况下,假设有 m 条 n 维的数据,对协方差矩阵进行奇异值分解得到 n 个从大到小排列的奇异值:

da299f5dc8891d5255a553e8ea946e92.png

如果希望信息利用率在99%以上,可利用如下不等式来确定主成分的维度 p:

67669f837640d1ccec4b69e911c96c67.png

案例2

有 m 张人脸图,每张的大小都是 32×32 (1024 个像素)。

2fb43b4abd48edcf9372133c362cf9ed.png

每个像素的颜色由一个灰度值来表示,这样每张图片就用一个 1024×1 的向量来表示。

定义第 i 张图片的数据为:

a826592f976329ae7dd2f0d67939ab84.png

将数据归一化并计算其协方差矩阵 Σ ,Σ 是一个 1024×1024 的矩阵。

对 Σ 做奇异值分解,得到矩阵 U,S 和 V。其中 U 也是一个 1024×1024 的矩阵。根据之前的比喻,U 的每一列代表了 1024 维空间中一个超椭球体的主轴方向。其中若干个方向包含了 Σ 的大部分信息,我们把这些方向(对应 U 中的若干列)叫做数据的主成分。

假设取 U 的前 k(k<1024) 列作为主方向,在 1024 维空间中有一个数据点 x,记 x 在这 k 个主方向上的投影为 x(project),那么 x(project) 是对 x 的一个近似(更精确地讲,将 k 维的 x(project) 重新投影到 1024 维空间中得到 x(approx) 才是对 x 的近似,这个技术叫数据恢复(Data Reconstruction))。需要注意的一点是:x(project)  与 x(approx) 是等价的,它们是同一个数据点在不同坐标系下的不同表达(升维不丢失信息)。当k=1024, x(approx)=x。

在应用中,用降维后的 x(project) 参与后续计算,由于数据量变小,计算速度将加快。

回到案例中,我取 k = 100,即取 U 的前 100 列作为数据的主方向(主成分)。因为每一列都是 1024 维向量,可以把它们像图片一样打印出来:

900ddb3004ef956cbf1d46916d80707e.png

越靠前的列对应着越大的奇异值,它们也包含了更多信息。在本例中,每个主方向(主成分)就是一张“基础图片”,每张原图都是这些基础图片的线性组合(系数就是原图在主方向上的投影)。

现在用这 100 张“基础图片”去简化原图片(将降维后的100维数据重新投影到1024维空间——Data Reconstruction),效果如下:

eee14438a3e449a232452d7bc0a00b79.png

最后附上一首打油诗来帮助记忆PCA的原理:

主成分即主方向

数据投影在其上

投影形成新数据

降维加速本领强

总结

本文的灵感来自于 Andrew Ng 在 Coursera 上的 《Machine Learning》课程,在上一篇文章中我提到过,这是一门面向应用的,强调快速入门的课程。我始终认为,知其然也要知其所以然,也就是背后的数学原理,这是一名合格工程师应有的素质。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值