初探DBSCAN聚類演算法

山峰606發表於2021-05-22

DBSCAN介紹

一種基於密度的聚類演算法
他最大的優勢是可以發現任意形狀的聚類簇,而傳統的聚類演算法只能使用凸的樣本聚集類

兩個引數:

鄰域半徑R和最少點數目minpoints。
當鄰域半徑R內的點的個數大於最少點數目minpoints時,就是密集。

補充:根據經驗計算半徑R
根據得到的所有點的k-距離集合E,對集合E進行升序排序後得到k-距離集合E’,需要擬合一條排序後的E’集合中k-距離的變化曲線圖,然後繪出曲線,通過觀察,將急劇發生變化的位置所對應的k-距離的值,確定為半徑Eps的值。

3種點的類別:核心點,邊界點和噪聲點。

鄰域半徑R內樣本點的數量大於等於minpoints的點叫做核心點。不屬於核心點但在某個核心點的鄰域內的點叫做邊界點。既不是核心點也不是邊界點的是噪聲點。

sklearn例項

官方文件 <---

生成樣本點

import numpy as np
import pandas as pd
from sklearn import datasets
%matplotlib inline

X,_ = datasets.make_moons(500,noise = 0.1,random_state=1)
df = pd.DataFrame(X,columns = ['feature1','feature2'])
df.plot.scatter('feature1','feature2', s = 100,alpha = 0.6, title = 'dataset by make_moon')

呼叫dbscan介面完成聚類

from sklearn.cluster import dbscan

# eps為鄰域半徑,min_samples為最少點數目
core_samples,cluster_ids = dbscan(X, eps = 0.2, min_samples=20) 
# cluster_ids中-1表示對應的點為噪聲點

df = pd.DataFrame(np.c_[X,cluster_ids],columns = ['feature1','feature2','cluster_id'])
df['cluster_id'] = df['cluster_id'].astype('i2')

df.plot.scatter('feature1','feature2', s = 100,
    c = list(df['cluster_id']),cmap = 'rainbow',colorbar = False,
    alpha = 0.6,title = 'DBSCAN cluster result')

自己改的例子,比較好理解

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
%matplotlib inline

#生成資料
X=np.empty((100,2))
X[:,0]=np.random.uniform(0.,100.,size=100)
X[:,1]=0.75*X[:,0]+3+np.random.normal(0,10,size=100)
plt.scatter(X[:,0],X[:,1])
plt.show()
df=pd.DataFrame(X,columns=['feature1','feature2'])
df.plot.scatter('feature1','feature2')
print(df)

#呼叫DBSCAN介面完成聚類
from sklearn.cluster import dbscan
# eps為鄰域半徑,min_samples為最少點數目
core_samples,cluster_ids = dbscan(X, eps = 10, min_samples=3) 
df = pd.DataFrame(np.c_[X,cluster_ids],columns = ['feature1','feature2','cluster_id'])
# df['cluster_id'] = df['cluster_id'].astype('i2')   #這個有啥用啊
df.plot.scatter('feature1','feature2', s = 100,
    c = list(df['cluster_id']),cmap = 'rainbow',colorbar = False,
    alpha = 0.6,title = 'DBSCAN cluster result')

相關文章