机器学习之DBSCAN算法自动分类
目录
1 DBSCAN算法
1.1 概念
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,基于密度的空间聚类应用)是一种基于密度的数据聚类算法。它的核心思想是:对于一个聚类而言,其中的任意两点都是“密度相连”的,也就是说,从这两点中的任何一个点出发,通过一定的邻域范围,都能找到另一个点。是一种基于密度的数据聚类算法。DBSCAN算法不需要预先指定簇的数量,能够识别出任意形状的簇,并且能够处理噪声和异常点。
1.2 关键概念:
- 核心点(Core Point):在给定的邻域半径
ε
内,如果一个点的邻域中至少要有MinPts
个点,那么这个点就是核心点。 - 边界点(Border Point):在给定的邻域半径
ε
内,如果一个点的邻域中点的数量小于MinPts
,但它落在某个核心点的邻域内,这个点就是边界点。 - 噪声点(Noise Point):既不是核心点也不是边界点的点。
1.3 算法步骤:
- 初始化:将所有点标记为未访问。
- 寻找核心点:随机选择一个未访问的点
p
,如果p
是一个核心点,则开始一个新聚类。 - 扩展聚类:找出所有与
p
密度相连的点,这些点形成一个聚类。这个过程中可能会发现更多的核心点,重复这一步直到没有新的核心点可以添加到当前聚类中。 - 标记噪声点:所有未标记为核心点或边界点的点被认为是噪声点。
- 重复:重复步骤2到4,直到所有点都被访问过。
1.4 函数和参数
- 函数导入
from sklearn.cluster import DBSCAN
- 主要参数
- ε(epsilon):邻域半径。
即给定一个点,以这个点为中心,半径为eps的球体内包含的点是它的邻域。eps的大小决定了点与点之间被认为是密度相连的标准。如果eps太小,则许多点将被视为噪声或边界点;如果eps太大,则可能会导致多个簇合并成一个簇。 - min_samples(最小样本数):用于确定一个点是否为核心点。一个点如果在其eps邻域内至少要有min_samples个点(包括这个点本身),则这个点是核心点。min_samples的大小影响了簇的密度。
- ε(epsilon):邻域半径。
选择合适的eps和min_samples参数是DBSCAN算法成功的关键。
1.5 优缺点
- 优点:
- 不需要预先指定聚类个数。
- 可以发现任何形状的聚类。
- 能够识别出噪声点。
- 缺点:
- 对
ε
和MinPts
的选取敏感。 - 当聚类密度不均匀时,效果可能不佳。
- 对
DBSCAN算法在空间数据库和地理信息系统等领域有广泛的应用,因为它能够处理具有噪声和任意形状的数据集。在使用DBSCAN时,合理选择参数对于算法的性能至关重要。
2 实际测试
2.1 部分数据展示
对红酒类型进行分类
2.2 代码测试
明显可以看到,不同参数,结果不同
代码展示:
from sklearn.cluster import DBSCAN
import pandas as pd
from sklearn import metrics
beer = pd.read_table('data.txt',sep = ' ',encoding='utf-8',engine='python')
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(f'eps=20,min_samples=2:{score}')
db = DBSCAN(eps=15,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(f'eps=20,min_samples=2:{score}')
运行结果:
调试查看分类情况