初探DBSCAN聚类算法

Posted 山峰606

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探DBSCAN聚类算法相关的知识,希望对你有一定的参考价值。

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\')

以上是关于初探DBSCAN聚类算法的主要内容,如果未能解决你的问题,请参考以下文章

无监督学习DBSCAN聚类算法原理介绍,以及代码实现

深度解读 python 实现 dbscan算法

DBSCAN聚类算法

聚类算法--DBSCAN

DBSCAN 聚类算法无法正常工作。我究竟做错了啥?

DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式