一种基于密度的聚类算法
他最大的优势是可以发现任意形状的聚类簇,而传统的聚类算法只能使用凸的样本聚集类
邻域半径R和最少点数目minpoints。
当邻域半径R内的点的个数大于最少点数目minpoints时,就是密集。
补充:根据经验计算半径R
根据得到的所有点的k-距离集合E,对集合E进行升序排序后得到k-距离集合E’,需要拟合一条排序后的E’集合中k-距离的变化曲线图,然后绘出曲线,通过观察,将急剧发生变化的位置所对应的k-距离的值,确定为半径Eps的值。
邻域半径R内样本点的数量大于等于minpoints的点叫做核心点。不属于核心点但在某个核心点的邻域内的点叫做边界点。既不是核心点也不是边界点的是噪声点。
官方文档 <---
生成样本点
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')