自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python密度聚類算法-DBSCAN實踐

開發(fā) 后端 算法
去年學(xué)聚類算法的R語言的時候,有層次聚類、系統(tǒng)聚類、K-means聚類、K中心聚類,最后呢,被DBSCAN聚類算法迷上了。

本文主要內(nèi)容:

  1. 前言
  2. DBSCAN聚類算法
  3. 參數(shù)選擇
  4. DBSCAN算法迭代可視化展示
  5. 常用評估方法:輪廓系數(shù)
  6. 用Python實現(xiàn)DBSCAN聚類算法

一、前言

去年學(xué)聚類算法的R語言的時候,有層次聚類、系統(tǒng)聚類、K-means聚類、K中心聚類,最后呢,被DBSCAN聚類算法迷上了。

為什么呢,首先它可以發(fā)現(xiàn)任何形狀的簇,其次我認(rèn)為它的理論也是比較簡單易懂的,今年在python這門語言上我打算好好研究DBSCAN。

下面貼上它的官方解釋:

  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基于密度的聚類方法)是一種基于密度的空間聚類算法。
  • 該算法將具有足夠密度的區(qū)域劃分為簇,并在具有噪聲的空間數(shù)據(jù)庫中發(fā)現(xiàn)任意形狀的簇,它將簇定義為密度相連的點的最大集合。

二、DBSCAN聚類算法

文字描述不好懂,先看下面這個圖:

 

Python密度聚類算法-DBSCAN實踐

上面這些點是分布在樣本空間的眾多樣本,現(xiàn)在我們的目標(biāo)是把這些在樣本空間中距離相近的聚成一類。

我們發(fā)現(xiàn)A點附近的點密度較大,紅色的圓圈根據(jù)一定的規(guī)則在這里滾啊滾,最終收納了A附近的5個點,標(biāo)記為紅色也就是定為同一個簇。

其它沒有被收納的根據(jù)一樣的規(guī)則成簇。

形象來說,我們可以認(rèn)為這是系統(tǒng)在眾多樣本點中隨機(jī)選中一個,圍繞這個被選中的樣本點畫一個圓,規(guī)定這個圓的半徑以及圓內(nèi)最少包含的樣本點,如果在指定半徑內(nèi)有足夠多的樣本點在內(nèi),那么這個圓圈的圓心就轉(zhuǎn)移到這個內(nèi)部樣本點,繼續(xù)去圈附近其它的樣本點,類似傳銷一樣,繼續(xù)去發(fā)展下線。

等到這個滾來滾去的圈發(fā)現(xiàn)所圈住的樣本點數(shù)量少于預(yù)先指定的值,就停止了。那么我們稱最開始那個點為核心點,如A,停下來的那個點為邊界點,如B、C,沒得滾的那個點為離群點,如N)。

基于密度這點有什么好處呢?

我們知道kmeans聚類算法只能處理球形的簇,也就是一個聚成實心的團(tuán)(這是因為算法本身計算平均距離的局限)。但往往現(xiàn)實中還會有各種形狀,比如下面兩張圖,環(huán)形和不規(guī)則形,這個時候,那些傳統(tǒng)的聚類算法顯然就悲劇了。

于是就思考,樣本密度大的成一類唄,這就是DBSCAN聚類算法。

 

Python密度聚類算法-DBSCAN實踐

三、參數(shù)選擇

上面提到了紅色圓圈滾啊滾的過程,這個過程就包括了DBSCAN算法的兩個參數(shù),這兩個參數(shù)比較難指定,公認(rèn)的指定方法簡單說一下:

半徑:半徑是最難指定的 ,大了,圈住的就多了,簇的個數(shù)就少了;反之,簇的個數(shù)就多了,這對我們最后的結(jié)果是有影響的。我們這個時候K距離可以幫助我們來設(shè)定半徑r,也就是要找到突變點,比如: 以上雖然是一個可取的方式,但是有時候比較麻煩 ,大部分還是都試一試進(jìn)行觀察,用k距離需要做大量實驗來觀察,很難一次性把這些值都選準(zhǔn)。

MinPts:這個參數(shù)就是圈住的點的個數(shù),也相當(dāng)于是一個密度,一般這個值都是偏小一些,然后進(jìn)行多次嘗試

四、DBSCAN算法迭代可視化展示

國外有一個特別有意思的網(wǎng)站,它可以把我們DBSCAN的迭代過程動態(tài)圖畫出來。

 

Python密度聚類算法-DBSCAN實踐

網(wǎng)址:naftaliharris[1]

 

Python密度聚類算法-DBSCAN實踐

設(shè)置好參數(shù),點擊GO! 就開始聚類了!

五、常用評估方法:輪廓系數(shù)

這里提一下聚類算法中最常用的評估方法——輪廓系數(shù)(Silhouette Coefficient):

 

Python密度聚類算法-DBSCAN實踐

計算樣本i到同簇其它樣本到平均距離ai,ai越小,說明樣本i越應(yīng)該被聚類到該簇(將ai稱為樣本i到簇內(nèi)不相似度);

