文章目录

  • 写在前面
  • 可以开始串山楂了
    • 第一个山楂:矩阵变换对应旋转例子
    • 第二个山楂:矩阵变换对应缩放的例子
    • 第三个山楂:只有方阵才有的特征分解 Eigen Decomposition
    • 第四个山楂:从方阵的特征分解“领域展开”到普通矩阵的奇异值分解 Singular Value Decomposition
    • 不算山楂插个橘子瓣吧:有关 SVD 需要注意的细节
    • 最后一个大大大山楂:不能绕过的 PCA
  • 咳咳,就先串到这里了

写在前面

(1)如果我们有 m 条数据,每条数据有 n 个特征,我们会把整份数据描述为一个 m × n 的矩阵,m 行 n 列。

(2)提到向量,除非特意点名,否则默认就是列向量,比如这样写 x=(2,1,3)Tx = (2, 1, 3)^Tx=(2,1,3)T(转置转置转置啊)。

ps:不同书籍论文等,可能会有不同的标准,但是我个人一直都是以上面这个写法来理解的。很多机器/深度学习的公开数据集、内置算法等,也都是这样约定的。所以,当我看见“行对应特征”、“列对应样本数”以及“默认行向量”的讲解,我就脑瓜子嗡嗡的……(大佬们为什么要互相伤害,有个统一的基础不好吗?)当看到不同的资料写法有出入的时候,可以检查一下是不是约定基础不同造成的。

可以开始串山楂了

因为我只想写一些理解,用词可能不太规范。

首先要有一个认识,就是矩阵乘法其实就是在做线性变换,变换就是一种映射/map/函数/投影,只不过一定会符合两条约束:加性和齐性。

加性就是:先求和再变换 = 先变换再求和;
齐性就是:先缩放再变换 = 先变换再缩放;

当一个矩阵确定了,特定的变换也就确定了。矩阵乘法有左乘和右乘的区别,我们先以 y=Axy = A xy=Ax 为例来讲(再附一遍 xxx 和 yyy 都是列向量),矩阵 A 就是那个变换。

向量 xxx 可以看做是一个空间中的坐标点,矩阵 A 这个线性变换对向量 xxx 做了什么呢?

答案是:旋转和缩放。

第一个山楂:矩阵变换对应旋转例子

以最常见的二维直角坐标系来举例,如果其中有个点 A(1,0)A(1, 0)A(1,0),把这个点绕着原点逆时针绕 60° 会落在 B,B 的具体坐标是?(8 好意思,画图太麻烦我又强迫症不想拍照贴图,/(ㄒoㄒ)/~~)

设 θ=π/3\theta = \pi / 3θ=π/3 ,中学就掌握这个计算了:
xB=cos(θ)xA−sin(θ)yA=1/2x_B = cos(\theta) x_A - sin(\theta)y_A = 1/2xB​=cos(θ)xA​−sin(θ)yA​=1/2
yB=sin(θ)xA+cos(θ)yA=3/2y_B = sin(\theta) x_A + cos(\theta)y_A = \sqrt3/2yB​=sin(θ)xA​+cos(θ)yA​=3​/2

写成矩阵乘法形式就是:
[xByB]=[cos(θ)−sin(θ)sin(θ)cos(θ)][xAyA]\left [ \begin{matrix} x_B \\ y_B \end{matrix} \right ] = \left [ \begin{matrix} cos(\theta ) & -sin(\theta)\\ sin(\theta ) & cos(\theta) \end{matrix} \right ] \left [ \begin{matrix} x_A\\ y_A \end{matrix} \right ] [xB​yB​​]=[cos(θ)sin(θ)​−sin(θ)cos(θ)​][xA​yA​​]
所以先说结论:
(1)矩阵乘法可以做旋转;
(2)在一个坐标系中,对一个向量/点左乘一个矩阵,得到的结果就是变换后的向量/点在这个坐标系中的坐标。

那左乘的这个矩阵有什么特点?
(1)每列向量的模都是 1,也就是每一列都是单位向量,且互相正交,所以其实这个矩阵就是一套基底坐标系。
(2)再进一步来说,这就是某个方阵特征分解得到的特征向量组成的矩阵呀。那就能得到:某个方阵特征分解之后,得到特征向量组成的矩阵就可以作为旋转的变换。

