1. 参考文献
这一部分参考一个国外博客系列:
https://medium.com/@abdullatif.h
应用部分参考了:
https://zhuanlan.zhihu.com/p/337444962
2. 主成分分析1——直觉
在分析数据时,如果数据维度大于3,我们很难直观的对其进行想象。那么有没有可能对数据维度进行缩减,找出其中的主要部分呢?答案是有可能,就是通过主成分分析法(PCA)
2.1 第一个例子
有一组数据如下,每个数据点有四个维度,分别是,价格,面积,层数和户数。
仔细观察可以发现,每个维度的重要性并不相同。层数的变化非常小
σ
2
=
0.2
\sigma^2=0.2
σ2=0.2,没有什么有效信息。相比之下,户数的变化范围比较大
σ
2
=
28
\sigma^2=28
σ2=28,面积的变化范围更大
σ
2
=
43
\sigma^2=43
σ2=43,价格的变化范围最大
σ
2
=
127
\sigma^2=127
σ2=127。变化比较大说明蕴含的信息比较到。
再仔细观察,可以看到价格大约是面积的2倍,这说明两组数据之间有比较高的covarience,说明两组数据时相关的,这样可以忽略掉其中一组信息
结论:
- 变化范围越大越好
- 相关性越小越好
2.2 第二个例子
有一组数据如下图,可以看到数据沿着
x
1
x_1
x1轴变化很大,而沿着
x
2
x_2
x2轴变化很小。
因此可以进行如下简化:
可以看到经过简化后的数据变成一维了
2.3 第三个例子
有一组数据如下:
这个时候要进行简化,就要先对坐标轴进行旋转,找到变化最大的轴。
那么如何找到变化最大的轴呢??
3. 主成分分析2——一些基础知识
3.1 点乘
3.1.1 单点点乘
一张图:
一些说明:
(1)向量a和单位向量b点乘的结果:就是图中的红色线段长度,也就是向量a在向量b方向上的投影长度
(2)点乘的结果是向量b上距离a最近点的位置
(3)点乘的结果是向量a沿向量b方向分解的长度
(4)可以从夹角上看两个向量的近似程度
3.1.2 多点点乘
一张图:
假设:
可以将点乘表达为矩阵向量相乘的形式:
3.2 外积?(outer product)不太对吧。。
上面那一节得到了向量a在向量b上的投影长度,本节在投影长度基础上得到投影向量,也就是长度乘以单位方向向量b
同理,当有多个点时:
为求向量w1,w2,w3,w4,利用:
3.3 转置和对偶空间
假设有如下的数据,当写成3行2列时,将每一行看做一个数据点,则共有三个数据点,每个点时2维的,可画出下面的图
将数据进行转置,如下。得到新的矩阵,仍然将每一行看做一个数据点,则一共得到两个数据点,每个点3维
可以绘制出如下图的两个点
这两个点构成一个平面,如下
这个平面就是dual space
总结如下图:
3.4 variable space和dual space关系
如下图,三个数据点,均值是0。构成的variable space和dual space。这个比较好理解,假设有点:
p
1
=
[
−
1
,
−
2
]
p
2
=
[
0
,
0
]
p
3
=
[
1
,
2
]
p_1 = [-1,-2] \\ p_2 = [0 , 0] \\ p_3 = [1 , 2] \\
p1=[−1,−2]p2=[0,0]p3=[1,2]
转置之后,确实可以得到右侧的dual space图
这里取点:
p
1
=
[
−
0.8
,
−
2
]
p
2
=
[
−
0.4
,
0.4
]
p
3
=
[
1.2
,
1.6
]
p_1 = [-0.8, -2] \\ p_2 = [ -0.4, 0.4] \\ p_3 = [1.2, 1.6]
p1=[−0.8,−2]p2=[−0.4,0.4]p3=[1.2,1.6]
可以看到在右侧dual space中,红向量和蓝向量的夹角随着点的离散程度(不相关程度)增大而增大。
(1)转置后的x向量自己点乘就得到variance
(2)转置后的x向量和y向量点乘就是covariance
3.5 variance和covariance
3.5.1 variance
当数据均值是0时,有:
如果忽略系数1/3,可得:
3.5.2 covariance
3.5.4 covariance matrix
4. 主成分分析3——variance最大方向
本节的最终目的是要找到一组数据点的variance最大的方向。
假设有一个均值为0的数据集A(nxd),A有n个数据点,每个数据点时d维度的向量。假设有一个单位方向向量v,那么数据集A中的点向v方向上的投影为:
得到的p是一个n行1列向量,每一个值,代表每一个数据点在v方向上投影的长度。
紧接着可以求A数据集在v方向上的方差(variance):
可见,我们得到了协方差矩阵C。本节的问题可以被描述为:
寻找一个方向v,使得数据集A在该方向上的方差
σ
v
2
\sigma^2_v
σv2最大
由于协方差矩阵C是对称阵,对称阵的特征向量是标准正交的,也就是:
任意一个向量都可以用垂直正交的特征向量的线性组合进行表示:
利用协方差矩阵C,对向量u进行线性变换:
进一步计算
u
T
C
u
u^TCu
uTCu:
结论1:
由于最终目的是找到一个u,使得
σ
2
=
u
T
C
u
\sigma^2 = u^TCu
σ2=uTCu取得最大值。根据上面的推导,我们实际上要确定k1和k2来使得目标函数取得最大值。这里
λ
1
\lambda_1
λ1和
λ
2
\lambda_2
λ2是定值,并且考虑到u为单位向量,因此有
k
1
2
+
k
2
2
=
1
k^2_1 +k_2^2 = 1
k12+k22=1,假设
λ
1
>
λ
2
\lambda_1>\lambda_2
λ1>λ2,我们只需要取k1=1,k2=0即可使目标函数取得极大值。
也就是说,variance最大的方向,就是在特征值最大的特征向量方向。
结论2:
我们的目标是:
由于v就是特征向量本身,因此有:
5. SVD
下图展示了向量分解的过程:
SVD的作用就是完成向量向标准正交基的分解。
5.1 向量分解
下图为向量分解的要素图
(1)要有投影方向,如上图为v1和v2两个正交的单位向量,也可以是任意两个不共线的向量
(2)投影长度,如图中的
s
a
1
s_{a1}
sa1和
s
a
2
s_{a2}
sa2
(3)分解后的向量,如图中的
p
a
1
=
s
a
1
⋅
v
1
p_{a1}=s_{a1} \cdot v1
pa1=sa1⋅v1和
p
a
2
=
s
a
2
⋅
v
2
p_{a2}=s_{a2} \cdot v2
pa2=sa2⋅v2
结论:
任何一个向量分解过程都可以通过确定v1,v2,
s
a
1
s_{a1}
sa1,
s
a
2
s_{a2}
sa2唯一确定。
5.2 SVD引出
上面讲了一个向量的分解过程,SVD就是对一组向量进行分解。
依然先看一个向量分解:
这里的基向量页是表达在固定坐标系下。
由于向量内积就是投影过程,有:
写成矩阵形式:
考虑更多的点,而不仅仅是一个:
效果就如下图所示:
然后考虑更高的维度,而不仅仅是2维:
总结成下图:
将上式移项:
到这里我们可以看到SVD分解的后半部分,下面考虑前半部分如下:
我们期望看到:
仔细分析S矩阵有:
下面考虑将S矩阵的列向量进行标准化,首先通过一个例子看看进行列标准化的过程。
考虑一个矩阵M
首先对第一列进行操作,寻找一个变换矩阵:
需要的矩阵如下:
再考虑对第二列进行操作:
下面,我们要寻找一个类似的操作,对S矩阵进行标准化。要计算出如下的除数:
然后对S进行分解:
最终得到SVD分解:
一些解释:
首先再看一下S:
我们为什么要费力操作S?
σ
\sigma
σ的含义又是什么。可以看到
σ
\sigma
σ是所有点在同一个轴上的投影长度的平方和,这意味着,如果
σ
\sigma
σ大,那么所有点离该轴近,如果
σ
\sigma
σ小意味着,点离该轴远,如下图,如果
σ
1
>
σ
2
\sigma_1 > \sigma_2
σ1>σ2,意味着点离v1轴比离v2轴要近。
6. 应用
6.1 主成分分析
对一组数据进行SVD分解:
我们想留哪一列的投影结果,就将其他列划掉,重新计算A‘矩阵就行:
6.2 求解线性方程组
6.2.1 一般形式
6.2.1.1 伪逆方法
6.2.1.2 SVD方法
6.2.2 有约束,且b=0形式
在slam问题中,有非常多类似的问题,比如通过8点法求解本质矩阵,求解三角化等等,都是通过SVD进行求解。