2013-08-30 101 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的源代碼,以獲取有關如何執行此操作的提示。