而我们原本非常熟悉的平面直角坐标系的基底对应的矩阵就是二维的单位矩阵: I=[1001]I = \left [ \begin{matrix} 1 & 0 \\ 0 & 1 \end{matrix} \right ] I=[10​01​]

任何向量左乘这个坐标系的基底矩阵都不会有任何变化,原地不动: x=Ixx = I xx=Ix

第二个山楂:矩阵变换对应缩放的例子

如果接着上面旋转的例子来讲,求 OB 中点 C 对应的向量就可以如下:
[xCyC]=[0.5000.5][xByB]\left [ \begin{matrix} x_C \\ y_C \end{matrix} \right ] = \left [ \begin{matrix} 0.5 & 0\\ 0 & 0.5 \end{matrix} \right ] \left [ \begin{matrix} x_B\\ y_B \end{matrix} \right ] [xC​yC​​]=[0.50​00.5​][xB​yB​​]

那中间这个 0.5 对角线矩阵又是什么啊,这不就是很像特征分解得到的特征值摆出来的那个对角矩阵嘛,而且上面这个矩阵很均匀,意思是在两个维度上同比例缩放,那如果我想在第一个维度 x 上变化多一点,而在 y 维度上变化小一点,只需要改成 [0.1000.9]\left [ \begin{matrix} 0.1 & 0\\ 0 & 0.9 \end{matrix} \right ] [0.10​00.9​] 就可以。

还是先说结论:
(1)对角矩阵作为变换矩阵,可以实现缩放。
(2)类推,特征分解得到的特征值组成的对角矩阵作为变换矩阵,也就可以实现缩放了。

第三个山楂:只有方阵才有的特征分解 Eigen Decomposition

我不想在这里说定义啦,随便一查资料一大把,直接放了。对于方阵 A 可以分解为 A=WΣWT=WΣW−1A = W \Sigma W^T = W \Sigma W^{-1}A=WΣWT=WΣW−1,日常笔算先根据 ∣A−λI∣=0|A - \lambda I | = 0∣A−λI∣=0 算特征值,然后组好特征矩阵;再根据 Ax=λxAx = \lambda xAx=λx 依次求特征值对应的特征向量(也是列向量哦),把列向量左右依次排开就是 WWW。

那么原本 y=Axy = A xy=Ax (x 通过 A 这个变换落在了 y),就变成了 y=Ax=WΣWTxy = Ax = W \Sigma W^T xy=Ax=WΣWTx 。

这个式子怎么算啊,咱们从变换的角度来:
(1)先算最右边 x1=WTxx_1 = W^T xx1​=WTx;
(2)再往左算 x2=Σx1x_2 = \Sigma x_1x2​=Σx1​;
(3)最后 y=Wx2y = W x_2y=Wx2​。

好了,咱们把前面旋转和缩放的例子,拿过来联动一下,看看上面这三步都干嘛了:
(1)旋转,而且相当于逆着按照 WWW 旋转(因为 WT=W−1W^T = W^{-1}WT=W−1);
(2)缩放,而且每个维度上依次按照对应的特征值缩放;
(3)旋转,而且就是按照 WWW 旋转的(诶,就是完完全全严丝合缝转回去了)。

下面是一个拆解特征分解的例子,来自叶韵的《深度学习与计算机视觉》,书并不新也有几年了,但是理论部分讲得很生动。因为一个向量/点并不形象,所以图中笑脸可以用 S0S_0S0​ 表示,笑脸经过矩阵 A 的变换相当于拆解了三步。S3=AS0S_3 = AS_0S3​=AS0​ 变成了 S3=WΣWTS0=WΣS1=WS2S_3= W\Sigma W^TS_0 = W\Sigma S_1 = WS_2S3​=WΣWTS0​=WΣS1​=WS2​。

第四个山楂:从方阵的特征分解“领域展开”到普通矩阵的奇异值分解 Singular Value Decomposition

