一.线性数据降维的不足
线性的降维的特点在于,不论是用什么方法,总之最后的效果是用一个线性变换(数学上形式为乘一个矩阵),将高维空间映射到一个低维空间;而线性变换无法分析出一些曲面等流形的情况,如下图所示。因此我们就需要去寻找非线性的方式。
二.局部线性嵌入(LLE)
这种方法的主要思想就在于,即使是一个复杂的曲面,如果我们只看一个很小的范围的话,就可以化曲面为平面,类似于地球表面虽然是球形,但是如果我们只看很小的一块,那么就是平面。那我们就试图让每个点与其近邻点的相对信息保持不变来实现降维。
我们确定好选取几个近邻点后,由于我们是要确定这个点和它这些近邻点的关系,因此我们就将线性系数作为参数,如下图所示。假设
x
x
x为
n
n
n维,要降维至
m
m
m维,共
k
k
k个输入,选取
l
l
l个近邻点,那么这个参数矩阵的大小就是
k
∗
l
k*l
k∗l
之后我们按照上面的式子选择好参数矩阵之后,我们就把这些当已知量;然后把每个点在低位的位置
z
z
z再作为参数,按照同样的式子来进行计算。这就是所谓的保持每个点与周围点的关系尽量不变。
当然选取的近邻点的个数直接影响着最后的效果,但一般比较小,基本是要小于
m
m
m的,否则因为很多时候可能周围点的向量是线性无关的,那么这个表达式很多时候都是0,就很难来进行优化计算了。这就类似于分类问题要说明属于某个类的概率,而不能只说明就属于某个类导致无法进行梯度下降。
三.拉普拉斯特征映射
这种方法的原理与半监督学习中smoothness assumption假设中的图分类方式道理完全相同,原理叙述方面可见之前的博客:https://blog.csdn.net/Unique13/article/details/107952266
但是这里没有了有监督的标签项,因此我们完全就是只考虑这些无标签项就好,即把所有的
z
z
z当成参数,去求最小的
S
S
S。当然,这里的权重
w
w
w的定义也是和之前半监督学习的方式相同。
当然这里我们发现一个问题,那就是如果我们不再加入任何条件,那我们就纯粹的让所有的
z
z
z都是同一个向量即可,这样
S
S
S一定是0。因此我们这里要加入一个条件:如果所有的
z
z
z都是k维向量,那么所有的
z
z
z所组成的矩阵的秩就是k(换句话说就是如果要求要降到k维,那就是恰好是k维而不能降到更低的维度)。
下面是关于
z
z
z如何计算的推导(忽视掉系数,因为对结果没有影响):
S
=
∑
i
=
1
n
∑
j
=
1
n
∣
∣
z
i
−
z
j
∣
∣
2
W
i
j
(
W
为
定
义
权
重
的
邻
接
矩
阵
)
=
∑
i
=
1
n
(
∑
j
=
1
n
W
i
j
)
z
i
T
z
i
+
∑
j
=
1
n
(
∑
i
=
1
n
W
i
j
)
z
j
T
z
j
−
2
∑
i
=
1
n
∑
j
=
1
n
z
i
T
z
j
W
i
j
=
2
∑
i
=
1
n
D
i
i
z
i
T
z
i
−
2
∑
i
=
1
n
∑
j
=
1
n
z
i
T
z
j
W
i
j
(
D
为
存
储
每
个
节
点
的
度
的
对
角
矩
阵
)
=
2
∑
i
=
1
n
(
D
i
i
z
i
)
T
(
D
i
i
z
i
)
−
2
∑
i
=
1
n
z
i
T
(
∑
j
=
1
n
z
j
W
i
j
)
=
2
t
r
a
c
e
(
Z
T
D
Z
)
−
2
∑
i
=
1
n
z
i
T
(
Z
W
)
i
=
2
t
r
a
c
e
(
Z
T
D
Z
)
−
2
t
r
a
c
e
(
Z
T
W
Z
)
(
逆
用
迹
的
运
算
式
)
=
2
t
r
a
c
e
(
Z
T
L
Z
)
\begin{aligned} S&= \sum_{i=1}^n\sum_{j=1}^n||z_i-z_j||^2W_{ij} \quad(W为定义权重的邻接矩阵)\\ &=\sum_{i=1}^n(\sum_{j=1}^nW_{ij})z_i^Tz_i+\sum_{j=1}^n(\sum_{i=1}^nW_{ij})z_j^Tz_j-2\sum_{i=1}^n\sum_{j=1}^nz_i^Tz_jW_{ij}\\ &=2\sum_{i=1}^nD_{ii}z_i^Tz_i-2\sum_{i=1}^n\sum_{j=1}^nz_i^Tz_jW_{ij}\quad(D为存储每个节点的度的对角矩阵)\\ &=2\sum_{i=1}^n(\sqrt{D_{ii}}z_i)^T(\sqrt{D_{ii}}z_i)-2\sum_{i=1}^nz_i^T(\sum_{j=1}^nz_jW_{ij})\\ &=2trace(Z^TDZ)-2\sum_{i=1}^nz_i^T(ZW)_i\\ &=2trace(Z^TDZ)-2trace(Z^TWZ)\quad(逆用迹的运算式) \\ &=2trace(Z^TLZ) \end{aligned}
S=i=1∑nj=1∑n∣∣zi−zj∣∣2Wij(W为定义权重的邻接矩阵)=i=1∑n(j=1∑nWij)ziTzi+j=1∑n(i=1∑nWij)zjTzj−2i=1∑nj=1∑nziTzjWij=2i=1∑nDiiziTzi−2i=1∑nj=1∑nziTzjWij(D为存储每个节点的度的对角矩阵)=2i=1∑n(Diizi)T(Diizi)−2i=1∑nziT(j=1∑nzjWij)=2trace(ZTDZ)−2i=1∑nziT(ZW)i=2trace(ZTDZ)−2trace(ZTWZ)(逆用迹的运算式)=2trace(ZTLZ) 之后我们再根据我们前面假设的秩的条件,因为满秩加上我们可以限制一下保证是单位向量,从而有
Z
T
D
Z
=
I
Z^TDZ=I
ZTDZ=I(否则仅能保证是对角阵),等价于
t
r
a
c
e
(
Z
T
D
Z
−
I
)
=
0
trace(Z^TDZ-I)=0
trace(ZTDZ−I)=0
之后我们就可以使用拉格朗日乘数法,即
f
(
Z
)
=
t
r
a
c
e
(
Z
T
L
Z
)
+
α
t
r
a
c
e
(
Z
T
D
Z
−
I
)
f(Z)=trace(Z^TLZ)+\alpha trace(Z^TDZ-I)
f(Z)=trace(ZTLZ)+αtrace(ZTDZ−I)使用迹求导法进行求导,我们可以得到有
−
α
D
Z
=
L
Z
-\alpha DZ=LZ
−αDZ=LZ。如果我们只去看
Z
Z
Z中的一个维度,我们就相当于有
−
α
D
z
=
L
z
-\alpha Dz=Lz
−αDz=Lz,也就是广义特征值问题。
这里对特征值的选取就与PCA类似了,需要注意的是这里多了个符号,因此解出来的
z
z
z就是矩阵
L
L
L的最小的
m
m
m个特征值对应的特征向量。这也是这个方法名字的来源。
四.t分布随机邻居嵌入(t-SNE)
1.KL散度
正式介绍降维方法之前要先介绍一下KL散度的概念。
KL散度又称为相对熵,总之来说就要做到如下效果:如果我们用概率分布
Q
Q
Q来近似模拟概率分布
P
P
P的话,要额外使用多少信息量(这就与相似度直接挂钩,也就是说KL散度就是用来衡量两个概率分布的相似度的)。
然而这里我们就又有了信息量的概念,我们需要知道每个分布自己如何计算信息量,才可以去计算我们的KL散度。因此需要用到信息熵的公式:离散型中
H
(
p
)
=
−
∑
i
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(p)=-\sum_i p(x_i)log(p(x_i))
H(p)=−∑ip(xi)log(p(xi)),连续型中
H
(
p
)
=
−
∫
p
(
x
i
)
l
o
g
(
p
(
x
i
)
)
H(p)=-\int p(x_i)log(p(x_i))
H(p)=−∫p(xi)log(p(xi))。当然,这个公式的来源和理解可以参考如下问题中第二高赞的视频,讲的十分的精简有趣,强烈推荐:我是传送门。
从而KL散度按照前面的理解方式,公式就好理解了(以离散性为例):
D
K
L
(
p
∣
∣
q
)
=
−
∑
i
p
(
x
i
)
(
l
o
g
p
(
x
i
)
−
l
o
g
q
(
x
i
)
)
D_{KL}(p||q)=-\sum_i p(x_i)(logp(x_i)-logq(x_i))
DKL(p∣∣q)=−∑ip(xi)(logp(xi)−logq(xi))也就是由于我们是想用
q
q
q来模拟
p
p
p,那当然真实的概率分布还是
p
p
p的,但是计算方式用的是
q
q
q的(见视频中信息熵的概念就懂了),这样才是匹配了信息熵在用
q
q
q来预测
p
p
p的信息熵,然后两者做差来代表差距,仅此而已。
因此我们之后一般就用KL散度来计算两个分布间的相似程度。(注意这个公式没有对称性)
2.t-SNE算法
这种算法相比于LLE就类似于LDA相比于PCA,不仅要求相邻的点要接近,还要要求不相近的点要分开。
我们还是去计算所谓的相邻点的相似度,只是这里我们都进行了归一化处理,这样才有利于去使用KL散度来计算这两个分布的相似程度,让这个
L
L
L越小越好。
这种算法中,如果我们新加入点,我们不得不全部重新计算,是非常麻烦的,因此它主要是用来演示的。那既然是演示,那一般都是用它降到二维。
到这里我们应该发现一个细节,如果这里的
S
S
S我们还是像上文一样,那这种方法只是变成了用散度进行优化罢了,哪里能体现这里所谓的将不相邻的点分开呢?我们自然想到的就是针对于
S
S
S进行开刀,我们希望
S
(
x
i
,
x
j
)
S(x_i,x_j)
S(xi,xj)和
S
(
z
i
.
z
j
)
S(z_i.z_j)
S(zi.zj)不是同一个函数,前者大(接近于1)的时候与后者相似,而前者小(接近于0)的时候,后者应有更大的距离。因此最后的选择就是
S
(
x
i
,
x
j
)
S(x_i,x_j)
S(xi,xj)和之前一样,而
S
(
z
i
.
z
j
)
S(z_i.z_j)
S(zi.zj)选择了
t
t
t分布函数,这也就是这个t-SNE名字的来源。
我们可以明显的看到,为了y值尽量相同,y值越小,转化后x值就越大,而x值相当于范数距离,从而得到我们想要的效果。