文章目录
- 一、DBSCAN介绍
- 1.含义
- 2.DBSCAN 的核心概念
- 3.DBSCAN算法参数
- 二、代码实现
- 1.数据预处理
- 2.DBSCAN聚类
- 3.计算轮廓系数
- 4.全部代码
- 三、总结
一、DBSCAN介绍
1.含义
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,它能够将具有足够高密度的区域划分为簇,并能在具有噪声的数据集中发现任意形状的簇。DBSCAN 算法相比传统的 K-means 算法,不依赖于簇的形状,且能够识别并处理噪声点。
2.DBSCAN 的核心概念
ε-邻域(ε-neighborhood):对于数据集 D 中的任何点,其 ε-邻域是 D 中与 点 距离小于等于 ε 的所有点的集合。
核心点(Core Point):如果点A的 ε-邻域内至少有 MinPts 个点(包括 A自己),则称A为核心点。
边界点(Border Point):非核心点,但属于某个核心点的 ε-邻域内,如上图的B与C。
噪声点(Noise Point):既不是核心点也不是边界点的点,如图N。
直接密度可达(Directly Density-Reachable):如果点 P 在点 Q 的 ε-邻域内,且 Q 是一个核心点,则称点 P 从点 Q 直接密度可达。
密度可达(Density-Reachable):如果存在一个点的序列 B,使得 B直接密度可达A,则称点B从点A密度可达。
密度相连(Density-Connected):如果存在点 A,使得点B和点C都从A密度可达,则称 P 和 Q 密度相连。
3.DBSCAN算法参数
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: DBSCAN算法参数,即我们的ϵϵ-邻域的距离阈值,和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。
- min_samples: DBSCAN算法参数,,即样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。
- metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。
二、代码实现
1.数据预处理
import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn import metrics
# 读取文件
beer = pd.read_table("data.txt",sep=' ',encoding='utf8',engine='python')
#传入变量
X=beer.drop(columns=beer.columns[0])
使用pandas的read_table函数从名为"data.txt"的文件中读取数据,并通过drop方法移除了数据集中的第一列(这一列不是用于聚类的特征)。剩余的列被存储在X变量中,用于后续的聚类分析。
2.DBSCAN聚类
db = DBSCAN(eps=20,min_samples=2).fit(X)
labels = db.labels_
使用DBSCAN聚类算法对X进行聚类。eps=20和min_samples=2是DBSCAN的两个关键参数,分别定义了邻域的半径和形成密集区域所需的最小样本点数。fit方法执行聚类,并将聚类标签存储在labels变量中。将聚类标签(labels)作为新列cluster添加到原始的beer DataFrame中。这样,每行数据都对应了一个聚类标签。
3.计算轮廓系数
beer['cluster'] = labels
score = metrics.silhouette_score(X, beer.cluster)
print(score)
尝试使用metrics.silhouette_score函数计算聚类效果的轮廓系数并打印出轮廓系数的值。
4.全部代码
这段代码执行了以下步骤来对啤酒数据集进行DBSCAN聚类分析,并尝试计算聚类效果的轮廓系数(Silhouette Score)。
import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn import metrics
# 读取文件
beer = pd.read_table("data.txt",sep=' ',encoding='utf8',engine='python')
#传入变量
X=beer.drop(columns=beer.columns[0])
#DBSCAN聚类分析
db = DBSCAN(eps=20,min_samples=2).fit(X)
labels = db.labels_
# 添加结果至原数据
beer['cluster'] = labels
score = metrics.silhouette_score(X, beer.cluster)
print(score)
三、总结
DBSCAN 的优点和缺点
- 优点:
- 不需要预先指定簇的数量。
- 能够发现任意形状的簇。
- 对噪声数据不敏感。
- 能够识别出噪声点。
- 缺点:
- 需要选择两个参数 ε 和 MinPts,这可能需要一些实验来确定最佳值。
- 对于密度差异很大的数据集,可能难以找到合适的 ε 和 MinPts。
- 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。