計算樣本i到其它某簇Cj的所有樣本的平均距離bij,稱為樣本i與簇Cj的不相似度。定義為樣本i的簇間不相似度:bi=min(bi1,bi2,...,bik2);

說明:

  • si接近1,則說明樣本i聚類合理;
  • si接近-1,則說明樣本i更應(yīng)該分類到另外的簇;
  • 若si近似為0,則說明樣本i在兩個簇的邊界上;

六、用Python實現(xiàn)DBSCAN聚類算法

導(dǎo)入數(shù)據(jù):

  1. import pandas as pd 
  2. from sklearn.datasets import load_iris 
  3. # 導(dǎo)入數(shù)據(jù),sklearn自帶鳶尾花數(shù)據(jù)集 
  4. iris = load_iris().data 
  5. print(iris) 

輸出:

 

Python密度聚類算法-DBSCAN實踐

使用DBSCAN算法:

  1. from sklearn.cluster import DBSCAN 
  2.  iris_db = DBSCAN(eps=0.6,min_samples=4).fit_predict(iris) 
  3. # 設(shè)置半徑為0.6,最小樣本量為2,建模 
  4. db = DBSCAN(eps=10, min_samples=2).fit(iris) 
  5.   
  6. # 統(tǒng)計每一類的數(shù)量 
  7. counts = pd.value_counts(iris_db,sort=True
  8. print(counts) 

 

Python密度聚類算法-DBSCAN實踐

可視化:

  1. import matplotlib.pyplot as plt 
  2. plt.rcParams['font.sans-serif'] = [u'Microsoft YaHei'
  3.  
  4. fig,ax = plt.subplots(1,2,figsize=(12,12)) 
  5.  
  6. # 畫聚類后的結(jié)果 
  7. ax1 = ax[0] 
  8. ax1.scatter(x=iris[:,0],y=iris[:,1],s=250,c=iris_db) 
  9. ax1.set_title('DBSCAN聚類結(jié)果',fontsize=20) 
  10.  
  11. # 畫真實數(shù)據(jù)結(jié)果 
  12. ax2 = ax[1] 
  13. ax2.scatter(x=iris[:,0],y=iris[:,1],s=250,c=load_iris().target) 
  14. ax2.set_title('真實分類',fontsize=20) 
  15. plt.show() 

 

Python密度聚類算法-DBSCAN實踐

我們可以從上面這個圖里觀察聚類效果的好壞,但是當(dāng)數(shù)據(jù)量很大,或者指標(biāo)很多的時候,觀察起來就會非常麻煩。

這時候可以使用輪廓系數(shù)來判定結(jié)果好壞,聚類結(jié)果的輪廓系數(shù),定義為S,是該聚類是否合理、有效的度量。

聚類結(jié)果的輪廓系數(shù)的取值在[-1,1]之間,值越大,說明同類樣本相距越近,不同樣本相距越遠(yuǎn),則聚類效果越好。

輪廓系數(shù)以及其他的評價函數(shù)都定義在sklearn.metrics模塊中,在sklearn中函數(shù)silhouette_score()計算所有點的平均輪廓系數(shù)。

  1. from sklearn import metrics   
  2. # 就是下面這個函數(shù)可以計算輪廓系數(shù)(sklearn真是一個強大的包) 
  3. score = metrics.silhouette_score(iris,iris_db)  
  4. score 

結(jié)果: 0.364

責(zé)任編輯:未麗燕 來源: 今日頭條
相關(guān)推薦

2020-05-13 15:57:59

聚類分析算法監(jiān)督學(xué)習(xí)

2024-08-08 12:33:55

算法

2018-05-28 15:33:09

無監(jiān)督學(xué)習(xí)算法Python

2023-11-26 18:26:26

聚類評價指標(biāo)監(jiān)督學(xué)習(xí)

2024-10-18 17:14:13

2018-04-16 12:14:34

數(shù)據(jù)科學(xué)機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2017-05-15 11:10:10

大數(shù)據(jù)聚類算法

2022-07-29 10:31:33

算法Python

2023-10-31 09:00:00

2014-07-02 10:34:08

聚類算法算法

2022-05-17 09:14:50

聚類算法python

2011-07-25 15:39:49

SQL SERVER數(shù)聚類算法順序聚類算法

2011-07-26 10:16:14

SQL Server數(shù)據(jù)挖掘

2023-04-02 14:16:45

凸集算法集合

2023-05-10 08:00:00

聚類分析數(shù)據(jù)分析聚類算法

2019-10-12 10:11:02

數(shù)據(jù)集聚類算法

2017-04-05 09:20:14

聚類算法機(jī)器學(xué)習(xí)大數(shù)據(jù)

2017-04-07 13:00:49

機(jī)器學(xué)習(xí)大數(shù)據(jù)聚類算法

2023-12-01 16:27:05

機(jī)器學(xué)習(xí)無監(jiān)督學(xué)習(xí)

2022-03-03 19:52:25

聚類算法D2CDBSCAN
點贊
收藏

51CTO技術(shù)棧公眾號