2014-06-05 162 views
2

我有一組要點。它們的幾何(SRID:4326)存儲在數據庫中。 我已經給出了一個代碼,旨在將這些點與DBSCAN進行聚類。參數設置如下:eps = 1000,min_points = 1。DBSCAN的參數eps,python

我獲得的距離不到1000米。我相信距離不到1000米的兩個點屬於同一個簇。 epsilon真的是米嗎?

的代碼如下:

self.algorithm='DBSCAN' 
    X=self.data[:,[2,3]] 
    if self.debug==True: 
     print 'Nbr of Points: %d'% len(X) 
    # print X.shape 
    # print dist_matrix.shape 
    D = distance.squareform(distance.pdist(X,'euclidean')) 
    # print dist_matrix 
    # S = 1 - (D/np.max(D)) 
    db = DBSCAN(eps, min_samples).fit(D) 
    self.core_samples = db.core_sample_indices_ 
    self.labels = db.labels 

目的不是要找到另一種方式來運行它,但真正瞭解EPS的價值。它代表的是距離。 Min_sample被設置爲1,因爲我接受確實具有1個樣本大小的聚類。

+1

請勿使用「euclidean」。您的數據不在歐幾里德向量空間中。在歐洲和美國的大部分地區,距離將被扭曲30%以上(而且北方更嚴重);而歐幾里得距離不了解座標系的-180°環繞。還要避免計算距離矩陣,這需要'O(n^2)'內存和運行時間。使用索引加速來快速找到鄰居。 –

回答

2

這取決於您的實施

您的距離函數可能返回任何東西;包括米,毫米,碼,公里,英里,度......但你沒有分享你用於計算距離的功能! 如果我沒有弄錯,SRID: 4326並不意味着任何距離計算。

sklearn使用的"haversine"似乎使用,而不是米。

無論哪種方式,min_points=1是荒謬的。包含查詢點,所以每個點本身都是一個集羣。使用min_points <= 2,DBSCAN的結果將是單鏈接聚類。要獲得基於密度的聚類,您需要選擇一個更高的值來獲得真實密度。

您可能需要使用ELKI的DBSCAN。根據他們的Java源代碼,他們的距離函數使用儀表,而且他們的R * -tree索引允許加速範圍查詢與這個距離,這將產生加速()而不是O(n^2)