高维向量的相似度判定-距离产生了,美还在吗
“海内存知己,天涯若比邻”,古人用心理距离辨证了时空距离,机器学习何尝不是,看似毫不相关或者毫无头绪的分类问题,由于采用了合适的数学距离,就将它们在高维度空间分开了,展现在三维空间里,很多神奇的事情令人难以置信。现实中,我们做神经网络分类或者编码时,loss函数往往需要根据‘distance’来设计,这些distance理解起来是比较烧脑的,下面这个笔记整理些常用的距离,系统的分析一下这些距离的前世今生,看看哪些距离美到令人窒息,还有哪些距离令人痛苦的不能自拔?本文整理的主线来自向量的相似性度量-距离计算方法总结这篇博文,在此感谢作者的总结,为我点亮了一盏明灯。
向量的显式距离
向量的显式距离是根据对向量中相同索引的变量进行直观的分析、计算得出的。
汉明距离-Hamming distance:变量差异计数器
汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数【3】。汉明距离是我(做通信工程师)最早接触的一类数学距离,信道纠错码里对汉明距离有非常深的理解和使用。还是举个百度的例子:1011101 与 1001001 之间的汉明距离是 2。正如我的定义,这就是两个向量相同索引的变量差异计数器,简单直观,但是很多信息量损失掉了,所以汉明距除了在二进制编解码中的应用,其他地方用的不多。
曼哈顿距离-Manhattan Distance:变量差异累加器
曼哈顿距离也称为城市街区距离(City Block distance),是变量差异的绝对值累加,比较形象的理解就是曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。【1】,这个距离在比汉明距的进步就是对变量的细节在权重上给与的保留,但是放弃了变量的方向(正负关系),在“曼哈顿问题”上有实际的用途,对于多维空间两个维度相同的向量
X
(
x
1
,
x
2
,
.
.
.
x
n
)
X(x_1,x_2,...x_n)
X(x1,x2,...xn)和
Y
(
y
1
,
y
2
,
.
.
.
y
n
)
Y(y_1,y_2,...y_n)
Y(y1,y2,...yn),定义两个向量在n维空间的曼哈顿距离公式如下:
D
i
s
t
a
n
c
e
M
a
n
h
=
∑
i
=
1
n
∣
x
i
−
y
i
∣
Distance_{Manh}={\sum_{i=1}^n|x_i-y_i|}
DistanceManh=i=1∑n∣xi−yi∣
显而易见,二进制的世界里,曼哈顿距离=汉明距离,那么就可以说曼哈顿距离是汉明距离在多进制世界中的版本。
欧氏距离-Euclidean Distance:几何距离的多维思考
Euclidean翻译成汉语就是“欧几里得”,古希腊数学家,被称为“几何之父”。这个名字被我和18世纪的伟大数学家欧拉(Eular)搞混了,罪过。欧氏距离实际上就是在二维和三维空间上的直线距离进而推广到多维空间的距离定义。这应该是最容易被我们理解和接受的一种距离定义,同时也被机器学习和模式识别等领域广泛采用。
二维空间的定义:
D
i
s
t
a
n
c
e
e
u
c
l
i
−
2
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
Distance_{eucli-2}= \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
Distanceeucli−2=(x2−x1)2+(y2−y1)2
三维空间的定义:
D
i
s
t
a
n
c
e
e
u
c
l
i
−
3
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
+
(
z
2
−
z
1
)
2
Distance_{eucli-3}= \sqrt{(x_2-x_1)^2+(y_2-y_1)^2+(z_2-z_1)^2}
Distanceeucli−3=(x2−x1)2+(y2−y1)2+(z2−z1)2
对于多维空间两个维度相同的向量
X
(
x
1
,
x
2
,
.
.
.
x
n
)
X(x_1,x_2,...x_n)
X(x1,x2,...xn)和
Y
(
y
1
,
y
2
,
.
.
.
y
n
)
Y(y_1,y_2,...y_n)
Y(y1,y2,...yn),定义两个向量在n维空间的欧氏距离为:
D
i
s
t
a
n
c
e
e
u
c
l
i
−
n
=
∑
i
=
1
n
(
x
i
−
y
i
)
2
Distance_{eucli-n}= \sqrt{\sum_{i=1}^n(x_i-y_i)^2}
Distanceeucli−n=i=1∑n(xi−yi)2
向量表示法:
D
i
s
t
a
n
c
e
e
u
c
l
i
−
n
=
(
X
−
Y
)
T
(
X
−
Y
)
Distance_{eucli-n}= \sqrt{(X-Y)^T(X-Y)}
Distanceeucli−n=(X−Y)T(X−Y)
闵可夫斯基距离-Minkowski Distance:变量的高阶差异累加
在曼哈顿距离和欧氏距离的基础上,闵氏距离从二阶推广到n阶,对于多维空间两个维度相同的向量
X
(
x
1
,
x
2
,
.
.
.
x
n
)
X(x_1,x_2,...x_n)
X(x1,x2,...xn)和
Y
(
y
1
,
y
2
,
.
.
.
y
n
)
Y(y_1,y_2,...y_n)
Y(y1,y2,...yn),定义两个向量在n维空间的闵氏距离为:
D
i
s
t
a
n
c
e
M
i
n
k
o
=
k
∑
i
=
1
n
∣
x
i
−
y
i
∣
k
Distance_{Minko}= ^k\sqrt{\sum_{i=1}^n|x_i-y_i|^k}
DistanceMinko=ki=1∑n∣xi−yi∣k
显然k=1和k=2是之前提到的,而高阶的话无法直观理解其功用。
切比雪夫距离-Chebyshev Distance:最大的就是最好的
切比雪夫距离是向量空间中的一种度量,二个向量点之间的距离定义是其各坐标数值差绝对值的最大值。对于多维空间两个维度相同的向量
X
(
x
1
,
x
2
,
.
.
.
x
n
)
X(x_1,x_2,...x_n)
X(x1,x2,...xn)和
Y
(
y
1
,
y
2
,
.
.
.
y
n
)
Y(y_1,y_2,...y_n)
Y(y1,y2,...yn),定义两个向量在n维空间的切比雪夫距离为:
D
i
s
t
a
n
c
e
C
h
e
b
y
=
max
i
(
∣
x
i
−
y
i
∣
)
=
lim
k
−
>
∞
(
∑
i
=
1
n
∣
x
i
−
y
i
∣
k
)
1
/
k
Distance_{Cheby}= \max_i{(|x_i-y_i|)}=\lim_{k->\infty}(\sum_{i=1}^n|x_i-y_i|^k)^{1/k}
DistanceCheby=imax(∣xi−yi∣)=k−>∞lim(i=1∑n∣xi−yi∣k)1/k
极限表达式没太理解。这个距离很多例子来自于国际象棋,或者仓储机器人的使用。
显式距离的罪与罚
显式距离只考虑向量相同下标索引到的变量差异,用法相对死板,在博文【1】中提到了两个缺点:
- 将各个分量的量纲(scale),也就是“单位”当作相同的看待了。
- 没有考虑各个分量的分布(期望,方差等)可能是不同的。
举一个小栗子,把一个向量循环移位之后的新向量与原向量比较,显式距离可能特别的大,那就说明这两个向量没有关系吗?
向量的隐式(归一化)距离
向量之间除了对标变量差异外,还需要考虑不对标的变量之间有什么联系,另外还要考虑量纲,分布的影响,这样normalize(归一化)后的距离统统归到隐式距离,这类问题经常用相似度similarity来取代normalized距离,毕竟二次处理,升华了,因为similarity亦或归一化距离的取值大都(-1,1)或者(0,1),所以可以将两者做简单的互换:
D
i
s
t
a
n
c
e
N
o
r
m
a
l
i
z
e
d
=
1
−
s
i
m
i
l
a
r
i
t
y
Distance_{Normalized} = 1 - similarity
DistanceNormalized=1−similarity
归一化欧氏距离 -Standardized Euclidean distance
假设向量X的均值(mean)为m,标准差(standard deviation)为s,那么X的“归一(标准)化变量”表示为:
X
∗
=
X
−
m
s
X^*=\frac{X-m}{s}
X∗=sX−m
那么再次假设一组向量集合,每个维度(下标)的向量X是独立(不相关)的,则求归一化后的向量的欧氏距离
D
i
s
t
a
n
c
e
S
−
e
u
c
l
i
−
n
=
∑
i
=
1
n
(
x
i
∗
−
y
i
∗
)
2
=
∑
i
=
1
n
(
x
i
−
y
i
s
i
)
2
Distance_{S-eucli-n}= \sqrt{\sum_{i=1}^n(x_i^*-y_i^*)^2}= \sqrt{\sum_{i=1}^n(\frac{x_i-y_i}{s_i})^2}
DistanceS−eucli−n=i=1∑n(xi∗−yi∗)2=i=1∑n(sixi−yi)2
其实这个公式是对数据集合同下标的变量做了归一化,感觉还是怪怪的,假设条件很重要。将每个维度方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(WeightedEuclidean distance)。但多维向量不同维度之间往往是有联系的,所以这种归一化只是为了研究而已。
马氏距离-Mahalanobis Distance
上面的归一化欧氏距离实在太牵强,强行把各维度做归一化之后的空间特征肯定有了很大变化。马氏距离可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题,比归一化欧氏距离合理的多,也得到了很多应用。对于多维空间(协方差矩阵为
S
S
S,均值向量为
μ
\mu
μ)两个维度相同的向量
X
(
x
1
,
x
2
,
.
.
.
x
n
)
X(x_1,x_2,...x_n)
X(x1,x2,...xn)和
Y
(
y
1
,
y
2
,
.
.
.
y
n
)
Y(y_1,y_2,...y_n)
Y(y1,y2,...yn),定义单个向量到
μ
\mu
μ的马氏距离为:
D
i
s
t
a
n
c
e
M
a
h
a
l
=
(
X
−
μ
)
T
S
−
1
(
X
−
μ
)
Distance_{Mahal}= \sqrt{(X-\mu)^TS^{-1}(X-\mu)}
DistanceMahal=(X−μ)TS−1(X−μ)
定义两个向量在n维空间的马氏距离为:
D
i
s
t
a
n
c
e
M
a
h
a
l
=
(
X
−
Y
)
T
S
−
1
(
X
−
Y
)
Distance_{Mahal}= \sqrt{(X-Y)^TS^{-1}(X-Y)}
DistanceMahal=(X−Y)TS−1(X−Y)
可以看出马氏距离较之归一化欧氏距离进步的地方就是用协方差矩阵代替了简单的方差,进而消除了变量之间相关性的干扰。如果各样本之间独立同分布,那么就变成了了标准欧拉距离:
D
i
s
t
a
n
c
e
e
u
c
l
i
−
n
=
(
X
−
Y
)
T
(
X
−
Y
)
Distance_{eucli-n}= \sqrt{(X-Y)^T(X-Y)}
Distanceeucli−n=(X−Y)T(X−Y)
马氏距离更加深入的了解请参考附录的链接。马氏距离一直在scikit工具里作为度量学习的主要判据【8】,有兴趣可以读读来研究。
皮尔逊相关系数-Pearson’s Correlation coefficient
皮尔逊相关系数广泛用于度量两个变量之间的相关程度,其值介于-1与1之间,又称皮尔逊积矩相关系数(Pearson product-moment correlation coefficient,简称 PPMCC或PCCs)。两个变量之间的皮尔逊相关系数定义为两个变量之间的协方差和标准差的商:
ρ
X
,
Y
=
c
o
v
(
X
,
Y
)
σ
X
,
σ
Y
\rho_{X,Y}= \frac{cov(X,Y)}{\sigma_X,\sigma_Y}
ρX,Y=σX,σYcov(X,Y)
皮尔逊相关系数有一个重要的数学特性是,因两个变量的位置和尺度的变化并不会引起该系数的改变。
余弦相似度-Cosine Similarity
两个向量间的余弦值可以通过使用欧几里得点积公式求出:
a
⋅
b
=
∣
∣
a
∣
∣
⋅
∣
∣
b
∣
∣
c
o
s
θ
a \cdot b= ||a|| \cdot ||b|| cos\theta
a⋅b=∣∣a∣∣⋅∣∣b∣∣cosθ
由此得出余弦夹角相似度
s
i
m
i
l
a
r
i
t
y
c
o
s
=
c
o
s
θ
=
a
⋅
b
∣
∣
a
∣
∣
⋅
∣
∣
b
∣
∣
=
∑
i
=
1
n
(
x
i
∗
y
i
)
∑
i
=
1
n
(
x
i
)
2
∗
∑
i
=
1
n
(
y
i
)
2
similarity_{cos}= cos\theta =\frac{a \cdot b}{||a|| \cdot ||b||}=\frac{\sum_{i=1}^n(x_i*y_i)}{\sqrt{\sum_{i=1}^n(x_i)^2}*\sqrt{\sum_{i=1}^n(y_i)^2}}
similaritycos=cosθ=∣∣a∣∣⋅∣∣b∣∣a⋅b=∑i=1n(xi)2∗∑i=1n(yi)2∑i=1n(xi∗yi)
余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。这是个非常nice的取值范围,所以最近的很多训练都采用了这个作为度量。
隐式度量的秘密
介绍了这么多隐式距离,他们有什么关系呢?翻了翻网站,看到一个惊人的结论:在数据标准化( μ = 0 , σ = 1 \mu=0, \sigma=1 μ=0,σ=1)后,Pearson相关性系数、Cosine相似度、欧式距离的平方可认为是等价的【6】,虽然看着几个公式眼熟,但是说他们等价实在让人难以接受,慢慢研究,慢慢流泪吧。而实际应用中,欧氏距离和余弦相似性还是比较普遍的,虽然等价,但效果还是不一样的。
其他度量
熵和距离到底有么有关系
Entropy熵的概念最早由统计热力学,学过大学物理的童鞋都曾经被这个概念深深的熵害过,信息熵是香农提出来表达随机变量的不确定性度量的一个概念,想想两者都是衡量分布的混乱程度或分散程度的一种度量。分布越分散(或者说分布越平均),(信息)熵就越大。分布越有序(或者说分布越集中),(信息)熵就越小。用历史打个比方,中国的春秋战国、魏晋南北朝和五代十国是(历史)熵最大的时期,因为乱嘛!秦汉唐宋元明清等王朝则是(历史)熵最小的时期,这就好理解了一些吧。对于样本集合X,定义它信息熵的通用表达
E
n
t
r
o
p
y
(
X
)
=
∑
x
∈
X
−
p
(
x
)
⋅
l
o
g
⋅
p
(
x
)
Entropy(X)= \sum_{x\in X} -p(x)\cdot log\cdot p(x)
Entropy(X)=x∈X∑−p(x)⋅log⋅p(x)
对于分类问题的样本集合,如果n是该集合的类别总和,p是在某一类的概率,则可以写成下面的形式
E
n
t
r
o
p
y
(
X
)
=
∑
i
=
1
n
−
p
i
⋅
l
o
g
2
⋅
p
i
Entropy(X)= \sum_{i=1}^n -p_i\cdot log_2\cdot p_i
Entropy(X)=i=1∑n−pi⋅log2⋅pi
log ( 1/P )来衡量不确定性。P是一件事情发生的概率,概率越大,不确定性越小。可以看到信息熵的公式,其实就是log ( 1/P )的期望,就是不确定性的期望,它代表了一个系统的不确定性,信息熵越大,不确定性越大【7】。信息熵是为了衡量信息本身靠不靠谱的程度,最后怎么就跟神经网络搭上关系,是因为出现了两个衍生概念,交叉熵和KL散度。出现这两个概念是因为现实生活中我们无法获得全部样本,所以的机器学习问题都是以偏概全的瞎猜,最后看谁猜的准,所以定义真是分布概率为p,而经过模型猜测(估计)出来的分布为q,我们在学习(train)的过程就是希望p和q能相等,或者相近,KL散度就是评价这两个抽象分布距离的办法,divergence这个词和distance就联系在一起了。先来看看KL散度的公式:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
i
⋅
l
o
g
⋅
p
i
q
i
D_{KL}(p||q)= \sum_{i=1}^n p_i\cdot log\cdot \frac{p_i}{q_i}
DKL(p∣∣q)=i=1∑npi⋅log⋅qipi
D
K
L
D_{KL}
DKL的值越小,表示q分布和p分布越接近。将上式log中的分号打开:
D
K
L
(
p
∣
∣
q
)
=
∑
i
=
1
n
p
i
⋅
l
o
g
2
⋅
p
i
−
∑
i
=
1
n
p
i
⋅
l
o
g
⋅
q
i
D_{KL}(p||q)= \sum_{i=1}^n p_i\cdot log_2\cdot p_i-\sum_{i=1}^n p_i\cdot log\cdot {q_i}
DKL(p∣∣q)=i=1∑npi⋅log2⋅pi−i=1∑npi⋅log⋅qi
第一项恰巧是信息熵的定义(在确定的训练集合里,这部分是常数),那么第二部分就是交叉熵的定义了:
C
r
o
s
s
E
n
t
r
o
p
y
(
X
)
=
∑
i
=
1
n
−
p
i
⋅
l
o
g
2
⋅
q
i
CrossEntropy(X)= \sum_{i=1}^n -p_i\cdot log_2\cdot q_i
CrossEntropy(X)=i=1∑n−pi⋅log2⋅qi
看看
D
K
L
(
p
∣
∣
q
)
=
C
r
o
s
s
E
n
t
r
o
p
y
(
X
)
−
E
n
t
r
o
p
y
(
X
)
D_{KL}(p||q)= CrossEntropy(X)-Entropy(X)
DKL(p∣∣q)=CrossEntropy(X)−Entropy(X)
换句话说,交叉熵在集合训练过程中的趋势可以作为散度(Distance-divergence)距离,这个值越小,说明估计的概率越接近集合的真是分布。就这样交叉熵完美的实现了loss函数的功能,以后碰到交叉熵应该不会太难过了,详细的推荐一下透彻理解熵(包括信息熵和交叉熵)这篇博文,有例子和推导。
杰卡德相似系数-Jaccard similarity coefficient
两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。公式列在下面,暂时我还真没接触过哪里用得上。
J
(
A
,
B
)
=
A
∩
B
A
∪
B
J(A,B)=\frac{A\cap B}{A\cup B}
J(A,B)=A∪BA∩B
这是衡量两个集合相似程度的指标。目测短期内看不到使用场景,不展开讨论了
信噪比也是距离-Signal-to-Noise Ratio: A Robust Distance Metric for Deep Metric Learning
这来自于CVPR论文Signal-to-Noise Ratio: A Robust Distance Metric for Deep Metric Learning,Mark一下后面有机会再看看吧。
Hausdorff 距离
豪斯多夫距离:度量空间中真子集之间的距离。Hausdorff距离是另一种可以应用在边缘匹配算法的距离,它能够解决SED方法不能解决遮挡的问题(百度摘抄),Hausdorff distance这篇博文有比较详细的介绍。
参考
距离计算方法总结
Python: Numpy: 两个形状不同的矩阵作计算的广播机制
汉明距离
马氏距离(Mahalanobis Distance)介绍与实例
马氏距离(Mahalanobis Distance)
如何理解皮尔逊相关系数(Pearson Correlation Coefficient)
信息熵,交叉熵和相对熵
What is Metric Learning
度量学习中的pair-based loss
Signal-to-Noise Ratio: A Robust Distance Metric for Deep Metric Learning