我正在研究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
答案 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
使用可选参数rtol
和atol
,以便您可以分别指定要使用的相对或绝对容差。 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。