如何将向量之间的欧几里得距离转换为相似度分数。

3

以下是我用于计算向量之间欧几里得距离的代码,以及我的转换后数据集(向量)的一部分示例。

import itertools
import numpy as np

vect=[[2, 1, 1, 1, 1, 3, 4, 2, 5, 1],
 [1, 5, 2, 1, 1, 1, 1, 1, 1, 2],
 [2, 1, 1, 1, 2, 1, 1, 1, 1, 1]]

for u1, u2 in itertools.combinations(vect, 2):
    x = np.array(u1)
    y = np.array(u2)
    space = np.linalg.norm(y - x)
    print space

向量之间的欧几里得距离为:
7.0
5.56776436283
4.472135955

我的目标是计算向量之间的相似度,并为每个比较输出一个相似度分数。典型的相似度分数介于0和1之间,其中0表示不相似,1表示完全相似。问题在于如何将欧几里得距离转换为相似度分数?有人建议使用以下公式:1/1+d(P1, P2),即欧几里得距离的倒数=相似度分数。您有什么建议吗?谢谢。

建议不起作用吗? - sihrc
我理解这个想法,但我还没有尝试过。我只是希望能有更好的想法存在。 - Tiger1
2
这真的取决于你如何定义相似性。(-1, -1) 是否比 (1000, 0) 更类似于 (5, 2) 而不是 (1007, 0)?如果是这样,距离信息就不足够了。此外,这也取决于你将用这些信息做什么以及你的规模要求是什么。 - user2357112
如果是这样,就执行;如果不是,就不执行(太晚编辑注释了)。 - user2357112
1
@user2357112,我的规模要求是0-1,并且这些信息将用于衡量文档的相似性。(1000,0)和(1007,0)应该比(-1,-1)和(5,2)更相似。欧几里得距离的较高值应该反映出比较低值时的较小相似性。 - Tiger1
1个回答

2

有很多相似度量可以使用。正如user2357112所说,最好的选择取决于您的应用程序。我建议看一下这里列出的一些内核:

http://crsouza.blogspot.co.uk/2010/03/kernel-functions-for-machine-learning.html

在我的应用中,我发现卡方内核是一个很好的默认选择 - 特别是如果向量是直方图。

如果您有一部分数据,已经知道您希望它们彼此相似,我建议尝试一些不同的内核,并绘制这些样本之间的相似性矩阵的结果(如果您有100个测试样本,则会获得一个100x100的相似性矩阵,您可以使用matplotlib.pyplot中的imshow方法简单地绘制为热力图)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接