同样不在这里说定义啦。对于某普通矩阵 A 可以分解为 Am∗n=Um∗mΣm∗nVn∗nTA_{m * n} = U_{m * m} \Sigma_{m * n} V^T_{n * n}Am∗n​=Um∗m​Σm∗n​Vn∗nT​(其实很多公式写法把中间 Σ\SigmaΣ 写作 S 的,因为我下面图片还要用 S 代表那个笑脸,就和特征分解一样先用 Σ\SigmaΣ 了)。

这里的 A 呢虽然不是方阵,但是 AAm∗mTA A^T_{m * m}AAm∗mT​ 和 ATAn∗nA^TA_{n * n}ATAn∗n​ 都是方阵(还都对称)。如果把矩阵 A 看作是包含了信息的话,那么其转置就包含了完全一样的信息(如果拿平面二维直角坐标系来类比的话,无非就是两个坐标轴互换了一下而已,对,就像反函数)。所以虽然左乘右乘不能随意互换的,可是因为信息都一样,所以 Σ\SigmaΣ 这个对角矩阵中应该放的特征值就是AAm∗mTA A^T_{m * m}AAm∗mT​ 和 ATAn∗nA^TA_{n * n}ATAn∗n​ 所共有的那几个或一个特征值。

好了,回来继续说矩阵 U 和 V。AAm∗mTA A^T_{m * m}AAm∗mT​ 和 ATAn∗nA^TA_{n * n}ATAn∗n​ 已经是方阵了,就适用前面说的特征分解了。就把这俩方阵分别特征分解得到的基底向量矩阵(用词不太准确,就是特征分解里面那个 W)就分别是 U 和 V。也就是说 U 和 V 的每一列向量都是单位向量,且互相垂直(所以举一反三一下就是 U 和 V 负责旋转啦~同理矩阵 Σ\SigmaΣ就是负责缩放的)。

那可能注意到了,这里的 U 和 V 是不一样的旋转,并不会像前面特征分解 W 一样,转过去再一模一样地转回来。也就是说,方阵的特征分解算是普通矩阵奇异值分解的一个特例,可以转来转去角度完全抵消的特例。

同样,再上一个生动的例子。图中笑脸仍然可以用 S0S_0S0​ 表示,笑脸经过矩阵 A 的变换相当于拆解了三步。S3=AS0S_3 = AS_0S3​=AS0​ 变成了 S3=UΣVTS0=UΣS1=US2S_3= U\Sigma V^TS_0 = U\Sigma S_1 = US_2S3​=UΣVTS0​=UΣS1​=US2​。

不算山楂插个橘子瓣吧:有关 SVD 需要注意的细节

我看到很多博客或讲解到这里就开始说: SVD 中 Σ\SigmaΣ 矩阵中的奇异值下降的很快所以 SVD 可以用来做 PCA(别拦着我,我要先吐槽再写 PCA)。

