1. MDS
Multidimensional scaling,简称MDS,中文翻译成多维尺度分析(暂时这样翻译吧。。。)。其原理是利用成对样本间的相似性,去构建合适的低维空间,使得样本在此空间的距离和在高维空间中的样本间的相似性尽可能的保持一致。我们可以用这种方式来可视化数据分布。
2. MDS基本原理
首先,给定
n
个
其中这
n
个样本之间的欧式距离可以表示成如下的矩阵
其中, σij(X)=δij 是样本 i 个 样本
MDS的基本原理是在一个低维的空间中,将 n 个物体嵌入到该空间中,使得彼此间的相似度尽可能地保留。如果这个低维的空间是2维或者3维,则可以画出该
其中 p<<d 。一般 p 取
对于欧式距离,可以被任意旋转和变换,因为这些变换不会改变样本间的距离。所以,对于 Y ,解是不唯一的。
3. Basic majorization theory (基本的最优化理论)
上述的MDS的目标函数可以用如下的优化理论来优化。其基本原理是如下描述。
首先,假设待优化的函数
f(x)
有最优的最小解,但是直接求解
f(x)
的解析解是非常困难的。因此,我们可以找一个简单的,更容易求解最优值的函数
gy(x)
来代替求解
f(x)
。 其中,
gy(x)
满足如下条件
对于任意的
x
,有
其中, y 是一个固定点,并且
则,假设 x∗ 是 gy(x) 的最小值,则根据(6),有 f(x∗)≤gy(x∗) ,又因为 gy(x∗) 是函数 gy(x) 的最小值,则有 gy(x∗)≤gy(y) 。所以,我们可以得到如下的一个不等式链:
通过(7)我们发现,经过
gy(x)
函数,
f(x)
“超着” 下降的”方向”走去(
f(x∗)≤f(y)
)。
若我们反复迭代,则会找到函数
f(x)
的一个局部最小值,若
f(x)
是凸函数,则会找到
f(x)
的最小值。
该优化方法的迭代流程如下:
(1) 选择一个初始值 y=y0 ,找到一个函数,使得 gy(x) 满足公式(6)和公式(7)
(2) 第 i+1 步,求解函数 gy(x) ,得到最小值 yi+1 。
(3) 如果 f(yi)−f(yi+1)<ϵ ,则结束, f(x) 的最优值是 f(yi+1) ;否则,另 y=yi+1 ,转到步骤(2)
4. Cauchy-Schwartz inequality(柯西-施瓦茨不等式)
在优化MDS的目标函数的时候,会用到第3节中的基本的最优化理论,而在寻找
gy(x)
函数的时候,就会用到本小节的柯西-施瓦茨不等式。
首先,先给出柯西-施瓦茨不等式,然后证明其不等式成立。
不等式成立的条件是
证明:
考虑一个一元二次方程
将(10)转化形式如下
很显然,该方程要不没有实数解,要不就是有重根,所以,其判别式 Δ≤0 ,所以有
所以有公式(8)成立。当该方程是重根时,有 Δ=0 ,即 (x1t+y1)=(x2t+y2)=⋯=(xnt+yn)=0 ,
有公式(9)成立。
证明完毕。
其中,柯西-施瓦茨不等式可以化成如下的形式:
我们在优化MDS目标函数的时候,会用到公式(13)。
5. Basic SMACOF methodology
本小节将采用Basic SMACOF methodology对MDS进行优化,其中会用到3、4小节中的内容。
首先,我们将公式(5)展开,拆成3部分。
观察公式(14)有,
∑ni=1δ2ij
是一个常数项,对目标函数优化没有影响。
∑ni=1∑nj=1||yi−yj||2
是一个凸的二次函数,有最小值。
而第三项,根据柯西-施瓦茨不等式,可以得知其有界。如下所示:
其中, zij 是常数。当 yij=zij 时,上述不等式变成等式,符合第3小节的优化理论。根据第3小节,可得到:
则,我们根据第3小节的优化理论,迭代可求解得到 σ(Y) 的最优解。
6. Basic SMACOF methodology 矩阵形式
为了便于优化,可以将公式(16)转化成矩阵的形式。对于公式(16),我们设
对于公式(17)中的 η2(Y) ,有
其中, Aij=(ei−ej)(ei−ej)T , aii=ajj=1 , aij=aji=−1 ,其他地方等于0。则
其中,tr是矩阵的迹。矩阵
V
是函数
η2(Y)
的海森矩阵,其形式如下:
对于公式(17)中的
ρ(Y)
,有
其中
则
综上,
根据公式(16),有
至此,我们可以优化
τZ(Y)
来迭代求解
σ(Y)
。
求解(25),有
其中, V−1 是 V 的广义逆。
7. MDS python代码
在sklearn机器学习包中,有MDS的相关代码,示例如下:
import numpy as np
import pandas as pd
from sklearn.manifold import MDS
import matplotlib.pyplot as plt
data = np.array([(5,0,0,0,0,1,0,2,1,0),
(0,0,3,0,3,0,1,0,0,1),
(2,0,0,0,0,0,1,0,0,0),
(1,0,1,0,2,0,0,0,0,1),
(5,0,2,0,0,4,2,2,3,7),
(0,3,0,1,0,0,0,0,0,0),
(0,0,0,6,0,0,0,0,0,1),
(0,5,0,0,0,0,0,0,0,0),
(0,1,0,0,0,0,0,0,0,0),
(0,2,0,0,0,0,0,0,0,0)
]
)
index = ['auto1','auto2','auto3','auto4','auto5','moto1','moto2','moto3','moto4','moto5']
columns = ['car','bike','cars','his','tires','she','ive','her','#k','are']
Word = pd.DataFrame(data,index,columns)
mds = MDS()
mds.fit(data)
a = mds.embedding_
plt.scatter(a[0:5,0],a[0:5,1],color='turquoise')
plt.scatter(a[5:10,0],a[5:10,1],color='red')
8 参考文献
[1] Multidimensional Scaling Using Majorization: SMACOF in R
http://gifi.stat.ucla.edu/janspubs/2008/reports/deleeuw_mair_R_08.pdf