2017-08-01 69 views
0

我想使用sklearn中的DBSCAN實現。它們允許您使用自定義距離度量標準,但只能使用一個eps值。 我想要的是以下內容:sklearn中的多個eps值DBSCAN

可以說我的點每個都有3個特徵,所以每個點都可以被認爲是p=np.array([p1,p2,p3])形式的一個numpy數組。如果np.abs(p1-q1) < eps1np.abs(p2-q2) < eps2np.abs(p3-q3) < eps3兩點pq是鄰居。通常,可以使用d(p,q)<eps,其中d(,)是度量標準,eps是閾值。

有沒有一種方法可以輕鬆地將我的需求轉化爲sklearn?

回答

1

您可以適當縮放,然後使用最高標準。

p = p * [1/eps1, 1/eps2, 1/eps3] 

c = sklearn.cluster.DBSCAN(eps=1, metric="chebyshev", ...) 

注意DBSCAN使用<=<

或者您預先計算了一個二元「距離」矩陣,其中如果三個條件成立,則距離爲0,否則爲1。但是這需要O(n²)內存。

+0

這個距離矩陣在我的情況下是稀疏的。有沒有一種方法可以利用它來減少內存使用量?但是你的擴展想法很漂亮!謝謝! – Merlin1896

+1

由於0.17 sklearn可以使用稀疏距離矩陣。但要小心,你需要存儲0,然後,而不是1。缺失的值被認爲是無限的。如果上述縮放方法比稀疏矩陣快,我不會感到驚訝。 –

+0

在[ELKI](https://elki-project.github.io/)中,您可以定義一個距離函數 - 並獲得索引加速 - 而無需事先加權hack(本質上,請遵循[本教程](https:// elki-project.github.io/tutorial/spatial_distance_functions)加權距離)。但即使如此,先前的權重可能比在每個距離計算上應用權重稍快。 –