当前位置: 首页 > 科技观察

Python密度聚类算法-DBSCAN实践_0

时间:2023-03-18 11:24:40 科技观察

本文主要内容:前言DBSCAN聚类算法参数选择DBSCAN算法迭代可视化展示常用评价方法:剪影系数用Python实现DBSCAN聚类算法1.前言去年学习聚类算法在R说到语言,有层次聚类,系统聚类,K-means聚类,K-center聚类,最后,迷上了DBSCAN聚类算法。为什么呢,首先它可以找到任何形状的簇,其次我觉得它的理论比较简单易懂。今年打算用python语言学习DBSCAN。下面贴上它的官方解释:DBSCAN(Density-BasedSpatialClusteringofApplicationswithNoise,一种基于密度的噪声聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为聚类,并在嘈杂的空间数据库中发现任意形状的聚类,该聚类将聚类定义为密度连接点的最大集合。2、DBSCAN聚类算法的文字描述不太好理解。先看下图:上面的点是分布在样本空间中的很多样本。现在我们的目标是将样本空间中距离相近的这些样本归为一类。我们发现A点附近的点密度比较高,红圈按照一定的规律在这里滚动滚动。最后收集到A点附近的5个点,标记为红色表示它们被指定为同一个簇。其他未包括在内的按相同规则聚类。形象地讲,我们可以认为这是系统从众多样本点中随机选择一个,围绕选中的样本点画一个圆,指定圆的半径和圆内包含的最少的样本点,如果在specifiedradius如果收录了更多的样本点,则将圆心转移到这个内部样本点,继续围绕附近的其他样本点,类似传销,继续线下发展。当滚动圈发现所包围的样本点数小于预先指定的值时,它就会停止。那么我们称初始点为核心点,如A,它停止的点为边界点,如B、C,不用滚动的点为离群点,如N)。基于密度的这个有什么好处?我们知道,kmeans聚类算法只能处理球形簇,也就是聚集成实体的组(这是因为算法本身在计算平均距离上有局限性)。但是现实中往往会有各种各样的形状,比如下面两张图,圆形的和不规则的。这时候,那些传统的聚类算法就明显悲剧了。于是我想,样本密度高的归为一类,这就是DBSCAN聚类算法。3、参数选择红圈滚动和滚动的过程如上文所述。这个过程包括DBSCAN算法的两个参数。这两个参数很难指定。普遍接受的指定方法很简单:Radius:Radius是最难指定的,如果它越大,圆圈就会越多,簇的数量就会越少;反之,簇的数量会更多,影响我们最终的结果。这时候K距离可以帮助我们设置半径r,也就是找到突变点。例如:以上虽然是一个可取的方法,但有时也很麻烦。大部分还是尝试观察,使用k距离需要大量的实验来观察,很难一次准确的选出所有这些值。MinPts:这个参数是圈出的点的个数,也相当于一个密度。一般这个值比较小,然后多次尝试。4.DBSCAN算法迭代可视化国外有个网站特别有意思,可以把我们的DBSCAN迭代过程动态画出来。网址:naftaliharris[1]设置好参数后,点击GO!集群开始!5.常用的评价方法:SilhouetteCoefficient这里介绍聚类算法中最常用的评价方法——SilhouetteCoefficient(轮廓系数):计算样本i到同一簇中其他样本的平均距离ai,ai越小,则更多的样本i应该被聚类到簇中(我们称ai为样本i与簇之间的相异程度);计算样本i和其他一些簇Cj之间的距离所有样本的平均距离bij称为样本i和簇Cj之间的相异性。定义为样本i的簇间相异性:bi=min(bi1,bi2,...,bik2);解释:如果si接近1,说明样本i的聚类合理;如果si接近于-1,说明样本i更应该归入另一个簇;如果si近似为0,则表示样本i在两个簇的边界上;6.使用Python实现DBSCAN聚类算法导入数据:importpandasasdfromsklearn.datasetsimportload_iris#导入数据,sklearn自带iris数据集iris=load_iris().dataprint(iris)输出:使用DBSCAN算法:fromsklearn.clusterimportDBSCANiris_db=DBSCAN(eps=0.6,min_samples=4).fit_predict(iris)#设置半径为0.6,最小样本量为2,建模db=DBSCAN(eps=10,min_samples=2).fit(iris)#统计的次数每个类别counts=pd.value_counts(iris_db,sort=True)print(counts)可视化:importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=[u'MicrosoftYaHei']fig,ax=plt.subplots(1,2,figsize=(12,12))#绘制聚类后的结果ax1=ax[0]ax1.scatter(x=iris[:,0],y=iris[:,1],s=250,c=iris_db)ax1.set_title('DBSCAN聚类结果',fontsize=20)#绘制真实数据结果ax2=ax[1]ax2.scatter(x=iris[:,0],y=iris[:,1],s=250,c=load_iris().target)ax2.set_title('trueclassification',fontsize=20)plt.show()我们可以观察到聚类效果ct来自上图,但是当数据量很大或者指标很多的时候,观察起来会很麻烦。这时候可以通过轮廓系数来判断结果的好坏。聚类结果的轮廓系数定义为S,是衡量聚类是否合理有效的指标。聚类结果的轮廓系数取值在[-1,1]之间。值越大,表示相似样本越近,不同样本越远,聚类效果越好。sklearn.metrics模块中定义了轮廓系数等评价函数,sklearn中的函数silhouette_score()计算所有点的平均轮廓系数。fromsklearnimportmetrics#下面的函数可以计算剪影系数(sklearn真是一个强大的包)score=metrics.silhouette_score(iris,iris_db)scoreresult:0.364