DBSCAN密度聚类

一,概述
基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一个区域中的样本密度大于某个阈值,就把它划入与之相近的簇中。基于距离的聚类算法的聚类结果是球状的簇,当数据集中的聚类结果是非球状结构时,基于距离的聚类算法的聚类效果并不好。 与基于距离的聚类算法不同的是,基于密度的聚类算法可以发现任意形状的聚类。在基于密度的聚类算法中,通过在数据集中寻找被低密度区域分离的高密度区域,将分离出的高密度区域作为一个独立的类别。

二,算法原理
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
在这里插入图片描述
下图中m,p,o.r 都是核心对象,因为他们的内都只是包含3个对象。
1.对象q是从m直接密度可达的。对象m从p直接密度可达的。
2.对象q是从p(间接)密度可达的,因为q从m直接密度可达,m从p直接密度可达。
3.r和s是从o密度可达的,而o是从r密度可达的,所有o,r和s都是密度相连的。

在这里插入图片描述
三,算法步骤
1.首选任意选取一个点,然后找到到这个点距离小于等于 eps 的所有的点。如果距起始点的距离在 eps 之内的数据点个数小于 min_samples,那么这个点被标记为噪声。如果距离在 eps 之内的数据点个数大于 min_samples,则这个点被标记为核心样本,并被分配一个新的簇标签。
2.然后访问该点的所有邻居(在距离 eps 以内)。如果它们还没有被分配一个簇,那么就将刚刚创建的新的簇标签分配给它们。如果它们是核心样本,那么就依次访问其邻居,以此类推。簇逐渐增大,直到在簇的 eps 距离内没有更多的核心样本为止。
3.选取另一个尚未被访问过的点,并重复相同的过程。

在这里插入图片描述
四,优缺点
优点
1,不需要用户先验地设置簇的个数,可以划分具有复杂形状的簇,还可以找出不属于任何簇的点。
2,和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,对数据集中的异常点不敏感。一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。
3,可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
4,DBSCAN 比凝聚聚类和 k 均值稍慢,但仍可以扩展到相对较大的数据集。
缺点
1、如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
2、调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。一般这两个参数的确定靠经验值。如果觉得经验值聚类的结果不满意,可以适当调整ϵ和MinPts的值,经过多次迭代计算对比,选择最合适的参数值。如果MinPts不变,ϵ取得值过大,会导致大多数点都聚到同一个簇中,ϵ过小,会导致一个簇的分裂;如果ϵ不变,MinPts的值取得过大,会导致同一个簇中点被标记为离群点,ϵ过小,会导致发现大量的核心点。
3、不适合高维数据,可以先进行降维操作
4、Sklearn中效率很慢,可以先执行数据削减策略

五,sklearn_learn实现

def __init__(self, eps=0.5, min_samples=5, metric='euclidean',
                 metric_params=None, algorithm='auto', leaf_size=30, p=None,
                 n_jobs=1):

核心参数:
eps: float,ϵ-邻域的距离阈值
min_samples :int,样本点要成为核心对象所需要的 ϵ-邻域的样本数阈值
属性:
core_sample_indices_ : 核心点的索引,因为labels_不能区分核心点还是边界点,所以需要用这个索引确定核心点
components_:训练样本的核心点
labels_:每个点所属集群的标签,-1代表噪声点

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
x1,y1=datasets.make_circles(n_samples=5000,factor=.6,noise=.05)
x2,y2=datasets.make_blobs(n_samples=1000,n_features=2,centers=[[1.2,1.2]],cluster_std=[[.1]],random_state=9)

x=np.concatenate((x1,x2))
plt.scatter(x[:,0],x[:,1])
plt.show()

#KMeans算法效果
from sklearn.cluster import KMeans
y_pred=KMeans(n_clusters=3,random_state=9).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=y_pred)
plt.show()

#DBSCAN算法
from sklearn.cluster import DBSCAN
#y_pred=DBSCAN().fit_predict(x)
#plt.scatter(x[:,0],x[:,1],c=y_pred)
#plt.show()
y_pred=DBSCAN(eps=0.1,min_samples=10).fit_predict(x)
plt.scatter(x[:,0],x[:,1],c=y_pred)
plt.show()

调参

rs= []#存放各个参数的组合计算出来的模型评估得分和噪声比
eps = np.arange(0.2,4,0.2) #eps参数从0.2开始到4,每隔0.2进行一次
min_samples=np.arange(2,20,1)#min_samples参数从2开始到20

best_score=0
best_score_eps=0
best_score_min_samples=0

for i in eps:
 for j in min_samples:
 try:#因为不同的参数组合,有可能导致计算得分出错,所以用try
            db = DBSCAN(eps=i, min_samples=j).fit(data)
            labels= db.labels_#得到DBSCAN预测的分类便签
            k=metrics.silhouette_score(data,labels) #轮廓系数评价聚类的好坏,值越大越好
            raito = len(labels[labels[:] == -1]) / len(labels) #计算噪声点个数占总数的比例
            n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) # 获取分簇的数目
            rs.append([i,j,k,raito,n_clusters_])
 if k>best_score:
                best_score=k
                best_score_eps=i
                best_score_min_samples=j

 except:
            db='' #这里用try就是遍历i,j 计算轮廓系数会出错的,出错的就跳过
 else:
            db=''
rs= pd.DataFrame(rs)
rs.columns=['eps','min_samples','score','raito','n_clusters']
sns.relplot(x="eps",y="min_samples", size='score',data=rs)
sns.relplot(x="eps",y="min_samples", size='raito',data=rs)

参考文章:
https://www.jianshu.com/p/e594c2ce0ac0
https://www.cnblogs.com/aijianiula/p/4339960.html
https://www.imooc.com/article/257210
https://www.jianshu.com/p/82db047eea13(调参)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值