文章目录
- 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):形成核心点所需要的邻域内最小点数。
算法步骤
- 初始化:
- 创建一个空集合C,用于存放所有的簇。
- 遍历数据集中的每一个点p,如果p未被访问,则标记p为已访问并处理以p为起点的簇。
- 处理簇:
- 如果p是核心点,则创建一个新簇C,并将p添加到C中。
- 从p的ε-邻域中找出所有点,对于每一个这样的点q:
- 如果q尚未被访问,则将其标记为已访问,并将其添加到C中。
- 如果q是核心点,则递归地将q的ε-邻域中的所有点(除了已经访问过的点)添加到C中。
- 如果p不是核心点,则p被标记为噪声点。
- 重复:
- 重复上述过程,直到所有的点都被访问过。
如图所示,可以简单想象为,找到一个核心点,以该点为圆心,在其ε半径内画圆,在一起包含在其中的分为一类。重复定核心点、画圆操作,将数据分簇。
特点
- 不需要事先指定簇的数量:与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过小的话,则会产生大量的核心对象,可能会导致类别数过少。
训练模型
-
收集数据
链接: 训练数据
提取码: csns -
数据预处理
从数据中取出需要的数据:
import pandas as pd
beer = pd.read_table('../Kmeans/data.txt',sep=' ',encoding='utf8')
x = beer[["calories","sodium","alcohol","cost"]]
- 训练模型
可调整邻域eps和邻域中样本数min_samples,来优化模型。
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=20,min_samples=2).fit(x)
- 取出标签
模型训练完成之后,在模型内有参数labels_,这是模型对训练数据打上的标签:
labels = db.labels_
- 评估模型
使用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算法模型啦!!
总结
本篇介绍了:
- DBSCAN聚类算法是怎么实现的
- DBSCAN聚类算法不需要提前指定分几簇,它会自动分簇
- 算法模型训练时会产生标签参数,训练数据本身是没有标签的
- 聚类算法的评估通过轮廓系数来判断,范围[-1,1],靠近1为合理