【机器学习】(17) --DBSCAN聚类算法

DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,它能够将具有足够高密度的区域划分为簇,并能在带有噪声的空间数据集中发现任意形状的簇。DBSCAN与K-means等传统聚类算法不同,它不需要事先指定簇的数量,并且能够有效地处理异常点(噪声)。

基本概念

  • 核心点(Core Point):如果某个点的ε-邻域内至少包含了MinPts个点,则称该点为核心点。
  • 边界点(Border Point):如果一个点不是核心点,但是它在某个核心点的ε-邻域内,则该点被称为边界点。
  • 噪声点(Noise Point):既不是核心点也不是边界点的点被认为是噪声点。
  • ε-邻域(Epsilon-Neighborhood):以某点为中心,ε为半径的空间区域。
  • MinPts(Minimum Points):形成核心点所需要的邻域内最小点数。

算法步骤

  1. 初始化:
    • 创建一个空集合C,用于存放所有的簇。
    • 遍历数据集中的每一个点p,如果p未被访问,则标记p为已访问并处理以p为起点的簇。
  2. 处理簇:
    • 如果p是核心点,则创建一个新簇C,并将p添加到C中。
    • 从p的ε-邻域中找出所有点,对于每一个这样的点q:
      • 如果q尚未被访问,则将其标记为已访问,并将其添加到C中。
      • 如果q是核心点,则递归地将q的ε-邻域中的所有点(除了已经访问过的点)添加到C中。
    • 如果p不是核心点,则p被标记为噪声点。
  3. 重复:
    • 重复上述过程,直到所有的点都被访问过。

在这里插入图片描述

如图所示,可以简单想象为,找到一个核心点,以该点为圆心,在其ε半径内画圆,在一起包含在其中的分为一类。重复定核心点、画圆操作,将数据分簇。

特点

  • 不需要事先指定簇的数量:与K-means不同,DBSCAN不需要用户指定簇的数量。
  • 能够发现任意形状的簇:由于DBSCAN是基于密度的,所以它能够识别出任何形状的簇,包括不规则形状的簇。
  • 对噪声和异常值不敏感:通过识别噪声点,DBSCAN能够处理包含噪声的数据集。
  • 参数敏感:DBSCAN的性能高度依赖于ε和MinPts两个参数的选择。

构建模型

注意:聚类算法训练数据都是数据本身没有分类标签的哦,聚类算法本身就是用来给数据分类的,所以会在训练模型时给数据自动分类,打上标签!!

模型参数

class sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='euclidean',
metric_params=None,algorithm='auto',leaf_size=30,p=None,n_jobs=None)

主要参数:eps,min_samples。其他参数可使用默认值

-- eps:ϵϵ-邻域的距离阈值,和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5。一般需要通过在多组值里面选择一个合适的阈值。eps		过大,则更多的点会落在核心对象的ϵϵ-邻域,此时我们的类别数可能会减少,本来不应该是一类的样本也会被划为一类。反之则类别数		可能会增大,本来是一类的样本却被划分开。

-- min_samples:样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和				 eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为				   噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。

训练模型

  1. 收集数据
    链接: 训练数据
    提取码: csns

  2. 数据预处理

从数据中取出需要的数据:

import pandas as pd
beer = pd.read_table('../Kmeans/data.txt',sep=' ',encoding='utf8')
x = beer[["calories","sodium","alcohol","cost"]]
  1. 训练模型

可调整邻域eps和邻域中样本数min_samples,来优化模型。

from sklearn.cluster import DBSCAN
db = DBSCAN(eps=20,min_samples=2).fit(x)
  1. 取出标签

在这里插入图片描述

模型训练完成之后,在模型内有参数labels_,这是模型对训练数据打上的标签:

labels = db.labels_
  1. 评估模型

使用metrics库中的silhouette_score()函数,调用该函数来计算聚类结果的轮廓系数。使用该函数时,需要传入聚类后的样本标签和样本特征数据。该函数结果范围为[-1,1],结果靠近1为合理。

样本标签:

beer['cluster_db'] = labels
beer.sort_values('cluster_db') #按分类排序

silhouette_score()函数使用:

score = metrics.silhouette_score(x,beer.cluster_db)
print(score)
----------------
0.6731775046455796

完整代码展示

import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn import metrics

beer = pd.read_table('../Kmeans/data.txt',sep=' ',encoding='utf8')

x = beer[["calories","sodium","alcohol","cost"]]
db = DBSCAN(eps=20,min_samples=2).fit(x)
labels = db.labels_
beer['cluster_db'] = labels
beer.sort_values('cluster_db')

score = metrics.silhouette_score(x,beer.cluster_db)
print(score)

这样,我们就构建好一个DBSCAN算法模型啦!!

总结

本篇介绍了:

  1. DBSCAN聚类算法是怎么实现的
  2. DBSCAN聚类算法不需要提前指定分几簇,它会自动分簇
  3. 算法模型训练时会产生标签参数,训练数据本身是没有标签的
  4. 聚类算法的评估通过轮廓系数来判断,范围[-1,1],靠近1为合理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值