0

我正在尝试计算两个样本之间的相似性。我不满意的python函数sklearn.metrics.pairwise.cosine_similarity和 返回结果。scipy.spatial.distance.cosine例如:

  • 在下文中,我预计为 0.0%,因为这两个样本没有相同的样本。

     tt1 = [1, 16, 4, 21]
     tt2 = [5, 17, 3, 22]
    
     from scipy import spatial
     res = 1-spatial.distance.cosine(tt1, tt2)
     print(res)
     0.9893593529663931
    
  • 我预计会有 0.25% 的相似性,因为两个数组中只有一个样本,即第一个 (1) 样本是相同的。

     tt1 = [1, 16, 4, 21]
     tt2 = [1, 17, 3, 22]
    
     from scipy import spatial
     res = 1-spatial.distance.cosine(tt1, tt2)
     print(res)
     0.9990578001169402
    
  • 以同样的方式,我们有以下我预计预期为 0.5% 的情况。两个相同的样本(1 和 16)

     tt1 = [1, 16, 4, 21]
     tt2 = [1, 16, 3, 22]
     res = 0.9989359418266097
    
  • 这里预计为 0.75%。三个相同的样本(1、16 和 4)

     tt1 = [1, 16, 4, 21]
     tt2 = [1, 16, 4, 22]
     res = 0.9997474232272052
    

python有没有办法实现那些预期的结果?

4

3 回答 3

3

我认为您误解了该函数的计算内容。根据您的描述,您想计算错误分类错误/准确性。但是,该函数接收两个样本 u,v 并计算它们之间的余弦距离。在您的第一个示例中:

tt1 = [1, 16, 4, 21]
tt2 = [5, 17, 3, 22]

那么 u=tt1 和 v=tt2。两个数组的不同值是这些样本所在的向量空间(这里是 4 维空间)中的坐标 - 而不是不同的样本。请参阅功能文档,特别是底部的示例。

如果这些数组中的每个坐标代表一个不同的样本,那么:

  • 如果顺序很重要:(考虑使用 numpy 数组开始)

    np.mean(np.array(tt1) == np.array(tt2))
    
  • 如果顺序无关紧要:

     len(np.intersect1d(np.array(tt1), np.array(tt2))) / len(tt1)
    
于 2021-09-25T08:53:42.267 回答
0

这些向量在几何上非常接近。余弦相似度不仅衡量元素是否相同,还衡量它们的不同程度。

看起来你只是想要一个元素明智的匹配率?

sum([t1 == t2 for t1, t2 in zip(tt1, tt2)]) / len(tt1)
# or
np.equal(tt1, tt2).mean()
于 2021-09-25T08:52:55.050 回答
0

您可以numpy.intersect1d按照文档中的说明使用

这是我将如何使用示例 4#

import numpy as np 
tt1 = [1, 16, 4, 21]
tt2 = [1, 16, 4, 22]
res = len(np.intersect1d(tt1, tt2)) / ((len(tt1)+len(tt2))/2)
print(res)
于 2021-09-25T08:54:07.537 回答