数据集中的成对比较

时间:2016-10-19 10:18:06

标签: python python-2.7 numpy scipy cosine-similarity

我的数据是18个向量,每个向量最多200个数字,但有些数字有5个或其他数字..组织为:

[2, 3, 35, 63, 64, 298, 523, 624, 625, 626, 823, 824]
[2, 752, 753, 808, 843]
[2, 752, 753, 843]
[2, 752, 753, 808, 843]
[3, 36, 37, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, ...]

我想在这组列表中找到最相似的那对。这些数字本身并不重要,它们也可能是字符串 - 一个列表中的二合一和另一个列表中的三个不可比较。

我正在寻找变量是否相同。例如,第二个列表与第4个列表完全相同,但只有1个变量与列表3不同。

此外,最好找到最相似的三元组或n类,但成对是第一个也是最重要的任务。

我希望我能够清楚地解决这个问题,但我很乐意提供任何人可能需要的更多信息!

我感觉它涉及numpy或scipy norm / cosine计算,但我不知道该怎么做,或者这是否是最好的方法。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用itertools生成成对比较。如果您只想要两个列表之间共享的项目,则可以使用set交叉点。使用您的示例:

import itertools

a = [2, 3, 35, 63, 64, 298, 523, 624, 625, 626, 823, 824]
b = [2, 752, 753, 808, 843]
c = [2, 752, 753, 843]
d = [2, 752, 753, 808, 843]
e = [3, 36, 37, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112]

data = [a, b, c, d, e]

def number_same(a, b):
    # Find the items which are the same
    return set(a).intersection(set(b))

for i in itertools.permutations([i for i in range(len(data) - 1)], r=2):
    print "Indexes: ", i, len(number_same(data[i[0]], data[i[1]]))

>>>Indexes  (0, 1) 1
Indexes  (0, 2) 1
Indexes  (0, 3) 1
Indexes  (1, 0) 1
Indexes  (1, 2) 4
Indexes  (1, 3) 5  ... etc 

这将给出两个列表之间共享的项目数,您可以使用此信息来定义哪两个列表是最佳对...