用python获取两个数字的相似性

时间:2014-09-29 22:30:41

标签: python

我正在研究Case-Based Reasoning algorithms,我需要得到两个数字(整数或浮点数)的相似性。

对于字符串我使用Levenshtein lib并且处理得很好,但我不知道任何Python lib来计算两个数字的相似性,那里有一个? 有谁知道? 结果应该在0(不同)和1(完全匹配)之间,如Levenshtein.ratio()

@ UPDATE1:

使用Levenshtein.ratio我们得到两个字符串的相似性比率,0表示完全不同,1个完全匹配,0和1之间的任何一个是相似性的系数。 例如:

>>> import Levenshtein
>>> Levenshtein.ratio("This is a test","This is a test with similarity")
0.6363636363636364
>>> Levenshtein.ratio("This is a test","This is another test")
0.8235294117647058
>>> Levenshtein.ratio("This is a test","This is a test")
1.0
>>> 

我需要这样的东西,但有数字。 例如,5与6具有n%的相似性。数字5.4与5.8具有n%的相似性。 我不知道我的例子是否清楚。

@update 2:

让我举一个真实的例子。让我们说我正在100个服务器上寻找类似版本的CentOS Linux发行版。 CentOS Linux版本号类似于5.6,5.7,6.5。那么,5.7的数字是多少接近6.5?它不是那么接近,我们之间有很多版本(数字)。但是有一个相似系数,让我们说40%(或0.4)使用像Levenshtein这样的相似算法。

@update 3: 我得到了问题的答案。我发布在这里是为了帮助更多人:

>>> sum = 2.4 * 2.4
>>> sum2 = 7.5 * 7.5
>>> sum /math.sqrt(sum*sum2)
0.32
>>> sum = 7.4 * 7.4
>>> sum /math.sqrt(sum*sum2)
0.9866666666666666
>>> sum = 7.5 * 7.5
>>> sum /math.sqrt(sum*sum2)
1.0

2 个答案:

答案 0 :(得分:1)

在链接中,我看到Ian Watson的幻灯片显示了三种评估相似性的选项"数字。其中," step function"可以从numpy

轻松获得选项
In [1]: from numpy import allclose

In [2]: a = 0.3 + 1e-9

In [3]: a == 0.3
Out[3]: False

In [4]: allclose(a, 0.3)
Out[4]: True

要获得相似性所需的数字输出,我们进行一项更改:

In [5]: int(a == 0.3)
Out[5]: 0

In [6]: int(allclose(a, 0.3))
Out[6]: 1

如果愿意,可以使用float代替int

In [8]: float(a == 0.3)
Out[8]: 0.0

In [9]: float(allclose(a, 0.3))
Out[9]: 1.0

allclose使用可选参数rtolatol,以便您可以分别指定要使用的相对或绝对容差。 allclose的完整文档为here

答案 1 :(得分:1)

为了计算两个数字(浮点数或整数)的相似度,我写了一个简单的函数

def num_sim(n1, n2):
  """ calculates a similarity score between 2 numbers """
  return 1 - abs(n1 - n2) / (n1 + n2)

如果它们完全相等,它只会返回 1。由于数字的值不同,它将变为 0。