我有一個我認爲需要直觀距離函數的聚類問題。每個實例都有一個x,y座標,但也有一組描述它的屬性(每個實例的編號不同)。理想情況下,可以將pythonobjects(類的實例)傳遞給它,並根據其內容任意比較它們。在Python中使用自定義距離函數的聚類算法
我想將距離表示爲x,y值之間的歐氏距離的加權總和以及像測量其他屬性的集合重疊一樣的jaccard索引。例如:
dist = (euclidean(x1, y1, x2, y2) * 0.6) + (1-jaccard(attrs1, attrs2) * 0.4)
我發現的大多數聚類算法和實現都將實例特徵轉換爲數字。例如,在sklearn中使用dbscan,爲了完成我的距離函數,我需要以某種方式將數字轉換回原始表示。
如果可以使用可以任意方式比較實例的距離函數進行聚類,那將是非常好的。例如,設想一個歐幾里得距離函數,如果它們與另一個非空間特徵相匹配,則該函數會將對象評估爲更近。
def dist(ins1, ins2):
euc = euclidean(ins1.x, ins1.y, ins2.x, ins2.y)
if ins1.feature1 == ins2.feature1:
euc = euc * 0.9
return euc
有沒有適合此方法的方法?如果羣集數量不必事先設置(但這對我來說並不重要),這也會很好。
謝謝!我完全忘了「預計算」模式。幸運的是O(n^2)的複雜性對我來說很好。 – user1478842