聚类算法-DBSCAN

一、DBSCAN介绍

1.含义

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的空间聚类算法,它能够将具有足够高密度的区域划分为簇,并能在具有噪声的数据集中发现任意形状的簇。DBSCAN 算法相比传统的 K-means 算法,不依赖于簇的形状,且能够识别并处理噪声点。

2.DBSCAN 的核心概念

在这里插入图片描述

ε-邻域(ε-neighborhood):对于数据集 D 中的任何点,其 ε-邻域是 D 中与 点 距离小于等于 ε 的所有点的集合。
核心点(Core Point):如果点A的 ε-邻域内至少有最小样本数(min_samples)个点(包括 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 的优点和缺点

  • 优点:
    • 不需要预先指定簇的数量。
    • 能够发现任意形状的簇。
    • 对噪声数据不敏感。
    • 能够识别出噪声点。
  • 缺点:
    • 需要选择两个参数领域半径(eps)和最小样本数(min_samples),这可能需要一些实验来确定最佳值。
    • 对于密度差异很大的数据集,可能难以找到合适的 ε 和 MinPts。
    • 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值