Science上發表的簡單快速的聚類方法

2021-07-07 05:29:48 字數 1498 閱讀 9052

工作以後發現自己學習和研究的時間變得少得可憐。

我之所以對這個演算法感興趣,主要是因為看到**中可以識別那麼奇形怪狀的點簇,然後又只有兩個指標,好像很有道理又很好算的樣子。沒想到被坑慘了,我用了差不多兩個星期,偶爾下班後有時間看**、寫**,才把這個簡單的演算法實現下來。其中依然還有乙個引數需要手工調整,就是delta的閾值(下面有講)。

圖1 聚合點簇aggregation(共7個聚類,採用cut off kernel)

這個演算法,其實是對所有座標點,基於相互距離,提出了兩個新的屬性,一是區域性密度rho,即與該點距離在一定範圍內的點的總數,二是到更高密度點的最短距離delta。作者提出,類簇的中心是這樣的一類點:它們被很多點圍繞(導致區域性密度大),且與區域性密度比自己大的點之間的距離也很遠。

圖2 a sets(20個聚類,演算法分出19個,採用cut off kernel)

聚類過程,這篇文章講的還不錯,首先我們要把所有點的兩個屬性算出來,可以畫出乙個平面決策圖;根據決策圖,選出rho和delta都大的點作為聚類中心;選定中心後,讓周圍的點採取「跟隨」策略,歸類到密度比自己大的最近鄰居所在的簇。 我更想說的是兩點,第一點關於聚類中心的選擇,我翻看了幾篇文章(包括作者原文),都沒有明確指出乙個很好地自動確定中心數目的方法,較多的做法是畫出決策圖後進行人工選定範圍。我的做法是,按rho排序,然後根據決策圖人工對delta取乙個合適的值,大於這個delta值的,才能被選為中心。這種做法很人肉,讓我一直有沒完結的感覺,繼續探索一下有沒有自動確定這個閾值的方法。文章提及可以利用r = rho*delta 或者 rho和delta的聯合分布來進行分析判斷。但在實際應用中,卻不一定可以自動化。

圖3 火焰形狀(2個聚類,採用cut off kernel)

第二點是關於rho的計算,其實**中只提到乙個計算公式,是通過截斷距離做線性判斷,即rho=sigma(sign(dij-dc)),這個計算方法對一般的球狀簇,如圖1,圖2,有不錯的效果,而且計算快速,但是對圖3的異形圖(類簇形狀並不呈球狀分布),效果就不好了。這時候翻看作者給出的matlab原始碼,了解到還可以使用高斯核(gaussian kernel)函式來定義區域性密度,引入以後就完全handle了異形的問題,見圖4,我覺得高斯核函式確實是強大,對於這個問題,@範濤-中科大 給出的解釋是:「cut-off-函式是把小於dc的都看成一樣,而高斯核函式是根據距離衰減的。乙個節點周圍都是距離略小於dc的點(有點球狀感覺 ),和乙個節點周圍被距離呈衰減的點圍繞(類似火焰型資料),這個在cut-off函式算密度時候,兩種節點是不區分的,但是用高斯核函式算有區別,這就是為什麼火焰型資料高斯核函式相對更好點。」同樣的問題我也請教了邵俊明老師,他給出了這樣的解釋:「高斯核函式是從中心到外圍有權重的距離公式,因此比較適合計算球形狀的密度估計,當然只要能表明中心比區域性更重要的資料都可以用這個核函式。而歐式距離是沒有考慮權重的。即歐式距離是線性衰減的,而高斯核函式時指數衰減的。」說得我豁然開朗。

具體實現可以參看python**(兩種rho的計算都有)。

圖4 火焰形狀(2個聚類,採用gaussian kernel)

[code:flame_gaussiankernel.py]

Science發表的超讚聚類演算法

作者 alex rodriguez,alessandro laio 提出了一種很簡潔優美的聚類演算法,可以識別各種形狀的類簇,並且其超引數很容易確定.演算法思想 聚類過程 那些有著比較大的區域性密度 i和很大的 i的點被認為是類簇的中心.區域性密度較小但是 i較大的點是異常點.在確定了類簇中心之後,...

在Bristol JS上發表的關於超級布局的演講

上周三,我很榮幸在bristol js聚會小組與資深演講者,js whiz和網路音訊先驅 也是我的朋友!ruth john進行新的演講。露絲 ruth 在web workers和worklets上做了精彩的演講,其中包括lemmings和許多演示 這使我很高興學習更多關於css houdini和cs...

如何簡單快速除錯高大上的谷歌瀏覽器

所以.一切精妙的東西最終又歸結到原始碼上,直到我們了解它熟悉它。怎麼快速的的了解熟悉它呢?不外乎 點 大量的 閱讀 跟蹤除錯 今天我們就簡單的學習一下在ubuntu下簡單除錯chromium 首先我們必須弄個debug除錯版本在ubuntu上執行除錯。編譯步驟 1 build install bui...