2012-04-10 100 views
1

雖然大多數問題都是基於相似性(pidgeonholes)對節點進行分組,但我想根據它們的接近度對節點進行分組。高效分組節點?

我有一個大型密集的節點集合 - 潛在的數百萬。屏幕上他們佔用一定的空間,所以他們可以被認爲是一個大小。

我想要做的是將這些節點有效地分組爲單個包含節點,無論是在處理時間還是在爲每個容器收集更多節點。

我目前的嘗試要麼太慢,要麼不工作,但都是基於我想到的同一個解決方案:通過取一個節點計算許多可能的容器,並且它是隨機的周圍節點,分組,然後選擇最有效的容器。

你的想法是什麼,並不是專門用於任何語言,但我將爲此使用PHP或JavaScript。

Edit 

我忘了提,節點將進行流的,所以它需要承擔無限節點,將它們放入容器,因爲他們來,創造新的容器,甚至根據需要進行刪除,高達數百萬容器。那將是最理想的。

回答

1

這個問題被稱爲聚類。您有一組節點和一個計算任意兩個節點之間距離的函數m。您現在搜索羣集,以便每個羣集內所有節點之間的所有距離總和最小。

有一些簡單的算法來做到這一點。例如,搜索k-Meansk-Medoid。這兩個與您的方法非常相似。更有效的版本是CLARANS算法[NH94]。我沒有找到任何好的消息來源,但你在這裏:

(德語)通常在聚類上的腳本。包含45頁 http://www.informatik.hu-berlin.de/forschung/gebiete/wbi/teaching/archive/ws1112/vl_datawarehousing/15_clustering_12.pdf

英文劇本上的僞代碼CLARANS解釋CLARANS http://bib.dbvis.de/uploadedFiles/232.pdf

紙約CLARANS http://www.comp.nus.edu.sg/~atung/publication/pakdd002.pdf

的 「K」 中的名稱是集羣的數量。對於這3種算法,您必須先確定聚類的數量。

有關其他方法,請參見DBSCAN算法。您不需要此算法的羣集數量,但您必須提供關於您的節點的其他一些知識。維基百科文章很好地解釋了這一點。 :-)

+1

我一直在使用術語羣集在我自己的代碼,這正是我想要的。感謝這些算法。我會看看他們,讓你知道他們是否合適的解決方案。 – DanRedux 2012-04-10 04:26:28

+0

看着這些算法,我設計了一個適用於我的算法,它是它們的混合。我將隨機放置我的「k」個容器,找到每個節點最近的容器,指這些組,並將容器移動到那裏,重複幾次。我需要改進的部分是循環。一些節點將超出範圍,我想知道是否有更快的方法來循環遍歷其他節點範圍內的節點。它將是密集的,但可能有非常稀疏的區域,並且節點超出範圍。 – DanRedux 2012-04-10 04:33:39

+0

你讀過關於DBSCAN的文章了嗎?這似乎是你想要的。 – Basti 2012-04-10 04:35:37