最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

更高效的Dbscan聚類算法

2022-04-14 21:20 作者:數(shù)學(xué)建模學(xué)習(xí)交流  | 我要投稿

在正課第10講中,我們介紹了常用的聚類算法:Kmeans聚類、系統(tǒng)聚類和Dbscan聚類。
其中,Dbscan聚類算法最為特殊,它是一種基于密度的聚類方法,聚類前不需要預(yù)先指定聚類的個(gè)數(shù),下圖來自我們的課件:


在課程的最后,我們給出了MATLAB實(shí)現(xiàn)Dbscan聚類的代碼,該代碼下載于MATLAB官網(wǎng):

https://ww2.mathworks.cn/matlabcentral/fileexchange/52905-dbscan-clustering-algorithm

該代碼中借助了pdist2函數(shù),該函數(shù)可用來計(jì)算兩組觀測值之間的成對距離。使用該函數(shù)計(jì)算時(shí),可能會有一個(gè)隱藏的問題:當(dāng)輸入矩陣X的行數(shù)特別大時(shí),MATLAB可能沒有足夠的內(nèi)存計(jì)算并報(bào)錯(cuò)。

例如,當(dāng)X的行數(shù)為20萬時(shí),D矩陣的大小為20萬乘以20萬,一般的計(jì)算機(jī)是無法在內(nèi)存中保存這么大的數(shù)據(jù)的。

因此,上面鏈接中給的代碼只能用于數(shù)據(jù)量不大的情況,如果數(shù)據(jù)量較多則無法借助一般的家用電腦完成計(jì)算。

那我們應(yīng)該如何解決這個(gè)問題呢?


從MATLAB2019版本開始,MATLAB強(qiáng)大的統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱中內(nèi)置了dbscan函數(shù),我們不需要下載第三方的代碼即可方便的使用dbscan算法進(jìn)行聚類,其調(diào)用的方法可在MATLAB官網(wǎng)找到:

https://ww2.mathworks.cn/help/stats/density-based-spatial-clustering.html

該內(nèi)置函數(shù)的使用方法和課堂上講解的DBSCAN函數(shù)非常類似,大家可以參考正課第10講。


該函數(shù)的核心代碼是閉源的,MATLAB官網(wǎng)也沒有介紹內(nèi)部是如何實(shí)現(xiàn)的,但我個(gè)人推測其內(nèi)部應(yīng)該用到了特殊的數(shù)據(jù)結(jié)構(gòu)來巧妙的節(jié)省內(nèi)存消耗,例如可能用到了并查集來合并多個(gè)類別。
經(jīng)過測試,該函數(shù)在面對幾十萬條數(shù)據(jù)時(shí)也能計(jì)算出聚類的結(jié)果,因此大家在面對大型數(shù)據(jù)的dbscan聚類問題時(shí)可以選用內(nèi)置的這個(gè)函數(shù),前提是你的MATLAB版本要高于2019且安裝好了統(tǒng)計(jì)與機(jī)器學(xué)習(xí)工具箱(?Statistics and Machine LearningToolbox)。下面我們舉一個(gè)小案例來使用該函數(shù)進(jìn)行聚類:
(1)在1至500的正方形網(wǎng)格點(diǎn)上隨機(jī)生成3000個(gè)點(diǎn),使用x和y分別表示這3000個(gè)點(diǎn)的橫縱坐標(biāo)。


這就是隨機(jī)生成的3000個(gè)點(diǎn)的橫縱坐標(biāo),例如第一個(gè)點(diǎn)的坐標(biāo)為(352,272),第二個(gè)點(diǎn)坐標(biāo)為(93,140),依次類推。

(2)畫出這三千個(gè)點(diǎn)的散點(diǎn)圖。



(3)對這三千個(gè)點(diǎn)進(jìn)行聚類,規(guī)則如下:將距離小于10的點(diǎn)聚成一類,例如A和B距離為8,則將A和B聚類一類,且該聚類具有傳遞性,假設(shè)C和B的距離為6.5,則C也和A、B歸于同一類。

從結(jié)果可以看出,最終一共分為了211類。(因?yàn)閿?shù)據(jù)是隨機(jī)生成的,你的結(jié)果可能和我的有所差異,這是正?,F(xiàn)象)
idx中保存了聚類的結(jié)果,它是一個(gè)長度為3000的向量,數(shù)值相同的位置表示該樣本處于相同的一類中。

例如我們可以找到第一類中包含的樣本,它們位于原樣本的第1行、第392行、第425行等共計(jì)26個(gè)樣本點(diǎn)。

另外,我們還可以求出每一個(gè)類別中包含的樣本點(diǎn)的個(gè)數(shù),這里需要借助MATLAB中分組求和的函數(shù):


結(jié)果顯示,第一個(gè)類別中包含26個(gè)樣本點(diǎn),第二個(gè)類別中包含334個(gè)樣本點(diǎn),依次類推。
當(dāng)然,你也可以按照樣本點(diǎn)的個(gè)數(shù)來對這些類別進(jìn)行排序:

結(jié)果表明,第6類中樣本點(diǎn)最多,有491個(gè)樣本點(diǎn);第二多的是第2類,有334個(gè)樣本點(diǎn);依次類推。

(4)對聚類的結(jié)果進(jìn)行可視化

這里我們用到了gcatter函數(shù),它能根據(jù)分類結(jié)果來繪制散點(diǎn)圖,但要注意的是,由于我們的類別太多,MATLAB內(nèi)置的顏色不足,因此可能有某些不同的類別使用的顏色也相同,因此下面我們可以考慮:每次隨機(jī)的取出k個(gè)類別畫圖,將其他的類別全部繪制為黑色:

注意,這是隨機(jī)取的k個(gè)類別(上圖k等于5),因此每次運(yùn)行的結(jié)果可能也不同,下圖是k取8時(shí)隨機(jī)生成的一個(gè)圖形,大家也可以自己測試完成。


更高效的Dbscan聚類算法的評論 (共 條)

分享到微博請遵守國家法律
马公市| 临西县| 友谊县| 和顺县| 昌宁县| 临猗县| 铜鼓县| 五家渠市| 琼海市| 万荣县| 松原市| 怀宁县| 济阳县| 紫金县| 皮山县| 棋牌| 敖汉旗| 台前县| 德钦县| 和田县| 邛崃市| 江陵县| 嘉义县| 嵩明县| 耒阳市| 吴江市| 洪江市| 乌拉特前旗| 峨山| 通河县| 称多县| 通榆县| 鹰潭市| 兖州市| 五峰| 根河市| 加查县| 囊谦县| 竹北市| 新龙县| 庆云县|