高维向量的相似度判定-距离产生了,美还在吗

  • 向量的显式距离
    • 汉明距离-Hamming distance:变量差异计数器
    • 曼哈顿距离-Manhattan Distance:变量差异累加器
    • 欧氏距离-Euclidean Distance:几何距离的多维思考
    • 闵可夫斯基距离-Minkowski Distance:变量的高阶差异累加
    • 切比雪夫距离-Chebyshev Distance:最大的就是最好的
    • 显式距离的罪与罚
  • 向量的隐式(归一化)距离
    • 归一化欧氏距离 -Standardized Euclidean distance
    • 马氏距离-Mahalanobis Distance
    • 皮尔逊相关系数-Pearson's Correlation coefficient
    • 余弦相似度-Cosine Similarity
    • 隐式度量的秘密
  • 其他度量
    • 熵和距离到底有么有关系
    • 杰卡德相似系数-Jaccard similarity coefficient
    • 信噪比也是距离-Signal-to-Noise Ratio: A Robust Distance Metric for Deep Metric Learning
    • Hausdorff 距离
  • 参考

“海内存知己,天涯若比邻”,古人用心理距离辨证了时空距离,机器学习何尝不是,看似毫不相关或者毫无头绪的分类问题,由于采用了合适的数学距离,就将它们在高维度空间分开了,展现在三维空间里,很多神奇的事情令人难以置信。现实中,我们做神经网络分类或者编码时,loss函数往往需要根据‘distance’来设计,这些distance理解起来是比较烧脑的,下面这个笔记整理些常用的距离,系统的分析一下这些距离的前世今生,看看哪些距离美到令人窒息,还有哪些距离令人痛苦的不能自拔?本文整理的主线来自向量的相似性度量-距离计算方法总结这篇博文,在此感谢作者的总结,为我点亮了一盏明灯。

向量的显式距离

向量的显式距离是根据对向量中相同索引的变量进行直观的分析、计算得出的。

汉明距离-Hamming distance:变量差异计数器

汉明距离是以理查德·卫斯里·汉明的名字命名的。在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数【3】。汉明距离是我(做通信工程师)最早接触的一类数学距离,信道纠错码里对汉明距离有非常深的理解和使用。还是举个百度的例子:1011101 与 1001001 之间的汉明距离是 2。正如我的定义,这就是两个向量相同索引的变量差异计数器,简单直观,但是很多信息量损失掉了,所以汉明距除了在二进制编解码中的应用,其他地方用的不多。

曼哈顿距离-Manhattan Distance:变量差异累加器

曼哈顿距离也称为城市街区距离(City Block distance),是变量差异的绝对值累加,比较形象的理解就是曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。实际驾驶距离就是这个“曼哈顿距离”。【1】,这个距离在比汉明距的进步就是对变量的细节在权重上给与的保留,但是放弃了变量的方向(正负关系),在“曼哈顿问题”上有实际的用途,对于多维空间两个维度相同的向量X(x1,x2,...xn)X(x_1,x_2,...x_n)X(x1​,x2​,...xn​)和Y(y1,y2,...yn)Y(y_1,y_2,...y_n)Y(y1​,y2​,...yn​),定义两个向量在n维空间的曼哈顿距离公式如下:
DistanceManh=∑i=1n∣xi−yi∣Distance_{Manh}={\sum_{i=1}^n|x_i-y_i|} DistanceManh​=i=1∑n​∣xi​−yi​∣
显而易见,二进制的世界里,曼哈顿距离=汉明距离,那么就可以说曼哈顿距离是汉明距离在多进制世界中的版本。

欧氏距离-Euclidean Distance:几何距离的多维思考

Euclidean翻译成汉语就是“欧几里得”,古希腊数学家,被称为“几何之父”。这个名字被我和18世纪的伟大数学家欧拉(Eular)搞混了,罪过。欧氏距离实际上就是在二维和三维空间上的直线距离进而推广到多维空间的距离定义。这应该是最容易被我们理解和接受的一种距离定义,同时也被机器学习和模式识别等领域广泛采用。
二维空间的定义:
Distanceeucli−2=(x2−x1)2+(y2−y1)2Distance_{eucli-2}= \sqrt{(x_2-x_1)^2+(y_2-y_1)^2} Distanceeucli−2​=(x2​−x1​)2+(y2​−y1​)2​
三维空间的定义:
Distanceeucli−3=(x2−x1)2+(y2−y1)2+(z2−z1)2Distance_{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(x1,x2,...xn)X(x_1,x_2,...x_n)X(x1​,x2​,...xn​)和Y(y1,y2,...yn)Y(y_1,y_2,...y_n)Y(y1​,y2​,...yn​),定义两个向量在n维空间的欧氏距离为:
Distanceeucli−n=∑i=1n(xi−yi)2Distance_{eucli-n}= \sqrt{\sum_{i=1}^n(x_i-y_i)^2} Distanceeucli−n​=i=1∑n​(xi​−yi​)2​
向量表示法:
Distanceeucli−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(x1,x2,...xn)X(x_1,x_2,...x_n)X(x1​,x2​,...xn​)和Y(y1,y2,...yn)Y(y_1,y_2,...y_n)Y(y1​,y2​,...yn​),定义两个向量在n维空间的闵氏距离为:
DistanceMinko=k∑i=1n∣xi−yi∣kDistance_{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(x1,x2,...xn)X(x_1,x_2,...x_n)X(x1​,x2​,...xn​)和Y(y1,y2,...yn)Y(y_1,y_2,...y_n)Y(y1​,y2​,...yn​),定义两个向量在n维空间的切比雪夫距离为:
DistanceCheby=max⁡i(∣xi−yi∣)=lim⁡k−>∞(∑i=1n∣xi−yi∣k)1/kDistance_{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】中提到了两个缺点:

  1. 将各个分量的量纲(scale),也就是“单位”当作相同的看待了。
  2. 没有考虑各个分量的分布(期望,方差等)可能是不同的。

举一个小栗子,把一个向量循环移位之后的新向量与原向量比较,显式距离可能特别的大,那就说明这两个向量没有关系吗?

向量的隐式(归一化)距离

向量之间除了对标变量差异外,还需要考虑不对标的变量之间有什么联系,另外还要考虑量纲,分布的影响,这样normalize(归一化)后的距离统统归到隐式距离,这类问题经常用相似度similarity来取代normalized距离,毕竟二次处理,升华了,因为similarity亦或归一化距离的取值大都(-1,1)或者(0,1),所以可以将两者做简单的互换:
DistanceNormalized=1−similarityDistance_{Normalized} = 1 - similarity DistanceNormalized​=1−similarity

归一化欧氏距离 -Standardized Euclidean distance

假设向量X的均值(mean)为m,标准差(standard deviation)为s,那么X的“归一(标准)化变量”表示为:
X∗=X−msX^*=\frac{X-m}{s} X∗=sX−m​

那么再次假设一组向量集合,每个维度(下标)的向量X是独立(不相关)的,则求归一化后的向量的欧氏距离
DistanceS−eucli−n=∑i=1n(xi∗−yi∗)2=∑i=1n(xi−yisi)2Distance_{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​(si​xi​−yi​​)2​
其实这个公式是对数据集合同下标的变量做了归一化,感觉还是怪怪的,假设条件很重要。将每个维度方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(WeightedEuclidean distance)。​但多维向量不同维度之间往往是有联系的,所以这种归一化只是为了研究而已。

马氏距离-Mahalanobis Distance

上面的归一化欧氏距离实在太牵强,强行把各维度做归一化之后的空间特征肯定有了很大变化。马氏距离可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题,比归一化欧氏距离合理的多,也得到了很多应用。对于多维空间(协方差矩阵为SSS,均值向量为μ\muμ)两个维度相同的向量X(x1,x2,...xn)X(x_1,x_2,...x_n)X(x1​,x2​,...xn​)和Y(y1,y2,...yn)Y(y_1,y_2,...y_n)Y(y1​,y2​,...yn​),定义单个向量到μ\muμ的马氏距离为:
DistanceMahal=(X−μ)TS−1(X−μ)Distance_{Mahal}= \sqrt{(X-\mu)^TS^{-1}(X-\mu)} DistanceMahal​=(X−μ)TS−1(X−μ)​

定义两个向量在n维空间的马氏距离为:
DistanceMahal=(X−Y)TS−1(X−Y)Distance_{Mahal}= \sqrt{(X-Y)^TS^{-1}(X-Y)} DistanceMahal​=(X−Y)TS−1(X−Y)​
可以看出马氏距离较之归一化欧氏距离进步的地方就是用协方差矩阵代替了简单的方差,进而消除了变量之间相关性的干扰。如果各样本之间独立同分布,那么就变成了了标准欧拉距离:
Distanceeucli−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=cov(X,Y)σX,σY\rho_{X,Y}= \frac{cov(X,Y)}{\sigma_X,\sigma_Y} ρX,Y​=σX​,σY​cov(X,Y)​
皮尔逊相关系数有一个重要的数学特性是,因两个变量的位置和尺度的变化并不会引起该系数的改变。

余弦相似度-Cosine Similarity

两个向量间的余弦值可以通过使用欧几里得点积公式求出:
a⋅b=∣∣a∣∣⋅∣∣b∣∣cosθa \cdot b= ||a|| \cdot ||b|| cos\theta a⋅b=∣∣a∣∣⋅∣∣b∣∣cosθ
由此得出余弦夹角相似度
similaritycos=cosθ=a⋅b∣∣a∣∣⋅∣∣b∣∣=∑i=1n(xi∗yi)∑i=1n(xi)2∗∑i=1n(yi)2similarity_{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,定义它信息熵的通用表达
Entropy(X)=∑x∈X−p(x)⋅log⋅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是在某一类的概率,则可以写成下面的形式
Entropy(X)=∑i=1n−pi⋅log2⋅piEntropy(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散度的公式:
DKL(p∣∣q)=∑i=1npi⋅log⋅piqiD_{KL}(p||q)= \sum_{i=1}^n p_i\cdot log\cdot \frac{p_i}{q_i} DKL​(p∣∣q)=i=1∑n​pi​⋅log⋅qi​pi​​
DKLD_{KL}DKL​的值越小,表示q分布和p分布越接近。将上式log中的分号打开:
DKL(p∣∣q)=∑i=1npi⋅log2⋅pi−∑i=1npi⋅log⋅qiD_{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∑n​pi​⋅log2​⋅pi​−i=1∑n​pi​⋅log⋅qi​
第一项恰巧是信息熵的定义(在确定的训练集合里,这部分是常数),那么第二部分就是交叉熵的定义了:
CrossEntropy(X)=∑i=1n−pi⋅log2⋅qiCrossEntropy(X)= \sum_{i=1}^n -p_i\cdot log_2\cdot q_i CrossEntropy(X)=i=1∑n​−pi​⋅log2​⋅qi​
看看
DKL(p∣∣q)=CrossEntropy(X)−Entropy(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∩BA∪BJ(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

高维向量的相似度判定-距离产生了,美还在吗相关推荐

  1. 向量欧氏距离 点积 余弦相似度 余弦距离

    向量 A = (x1, y1),向量 B = (x2, y2) 向量欧式距离: 向量点积: 向量的模: 向量归一化:向量除以模长,也就是 A / |A| 向量余弦相似度:也相当于向量归一化后的点积 A ...

  2. 文本挖掘之文本相似度判定

    刘 勇   Email:lyssym@sina.com 简介 针对文本相似判定,本文提供余弦相似度和SimHash两种算法,并根据实际项目遇到的一些问题,给出相应的解决方法.经过实际测试表明:余弦相似 ...

  3. 文本挖掘之 文本相似度判定

    转载: 简介 针对文本相似判定,本文提供余弦相似度和SimHash两种算法,并根据实际项目遇到的一些问题,给出相应的解决方法.经过实际测试表明:余弦相似度算法适合于短文本,而SimHash算法适合于长 ...

  4. 13 种高维向量检索算法全解析!数据库顶会 VLDB 2021 论文作者干货分享

    编者按: 以图搜图.商品推荐.社交推荐等社会场景中潜藏了大量非结构化数据,这些数据被工程师们表达为具有隐式语义的高维向量.为了更好应对高维向量检索这一关键问题,杭州电子科技大学计算机专业硕士王梦召等人 ...

  5. 高维向量相似搜索插件 pgvector

    大模型爆火以后,持仓股票都卖飞了(捶自己),只能研究研究技术,来填补下心灵上的创伤. 正在用openai开放的接口做调试,用embedding接口来实现内容相似度检索,并用chatGPT生成答案,从目 ...

  6. 一个点到多边形顶点距离相同_走进高维空间——所有点之间的距离都相等!奇妙、疯狂、不可思议...

    欢迎来到高维系列的第三部分,在这里我们将探索高维空间中一些奇怪而不可思议的现象.这是走进高维空间系列的第三部分,感兴趣的朋友可以阅读前两个部分,在文章的末尾我会附上链接. 今天我们将探索一种现象,这种 ...

  7. python高维向量的可视化_Tensorboard教程:高维向量可视化

    Tensorflow高维向量可视化 觉得有用的话,欢迎一起讨论相互学习~ 参考文献 强烈推荐Tensorflow实战Google深度学习框架 实验平台: Tensorflow1.4.0 python3 ...

  8. 软件工程java向量相似度计算_向量的相似度计算常用方法9个

    <向量的相似度计算常用方法9个>由会员分享,可在线阅读,更多相关<向量的相似度计算常用方法9个(5页珍藏版)>请在人人文库网上搜索. 1.向量的相似度计算常用方法相似度的计算简 ...

  9. 相似度(距离计算)汇总

    1 前言 在数据挖掘中,我们经常需要计算样本之间的相似度(Similarity ),我们通常的做法是计算样本之间的距离,本文对 距离计算方法做以下总结. 2 距离计算方法 A 欧式距离Euclidea ...

最新文章

  1. python爬虫能干什么-Python爬虫可以做什么?
  2. android ImageSwitcher的使用
  3. 分析函数在数据分析中的应用
  4. [SDOI2016] 生成魔咒(后缀数组SA + st表 + set)动态不同子串个数
  5. 开启真我新格调 期待绚丽的未知
  6. 老码农:如何写出让自己满意的代码
  7. 前端学习(2835):小程序中使用less
  8. 计算机基本的应用是,计算机统考应用基础练习题
  9. 理解阻塞非阻塞与同步异步
  10. 12月第一周.COM增9.5万 .ASIA和.XXX现负增长
  11. MySQL-第十四篇事务管理
  12. 【数学建模】基于matlab GUI排队系统仿真【含Matlab源码 1253期】
  13. 利用jira-python及selenium完成jira的统计报表及日报的填写
  14. 001.UG_NX概述
  15. 本地视频做成html网页,使用HTML和JavaScript播放本地的媒体(视频音频)文件的方法...
  16. c语言方波生成程序,关于C#:在软件上生成方波以进行模拟输入/输出
  17. Cocos Creator入职学习日记——篇1(KeyWord:艺术字、渐变色、透明过渡特效)
  18. Win系统 - WIN10 更新后蓝牙音箱无法连接成 Stereo 模式(立体声)
  19. DOTA2无法找到有效的direct 3D
  20. Spring Cloud Gateway 3.1.3最新版中文手册官网2022

热门文章

  1. 黑苹果核心显卡clover驱动教程
  2. THREADED_EXECUTION
  3. 低度酒爆火背后:“轻松”成为酒饮新潮流
  4. android高德地图多个mark点击,Android ---------高德卫星地图绘制多个点和点的点击事件自定义弹窗...
  5. java产生随机英文名_Java之随机生成用户数据
  6. 【ELM回归预测】基于非洲秃鹫算法优化极限学习机预测附matlab代码
  7. 必应(bing)搜索跳转到百度解决方法
  8. PC谷歌浏览器测试手机端安卓、IOS网页
  9. vb.net 实现图片圆形渐变模糊
  10. android 支付宝微信原生以及HTML调用原生SDK