Опитвам се да намеря най-добрия начин да сравня големи набори от числови последователности с други големи набори, за да ги класирам един спрямо друг. Може би следният пример за играчка изяснява проблема, където списъците a, b и c представляват херпес зостер с размер 3 във времеви серии.
a = [(1,2,3),(2,3,4),(3,4,5)]
b = [(1,2,3),(2,3,4),(3,4,7),(4,7,8)]
c = [(1,2,3),(2,3,5)]
set_a, set_b, set_c = set(a), set(b), set(c)
jaccard_ab = float(len(set_a.intersection(set_b)))/float(len(set_a.union(set_b)))
jaccard_bc = float(len(set_b.intersection(set_c)))/float(len(set_b.union(set_c)))
jaccard_ac = float(len(set_a.intersection(se t_c)))/float(len(set_a.union(set_c)))
Приликата между тези комплекти е:
jaccard_ab, jaccard_bc, jaccard_ac
(0.4, 0.2, 0.25)
Така че в този пример можем да видим, че набор a и b са най-сходни с резултат 0,4.
Имам проблем с дизайна: 1) Тъй като всеки набор ще бъде съставен от ~1000 керемиди, печеля ли скорост, като трансформирам всяка шингла в уникален хеш и след това сравнявам хешовете? 2) Първоначално имам над 10 000 комплекта за сравнение, така че смятам, че е много по-добре да съхранявам керемидите (или хешовете, в зависимост от отговора на 1) в база данни или да ецвам. Това добър подход ли е? 3) Тъй като нов набор се добавя към моя работен процес, трябва да го класирам спрямо всички съществуващи набори и да покажа, да кажем, първите 10 най-сходни. Има ли по-добър подход от този в примера с играчката?