维列向量. 但是这个
维列向量.目标:将每个
x∈D
映射到另一个
p
维空间,
p<d
(虽然等于也是可以的, 但没什么意义). 得到一个新的数据集
Z
, 对
Z
的要求是
尽量保存D
那么, 问题就来了. 如何将一个d
维向量映射成一个
p
维向量? 答案是基变换. 然而基变换方式不是唯一的, 如何确保变换是最优的? 这就由优化目标"尽量保存原数据集中的信息" 决定了: 最好的基变换能保存最多的信息. 注意了, 这里的比较都是在同一个
p
下进行的, 也就是说, 参与竞争的基集(basis set)们, 都把
d
维
D
映射到了一个新的
p
维
Z
.
那么, (不好意思, 又一个那么. 这不是第一个, 当然也不是最后一个. 是的, 我喜欢用这个词.), 现在面临的问题是, 如何衡量信息的多少? 我并不懂信息科学, 只知道一点, 信息在差异中存在. 如果全是相同的东西, 量再多,它的信息量也没有多少. PCA算法采用方差(variance)来度量信息量.
那么, 如何用variance来度量数据集D
包含的信息量呢? 一个基(basis)一个基地衡量. 数据集在某个基上的投影值(也是在这个基上的坐标值)越分散, 方差越大, 这个基保留的信息也就越多. 不严格的来一句, 一个基集保留下的信息量是每个基保留下的信息量的和.
基于上面的理念, 或者说假设, 我们已经有一种可以有效地找出最优基集的方法了: 贪心算法---先找出保留信息量最大的基向量, 然后是第二大的, 然后然后, 直到找满p
个基向量.
接下来, 将上面的分析用数学语言描述出来.
v
为一个用于变换的基.
D
中的某一条记录
x
在
v
上的投影长度(即坐标值)为:
proj(x,v)=vTx||v||
假如
v
为单位向量, 则:
proj(x,v)=vTx
所以, 为了方便计算, 我们对
v
有了一个约束条件:
v
为单位向量. 这个太好说了, normalize 一下就行了.
于是, 整个D
在
v
上的投影长度可以打包表示为:
Xv
, 其中,
X
是一个
m×d
的矩阵, 每一行是一条记录,
m
是
D
中的记录总数目. 在数据预处理时, 我们先将
X
每一列的均值变为0: 先算出每一列的均值, 得到均值向量
μ
, 然后从每一条记录
xi
中减去
μ
:
xi←xi−μ
. 最后用这些预处理后的
xi
组成
X
.
现在, 我们来计算
D
在
v
上的信息量, 即所有数据在
v
上的投影长度的方差:
μ(X,v)=0
info(D,v)=σ2(X,v)=1m∑i=1m(vTxi−μ)2=1m(Xv)TXv=1mvTXTXv
仔细看
XTX
这个东西, 因为做过均值化处理,
1mXTX
, 成为了原数据集
D
的协方差矩阵, 用
C
表示. 所以
info(D,v)=σ2(X,v)=vTCv
这就是我们需要最大化的目标函数. 不过, 再回想一下, 我们之前为了方便计算还加了一个条件进来:
v
是一个单位向量, 即
vTv=1
. 把这个条件也加到目标函数里去:
f(v)=vTCv−λ(vTv−1)
所以, 这才是我们最终需要优化的目标函数.
now, 求使
f(v)
最大的
v
.
f(v)
取得条件极值的
必要条件为:
(这个矢量函数求偏导的过程类似于神经网络BP算法求偏导过程, 以后在另一篇文章单独推导.)
∂f∂v=2Cv−2λv=0
Cv=λv
所以,
v
为
C
的特征向量. 它保存的信息量为:
info(D,v)=vTCv=vTλv=λvTv=λ
于是, 奇迹就这么出现了:
信息量保存能力最大的基向量一定是D
的协方差矩阵的特征向量, 并且这个特征向量保存的信息量就是它对应的特征值.
接下来的戏码你们应该都知道了: 用单位正交阵将C
对角化(
C
是对称矩阵, 天生如此);特征值降序排列, 以排名前
p
个特征值对应的特征向量作为新的基集. (这个做法看起来很自然, 但若细细思量, 会发现这一步是PCA算法里水最深的一步, 至少我现在还没真正理解为何要这么做, 听qw学长说要用什么Rayleigh商).
剩下的问题, 比如降维后损失了多少信息, 也很明白了, 就不多讲了.
(END)