Рассчитать попарно симхаш "расстояния"
Я хочу построить матрицу попарных расстояний, где "расстояния" - это оценки сходства между двумя строками, как здесь реализовано. Я подумал об использовании парного метода 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
для подсказок о том, как это сделать.