![22894c16fb19f5dc28b59b556dfe4aa4.png](https://img-blog.csdnimg.cn/img_convert/22894c16fb19f5dc28b59b556dfe4aa4.png)
PCA 和 SVD
协方差矩阵
在上一篇 最小二乘法 的末尾提到了协方差矩阵以及用它来拟合,这里先再次回顾。
我们来观察一下:
![0e5cec1326bdf4c87df25ecad6c1d550.png](https://img-blog.csdnimg.cn/img_convert/0e5cec1326bdf4c87df25ecad6c1d550.png)
假设有一堆点
我们可以用式子表示出来投影的点在直线上的方差:
点在直线上的投影:
代回 var(l):
其中
S也就是协方差矩阵C的 n 倍:
PCA Principal component analysis - 主成分分析
PCA 是很重要的概念,不仅在 CG 中, 在 ML 中也有它的一席之地。正如 PCA 的名称一样, PCA做的事情是如果给我们一堆数据,它可以帮我们分析出最主要的部分。
如果给我们一堆 2d 的点, PCA 可以帮我们找出距离这些点最近的直线,比如下图的 x' 轴。
![0ad937c3c2dc95d4b97cef0cb05eaff3.png](https://img-blog.csdnimg.cn/img_convert/0ad937c3c2dc95d4b97cef0cb05eaff3.png)
如果给我们一堆 3d 的点, PCA 可以帮我们找出最能代表这些点的平面:
![ddbc061cc830492a5172e7709bffbae5.png](https://img-blog.csdnimg.cn/img_convert/ddbc061cc830492a5172e7709bffbae5.png)
PCA 的很大一个用途是可以帮我们找 bounding box,这样可以做一些快速的相交测试,毕竟 ray-box-intersect 应该比 ray-object-intersect 简单许多。 而 PCA 可以给我们最紧密的 bounding box,比如下图:
![ca1a3ea33b3f3af2495331e38a651fec.png](https://img-blog.csdnimg.cn/img_convert/ca1a3ea33b3f3af2495331e38a651fec.png)
PCA 当然还有许多其它的用途。
有第一部分的结论:
散布矩阵可以用来很好的展示点的分散程度.
因为
上述过程就是求 PCA 的过程:
- 算出质心 :
- 求
:
- 散布矩阵 :
其中 Y 的列为
- 特征分解 :
- 特征值排序 :
- 特征向量排序 :
- 取出我们需要的部分
看下图例子:
![38b730c36d02da9d5e0e0f379abca7e8.png](https://img-blog.csdnimg.cn/img_convert/38b730c36d02da9d5e0e0f379abca7e8.png)
左边,点是没有一个特别的分布方向的,得到的散布矩阵会像这样:
右边,点有一个主要的分布方向,得到的散布矩阵会像这样:
PCA 的另一个常见的用途, CG 或者 ML 中,那就是降维。也就像最上面举的例子,2d 变直线, 3d 变平面, 比如在 ML 中,我们的特征维度太多了,那么我们当然就可以做 PCA, 找出我们想要的‘主要成分’。
PCA的一些计算技巧
如果 A 为 mxn 矩阵, m >> n, 假设 m = 16k, n = 100, 那么
另一方面:
所以
SVD Singular value decomposition - 奇异值分解
第一次听到 ‘奇异值分解’ 也是觉得这个名字怪神秘的。其实一点也不神秘,奇异值分解就是对我们一般的 mxn 矩阵 A,我们可以把它分解成:
正交矩阵 x 对角矩阵 x 正交矩阵, 其中对角矩阵 Σ,上的对角线值
方形的矩阵奇异值分解:
![701a1a34d13cbff5ede13653b50ab0a0.png](https://img-blog.csdnimg.cn/img_convert/701a1a34d13cbff5ede13653b50ab0a0.png)
长方形矩阵可以有两种分解方式:
![50ccb1eada6fa2ba87ebc89158fc47f4.png](https://img-blog.csdnimg.cn/img_convert/50ccb1eada6fa2ba87ebc89158fc47f4.png)
下面这种要在对角阵中填一些0:
![41285b93a689f25407279c089329ddea.png](https://img-blog.csdnimg.cn/img_convert/41285b93a689f25407279c089329ddea.png)
所有 3x3 矩阵可以分解成 旋转,缩放,旋转就是因为SVD:
![ec04cc8e0650ce3f1c6a29c2ea4aa264.png](https://img-blog.csdnimg.cn/img_convert/ec04cc8e0650ce3f1c6a29c2ea4aa264.png)
SVD 的用途非常广泛。
求
已知
所以 Ax=b 也可以立刻解出来了。
rank (A)
rank A 当然也就可以立即求出来了。
PCA
如果我们有了 Y矩阵 (Y 的列为
首先,V 是旋转矩阵, 本身正交:
形状变换
SVD 的另一运用,比如我们有以下形状,我们想通过旋转和位移,让独角兽尽量的靠近成狮子。当然它们比较对齐的时候,我们当然就是希望标注的点之间的距离尽量变小,也就是右图中我们连接红色和灰色的点所得到的距离尽量最小。
![555804b0d8694fa7e486d729228583d8.png](https://img-blog.csdnimg.cn/img_convert/555804b0d8694fa7e486d729228583d8.png)
- 狮子 :
- 独角兽 :
假设旋转矩阵为 R, 位移为 t,那么我们需要最小化的是:
首先我们需要让它们的质心在同一位置,也就是:
也就是:
其次我们展开:
令
其中:
所以:
其中
也就是我们需要最大化:
观察矩阵:
可得:
也就是我们需要最大化矩阵
矩阵的迹有性质 tr(AB) = tr(BA), 所以:
V,R,U都是正交矩阵,所以
而
所以当
参考:
- <PCA and SVD> by Olga Sorkine-Hornung