这逻辑完全不对好不好(O__O "…),但凡冷静地回过头来看看 SVD 的整个过程,就知道某个矩阵的 SVD 结果中对应的奇异值是矩阵的固有属性,能够反应这个矩阵不同特征维度间的“大小”区别而已。既然如此,某个确定的矩阵对应的奇异值/固有属性就一定是确定的,该是多少是多少,并不会一定“下降得很快”,更不会进一步有因果关系“所以可以用来做 PCA”。

而且并不是所有矩阵都适合做 PCA 的,PCA 是用来降维的,降维的目的是保留绝大部分有用信息/特征的前提下,减小矩阵的尺寸/去除冗余信息,从而节省运算开支避免不必要的浪费。搞清楚这个目的以后就知道了,只有满足一定大前提的矩阵才适合降维,降维的手段其一是用 PCA,实现 PCA 的手段其一是使用 SVD。

那么哪些不适合降维/PCA 呢?
(1)各个特征维度之间博弈非常强,相关性非常差,也就是每个特征都特别“独立”都特别“好”,都不能随便舍弃;
(2)还是上面这个意思,只是换一个说法吧。你的矩阵包含的信息非常“饱满”、“圆润”,对二维来讲,就是你的信息在中心为原点的某个圆内均匀分布;对三维来讲,就是在中心为原点的某个球内均匀分布,你说你想降维,舍弃哪部分呢?
(3)两个维度之间相关性非常强(有维度在划水),但是有一些万万不想舍弃的“细节”,那也不适合 PCA 了。

所以上面这个问题就能说明“哪些矩阵的奇异值分解奇异值会下降得非常快”,特征维度很多,可是很多维度都“废物”在划水,关键信息都集中在很少的个别特征维度上,才会“奇异值下降得特别快”。对于这种矩阵我们可以选择占主导地位的那 k 个维度的特征,“重建”原矩阵(其实应该是约等于)Am∗n≈Um∗kΣk∗kVk∗nTA_{m * n} \approx U_{m * k} \Sigma_{k * k} V^T_{k * n}Am∗n​≈Um∗k​Σk∗k​Vk∗nT​(V 是 n × k 的,前面公式写的是 VTV^TVT)

再进一步,哪些 PCA 适合使用 SVD 呢? / 到底 SVD 和 PCA 什么关系啊? / SVD 怎么帮忙实现 PCA 啊?

这里讨论的前提是,某个矩阵/信息已经确定要/适合做 PCA 了。
粗糙一点地说,个儿大的矩阵,m × n 太大的,适合用 SVD 助力 PCA。不过前面第四个山楂也说了,好像很费劲啊,已知 A 还要求了 AATAA^TAAT 和 ATAA^TAATA 再特征分解,再得到最后结果。不过 SVD 有一种快速计算方法(计算大矩阵非常给力),能够跳过刚刚说的求取 AATAA^TAAT 和 ATAA^TAATA 特征分解的步骤而输出结果 A=UΣVTA = U\Sigma V^TA=UΣVT,对于截断的就是 Am∗n≈Um∗kΣk∗kVk∗nTA_{m * n} \approx U_{m * k} \Sigma_{k * k} V^T_{k * n}Am∗n​≈Um∗k​Σk∗k​Vk∗nT​。PCA 用的就是这里的 U 和 V 或者 Um∗k和Vk∗nTU_{m * k} 和V^T_{k * n}Um∗k​和Vk∗nT​,就看是不是指定 SVD 为截断。

最后一个大大大山楂:不能绕过的 PCA

因为想加点代码,这篇太长了不想串了,再起一篇吧(哎呀写了个龙头蛇尾嘻嘻嘻)。

咳咳,就先串到这里了

总结一下:
(1)普通矩阵具有奇异值分解,特征分解仅仅是奇异值分解的一个特例;
(2)无论是奇异值分解还是特征分解,都会得到三个矩阵相乘,其中第一个和最后一个都是负责旋转的,中间对角矩阵是负责沿着特征维度方向做缩放的。奇异值分解得到的两个旋转一般不相等,特征分解得到的两个旋转是互逆的;
(3)PCA 是降维手段的一种,奇异值分解是实现 PCA 手段的一种。
(4)要先想明白要处理的矩阵/信息需不需要降维,是否要用 PCA 来做降维,做 PCA 降维要不要用 SVD,“因为 SVD 奇异值分解奇异值降低得特别快,所以可以用来做 PCA”的逻辑可千万别再说了。

串糖葫芦了: 矩阵乘法/线性变换 + 特征分解/奇异值分解(SVD) + PCA(请假设中间串了一根棍儿O(∩_∩)O)相关推荐

  1. python 矩阵特征值分解_python3-特征值,特征分解,SVD奇异值分解

    1.设A为n阶矩阵,若存在常数λ及n维非零向量x,使得Ax=λx,则称λ是矩阵A的特征值,x是A属于特征值λ的特征向量. A的所有特征值的全体,叫做A的谱,记为λ(A) 2.特征分解(Eigendec ...

  2. 矩阵的终极分解-奇异值分解 SVD

    https://www.toutiao.com/a6698191532752634376/ 说到一个矩阵,怎么才算是真正掌握它? 一个完美分解的方法就是SVD分解.什么是SVD?全称是 singula ...

  3. 聊聊特征分解和SVD分解

    矩阵分解 矩阵分解(decomposition,factorization):将矩阵拆分为多个矩阵的乘积的运算.矩阵的分解包括以下几种: 特征分解 SVD分解 PCA QR分解 LU分解 极分解 矩阵 ...

  4. matlab矩阵及其基本运算—特征值分解和svd奇异值分解

    特征值分解 函数 eig eig: Find eigenvalues and eigenvectors 格式 d = eig(A)         %求矩阵A的特征值d,以向量形式存放d. d = e ...

  5. 矩阵特征分解介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)

    对角矩阵(diagonal matrix):只在主对角线上含有非零元素,其它位置都是零,对角线上的元素可以为0或其它值.形式上,矩阵D是对角矩阵,当且仅当对于所有的i≠j, Di,j= 0. 单位矩阵 ...

  6. 矩阵特征分解(svd)介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)

    对角矩阵(diagonal matrix):只在主对角线上含有非零元素,其它位置都是零,对角线上的元素可以为0或其它值.形式上,矩阵D是对角矩阵,当且仅当对于所有的i≠j, Di,j= 0. 单位矩阵 ...

  7. 线性代数之 矩阵的特征值,特征向量,特征分解

    线性代数之 矩阵的特征值,特征向量和特征分解 前言 特征值和特征向量 求矩阵特征值 矩阵的特征分解 补充:实对称矩阵 后记 前言 矩阵的特征分解是比较基础的知识了,但是应用却十分广泛,比如主成分分析. ...

  8. python判断矩阵是否对称_矩阵的特征分解(推导+手算+python计算+对称矩阵的特征分解性质)...

     1. 前言 最近几天一直在学习矩阵的知识,恶补了特征分解和SVD算法,发现网上很多资料都是不全的,所以想记录一下这里面的特征分解推导过程. 2.矩阵的进阶知识 2.1 特征分解(谱分解)=> ...

  9. 矩阵分解之: 特征值分解(EVD)、奇异值分解(SVD)、SVD++

    目录: 1.矩阵分解 1.1 矩阵分解的产生原因 1.2 矩阵分解作用 1.3 矩阵分解的方法 1.4 推荐学习的经典矩阵分解算法 2. 特征值分解(EVD) 3. 奇异值分解(SVD) 4. SVD ...

