文章目录
- DBSCAN算法简介
- DBSCAN算法原理
- 核心概念
- 聚类过程
- DBSCAN模型
- 模型API
- 主要参数
- 其他参数
- DBSCAN算法实例
- 实例步骤
- 导入所需库
- 导入数据文件
- 传入变量
- DBSCAN聚类分析
- 添加数据进原数据框
- 对聚类结果进行评分
DBSCAN算法简介
- DBSCAN(Density - Based Spatial Clustering of Applications with Noise)是一种无监督的、基于密度的空间聚类算法,在数据挖掘和机器学习领域应用广泛。
DBSCAN算法原理
核心概念
聚类过程
DBSCAN模型
模型API
主要参数
- eps(epsilon):
- 定义了邻域的半径。对于一个数据点,其邻域是以该点为中心,以 eps 为半径的超球体。该参数决定了数据点之间的密度度量范围。
- 示例:如果将 eps 设置为 0.5,那么对于每个数据点,算法会考虑在距离该点 0.5 以内的其他点作为其邻域内的点。
- 选择该参数时,需要根据数据的分布和规模来确定。如果数据点分布较为稀疏,eps 可能需要设置得较大;如果数据点分布密集,较小的 eps 可能更合适。
- min_samples(MinPts):
- 表示在一个数据点的 eps 邻域内所需的最小数据点数,以将该点视为核心点。
- 例如,将 min_samples 设置为 5,意味着如果一个点的 eps 邻域内包含的点(包括自身)少于 5 个,它就不能成为核心点。
- 一般来说,该参数需要根据数据集的规模和噪声情况来调整。在噪声较多的数据集中,可以适当提高 min_samples 以减少噪声对聚类的影响;对于小型数据集,可能需要降低该值以避免将过多的点标记为噪声。
其他参数
- metric:
- 用于计算数据点之间距离的度量标准。常见的度量标准包括欧几里得距离(euclidean)、曼哈顿距离(manhattan)、余弦距离(cosine)等。
- 示例:如果数据点表示文本的特征向量,使用余弦距离可能更合适,因为它考虑了向量的方向,而不是仅考虑欧几里得距离的大小,这样更能反映文本之间的相似性;对于普通的数值数据,欧几里得距离可能是一个不错的选择。
- 选择合适的度量标准可以根据数据的特点和任务需求,不同的度量会导致不同的距离计算结果,进而影响聚类结果。
- algorithm:
- 用于计算最近邻的算法,不同的算法在性能和适用场景上有所不同。
- 例如,可选项可能包括 auto(根据数据集自动选择)、ball_tree(使用球树算法)、kd_tree(使用 k - d 树算法)、brute_force(暴力计算,适用于小型数据集)等。
- 在选择算法时,对于低维数据和小型数据集,brute_force 可能足够快;对于高维数据,ball_tree 或 kd_tree 可能更高效,因为它们利用了数据的结构来加速最近邻搜索。
DBSCAN算法实例
对以下数据进行聚类处理
数据文件:通过网盘分享的文件:data.txt
链接: https://pan.baidu.com/s/19i7j4OttyWRkX13a7TXbRQ 提取码: hm1t
–来自百度网盘超级会员v2的分享
实例步骤
- 导入所需库
- 导入数据文件
- 传入变量
- DBSCAN聚类分析
- 添加结果进入原数据框
- 对聚类结果进行评分
导入所需库
import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn import metrics
所需库可自行下载
导入数据文件
#读取文件
beer = pd.read_table('data.txt',sep=' ',encoding='utf-8',engine='python')
传入变量
#传入变量(列名)
x = beer[["calories","sodium","alcohol","cost"]]
DBSCAN聚类分析
#DBSCAN聚类分析
"""
eps:半径
min samples:最小密度【就是圆内最少有几个样本点】
Labels:分类结果【自动分类,-1为离群点】
"""
db = DBSCAN(eps=20,min_samples=2).fit(x)
labels= db.labels_
添加数据进原数据框
#添加结果至原数据框
beer['cluster_db']=labels
beer.sort_values('cluster_db')
对聚类结果进行评分
#对聚类结果进行评分"""
metrics.silhouette_score轮廓评价函数,它是聚类模型优劣的一种评估方式,可用于对聚类结果进
X:数据集scaled_cluster:聚类结果
score:非标准化聚类结果的轮系数->聚类
"""
score = metrics.silhouette_score(x,beer.cluster_db)
print(score)
结果: