常用度量方法
度量两个文本的相似度,或者距离,可以有很多方法,余弦夹角只是一种。本文简单列了一下常用的距离。
需要注意的是,本文中列的方法,有的是距离,也就是指越小越相似,有的是相似度,值越大越相似。
在 Python 的距离包 pairwise_distances
中,统一处理成了距离,即都是值越小,则距离越小、越相似。
本文中统一用下面两个文本作为例子:
text1 = '上海市市级科技重大专项’
text2 = '上海市国家级科研重大项目'
将2个进行分词,选取词维度有:
(上海市, 市级, 国家级, 科技, 科研, 重大, 专项, 项目)
x = (1, 1, 0, 1, 0, 1, 1, 0)
y = (1, 0, 1, 0, 1, 1, 0, 1)
OK,下面结合这个例子,具体介绍下各种距离:
1. 闵氏距离(Minkowski distance)
设 n 维空间中有两点坐标 x, y,p 为常数,闵式距离定义为:
注意:
- 闵氏距离与特征参数的量纲有关,有不同量纲的特征参数的闵氏距离常常是无意义的。
-
闵氏距离没有考虑特征参数间的相关性。
2. 曼哈顿距离(Manhattan distance)
作为闵可夫斯基距离的一种特例,当p=1时,得到绝对值距离,也叫曼哈顿距离、出租汽车距离或街区距离。在二维空间中可以看出,这种距离是计算两点之间的直角边距离。
图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。
3. 欧氏距离(Euclidean distance)
当p=2时,得到欧几里德距离,就是两点之间的直线距离。欧氏距离中各特征参数是等权的。
4. 切比雪夫距离(Chebyshev Distance)
当,得到切比雪夫距离。
数学上,切比雪夫距离或是度量是向量空间中的一种度量,二个点之间的距离定义为其各座标数值差的最大值。以(x1,y1)和(x2,y2)二点为例,其切比雪夫距离为切比雪夫距离得名自俄罗斯数学家切比雪夫。
5. 马氏距离(Mahalanobis Distance)
马氏距离(Mahalanobis Distance)表示数据的 协方差距离
。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度。
马氏距离有很多优点,马氏距离不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。它的缺点是夸大了变化微小的变量的作用。
6. 海明距离(Hamming Distance)
海明距离为两串向量中,对应元素不一样的个数,比如101010与101011的最后一位不一样,那么hamming distance即为1,,同理000与111的hamming为3。
但这没有考虑到向量的长度,如111111000与111111111的距离也是3,尤其是比较文本的相似时,这样的结果肯定不合理,因此我们可以用向量长度作为分母。Python 中的 hamming distance 即这么计算的。
海明距离也是值越小越相似。但除以长度之后的海明距离,最大值为1(完全不相似),最小值为0(完全一致)。
7. 杰卡德距离(Jaccard Distance)
比如本例中的两个文本:
text1 = '上海市市级科技重大专项’ → {上海市, 市级, 科技, 重大, 专项 }
text2 = '上海市国家级科研重大项目' → {上海市, 国家级, 科研, 重大, 项目}
交集有2个(上海市,重大),并集有8个。
因此Jaccard系数为:1/4。
转化成向量计算,其实跟 hamming 距离是一样的,都是对应元素相同的个数,除以向量的个数。