最新文章

  1. 创建型模式--(再论)单例模式
  2. 970计算机技术基础,2017年武汉大学测绘遥感信息工程国家重点实验室970计算机技术基础考研强化模拟题...
  3. java 数组group by_java Group by分组算法
  4. .gitignore文件不起作用
  5. Loadruner压数据库oracle,LoadRunner连接Oracle数据库(转)
  6. 织梦CMS调用文章列表时,怎么显示短时间格式
  7. mybatis sql 按照特定的字段顺序排序,按照拼音首字母排序
  8. 华为ensp cloud(云)中没有网卡,缺失网卡,网卡地址错误解决方法
  9. 微分方程模型_MIT—微分方程笔记03 一阶线性常微分方程解法
  10. 统计员工业绩app_一哥管家(员工绩效统计)app手机下载-一哥管家(员工绩效统计)安卓最新版下载1.0.8-闪电下载网...
  11. 中文语音评测之thchs30+gop_speechocean762实现
  12. 苹果id退出后数据还在吗_答疑你的手机连接WiFi后,会关闭移动数据吗?
  13. 科学探索奖名单揭晓:北大数学「黄金一代」袁新意上榜,首现90后获奖人
  14. 机器翻译评估标准介绍和计算方法
  15. 网上最全的系统服务想PF降到50以下(转)
  16. Object 的 equal() 、hashCode()方法说起
  17. psycopg2 , pymysql 连接数据库 操作
  18. 实际的机械臂控制(9)Moveit单独控制机械臂末端在XYZ三个轴的平移和旋转(基于python)
  19. Python爬虫(学习笔记)
  20. android 区域 推流,Android——直播推流SDK

热门文章

  1. 哔哩哔哩bilibili 部分接口
  2. 概率论与计算机系统结构为同一天,计算机体系结构后习题原版答案_张晨曦著.doc...
  3. VPU加速引擎 是什么意思?
  4. 比Xshell好用100倍,这个号称全世界最好用的终端工具,你一定要知道
  5. Intellij 2021.3 运行应用的时候 shorten command line
  6. 【Outlook 邮件配置】
  7. 独立开发变现周刊(第61期): 如何构建一个100万美元年收入开源SaaS的?
  8. Win32:Windows API (一)
  9. 如何开始学习 Hadoop?
  10. 一个敏感词检查功能是怎么来的