Рассчитать попарно симхаш "расстояния"

Я хочу построить матрицу попарных расстояний, где "расстояния" - это оценки сходства между двумя строками, как здесь реализовано. Я подумал об использовании парного метода sci-kit Learn, чтобы сделать это, как я использовал его раньше для других вычислений, и простое распараллеливание великолепно.

Вот соответствующий кусок кода:

def hashdistance(str1, str2):
    hash1 = simhash(str1)
    hash2 = simhash(str2)

    distance = 1 - hash1.similarity(hash2)

    return distance   


strings = [d['string'] for d in data]
distance_matrix = pairwise_distances(strings, metric = lambda u,v: hashdistance(u, v))

strings похоже ['foo', 'bar', 'baz'],

Когда я пытаюсь это, выдает ошибку ValueError: could not convert string to float, Это может быть очень глупо, но я не уверен, почему здесь должно произойти преобразование и почему возникает эта ошибка: анонимная функция в metric может взять строки и вернуть число с плавающей точкой; почему входные данные должны быть плавающими, и как я могу создать эту попарную матрицу расстояний, основанную на "расстояниях" simhash?

1 ответ

Решение

Согласно документации, только метрики из scipy.spatial.distance разрешены или могут быть вызваны из:

In [26]: sklearn.metrics.pairwise.pairwise_distance_functions
Out[26]:
{'cityblock': <function sklearn.metrics.pairwise.manhattan_distances>,
 'euclidean': <function sklearn.metrics.pairwise.euclidean_distances>,
 'l1': <function sklearn.metrics.pairwise.manhattan_distances>,
 'l2': <function sklearn.metrics.pairwise.euclidean_distances>,
 'manhattan': <function sklearn.metrics.pairwise.manhattan_distances>}

Одна проблема заключается в том, что если metric является callable затем sklearn.metrics.pairwise.check_pairwise_arrays пытается преобразовать входные данные в число с плавающей точкой, (scipy.spatial.distance.pdist делает что-то подобное, так что вам не повезло), таким образом, ваша ошибка.

Даже если бы вы могли передать вызываемый объект, он не очень хорошо масштабировался, поскольку цикл в pairwise_distances это чистый питон. Похоже, вам придется просто написать цикл самостоятельно. Я хотел бы предложить прочитать исходный код pdist и / или pairwise_distances для подсказок о том, как это сделать.

Другие вопросы по тегам