2013-08-30 70 views
1

我想要构造一个成对距离矩阵,其中“距离”是实现here时两个字符串之间的相似度分数。我正在考虑使用sci-kit learn的成对距离方法来做到这一点,因为我之前已经使用它来进行其他计算,并且容易的并行化非常棒。计算成对simhash“距离”

下面是相关的代码:

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'距离'的成对距离矩阵?

回答

4

the documentation,仅从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>} 

的一个问题是,如果metriccallable然后sklearn.metrics.pairwise.check_pairwise_arrays尝试输入浮动转换,(scipy.spatial.distance.pdist做类似的东西,所以你的运气不好),因此你的错误。

即使你可能传递可调用它不会很好地扩展,因为pairwise_distances中的循环是纯Python。看起来你必须自己编写循环。我建议您阅读pdist和/或pairwise_distances的源代码,以获取有关如何执行此操作的提示。