2015-09-06 46 views
4

我尋找一種有效的算法爲以下的問題之間的距離:有效的算法來在集羣組點由每兩個點

給定一組在二維空間,其中每個點由它的X和定義的點的Y座標。需要這組點分裂成一組集羣,使得如果兩個任意點之間的距離小於某一閾值,這些點必須屬於同一羣集:

sample clusters

換句話說,例如簇是一組相互「足夠接近」的點。

天真的算法是這樣的:

  1. [R是導致集羣名單,初始爲空
  2. P是點的列表,最初包含的所有點
  3. P中挑選隨機點並創建一個羣集C其中只包含這一點。從P 4a中刪除從P
  4. 這一點對於每一個點。對於每個點Pc from C 4aa。如果距離(PI,PC)<閾然後添加Ç和如果加入在步驟4到簇Ç的至少一個點從P集合中刪除它
  5. ,轉到步驟4
  6. 添加簇C至列表R。如果P不爲空,請轉至步驟3

但是,天真的方法效率非常低。我想知道這個問題是否有更好的算法?

P.S.我不知道集羣的數量先驗

+1

如果計算一個矩陣,其中[x] [y]位置是點x和點y之間的距離。然後,迭代它,以便如果距離小於閾值,則用1標記位置,否則爲0.現在我們有一個圖表,我們可以使用DFS或BFS來查找所有的聚類。它可能不是非常有效,但它將它減少到一個更容易的問題 – spyr03

+2

無論您選擇什麼方法,請確保您將距離平方'(x2 - x1)^ 2 +(y2 - y1)^ 2'與閾值平方進行比較,避免必須計算平方根。 – m69

+0

並考慮將這些點存儲在空間分區樹中。 – m69

回答

1
  1. 分手了點的空間劃分爲一個網格。這個網格的單位長度等於threshhold/sqrt(8)

  2. 通過迭代點列表P,將每個點添加到它佔據的平方和新簇。如果一個點被添加到已經包含點的正方形中,則將其添加到其他點的羣集中。我會打電話給所有佔用的方位列表S

  3. 立即採取任何方從小號和其羣集Ç。對於每個相鄰或對角線方塊,將該方塊的羣集與c組合起來,並從S中刪除方塊。對剛剛添加的所有方塊重複該過程。

  4. 一旦找不到更多相鄰的sqaures,則羣集已完成並可添加到C。用S中的任何剩餘方塊重複步驟3。當S爲空時,表示完成。

+0

這是不對的。網格可以幫助找到某個距離閾值內的點的候選對象,但它不能代替一個明確的檢查:任何網格的大小要麼足夠小,以致兩個點可能比閾值更接近,而不在相鄰/對角線的正方形中,或者足夠大兩個點可以在相鄰/對角線方格中,而不會比閾值更接近,或兩者都可以。 (你的問題是前者) – ruakh

+0

另外,由於「合併」兩個羣集的複雜性並不明顯,所以這對我來說並不明顯,這比OP的策略更快。 BFS或DFS佔用正方形可能更有意義。 – ruakh

+0

@ruakh這顯然不是最優的,但我認爲它比OP的解決方案更快,因爲它不需要檢查所有非集羣點的每個點。但是,我忽視了第一個問題。感謝您的評論 –

4

有一些經典算法在這裏:

  • 分層合併聚類
  • DBSCAN

,你應該閱讀和理解。