Я пытаюсь найти лучший способ сравнить большие наборы числовых последовательностей с другими большими наборами, чтобы ранжировать их друг против друга. Может быть, следующий игрушечный пример проясняет проблему, где списки 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 наиболее похожих. Есть ли лучший подход, чем тот, что в игрушечном примере?