《机器学习》 DBSCAN算法 原理、参数解析、案例实现

目录

一、先看案例

1、对K-mean算法

1)优点:

2)缺点:

2、使用DBSCAN去分类

二、DBSCAN算法

1、什么是DBSCAN

2、实现过程

三、参数解析

1、用法

2、参数

[1)eps: 邻域的距离阈值](#1)eps: 邻域的距离阈值)

[2)min_samples: 样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值](#2)min_samples: 样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值)

3)metric:最近邻距离度量参数

4)algorithm:最近邻搜索算法参数

5)属性

四、案例实现

1、文件内容

2、代码实现

3、运行结果


一、先看案例

1、对K-mean算法

有一堆数据点,用K-mean聚类去分类,最终得到以下图形,其中小点点为数据点

按照肉眼去观察可以知道外围一圈为一个类别,中间的一团一团为另外的一个个类别,但是K-mean无法这么分类,此时就可以使用DBSCAN来分类

1)优点:

简单、快捷、适合常规

2)缺点:

k值难以确定、很难发现任意形状的簇

2、使用DBSCAN去分类

此时可以得到以下分类状态

二、DBSCAN算法

1、什么是DBSCAN

DBSCAN是一种密度聚类算法,用于发现数据集中的有意义的聚类和异常点。与传统的基于距离的聚类算法(如K-means)不同,DBSCAN是基于密度的带噪声的空间聚类应用算法,它是将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并在噪声的空间数据集中发现任意形状的聚类

DBSCAN算法将样本点分为三类核心对象、边界对象和噪声点

核心对象是指样本点周围密度达到一定阈值的点

边界对象是指与核心对象相邻但密度不足以成为核心对象的点

噪声点是指既不是核心对象也不是边界对象的点。

例如下图:

2、实现过程

输入数据集 -> 指定半径 -> 指定密度阈值(半径范围内有制定个数以上的数据个数)

有上述几个数据点,随机 以A为核心对象,给定半径范围内,有3个数据点,首先第一个圈包围了A,其内有四个数据点,额外的三个点叫直接密度可达 ,这满足要求,继续分别对每个点进行划定上述范围及密度阈值,最终画到B点和C点,此时B点和C点指定范围内没有要求个数的点,所以不再继续扩散,那么B、C点就叫边界点 ,同一个簇内,除了直接密度可达点外,其余的叫密度可达点 ,而外面有一个划分不到的点N,叫离群点

三、参数解析

1、用法

python 复制代码
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)

2、参数

1)eps 邻域的距离阈值

默认值是0.5,一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。

2)min_samples: 样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值

默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。

****3)metric:****最近邻距离度量参数

可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。可以使用的距离度量参数有:

a) 欧式距离 "euclidean":

b) 曼哈顿距离 "manhattan"

c) 切比雪夫距离"chebyshev"

4)******algorithm:******最近邻搜索算法参数

算法一共有三种,第一种是蛮力实现 ,第二种是KD树实现 ,第三种是球树实现 。对于这个参数,一共有4种可选输入,'brute '对应第一种蛮力实现,'kd_tree '对应第二种KD树实现,'ball_tree' 对应第三种的球树实现,**'auto'**则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。

5)属性

Labels_: 每个点的分类标签。

四、案例实现

1、文件内容

2、代码实现

python 复制代码
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[['calories','sodium','alcohol','cost']]
# 建立一个空列表,用于存放下方for循环遍历的不同的聚类质量评分
scores = []
for i in range(1,10):
    labels = DBSCAN(eps=20,min_samples=i).fit(x).labels_  # 设置半径为20,最小样本点个数为i
    score = metrics.silhouette_score(x,labels)  # 输出聚类质量评分存入score
    scores.append(score)
k = scores.index(max(scores))+1  # 得到最优聚类质量评分对应的最小样本数

# dbscan聚类分析
# eps:半径,min_samples:最小密度,就是园内最少几个样本点
# labels 分类结果  自动分类,-1为离群点
db = DBSCAN(eps=20,min_samples=k).fit(x)  # 使用上述的最优k值进行训练
labels = db.labels_  # 打印数据对应类别标签

# 增加结果至原始数据框
beer['cluster_db'] = labels   # 将类别标签存入原始数据,新建一个列,列名为cluster_db
beer.sort_values('cluster_db')   # 对cluster_db中的值进行排序

score = metrics.silhouette_score(x,beer.cluster_db)   # 打印评估聚类质量的指标

3、运行结果

相关推荐
h177113472053 分钟前
定制相亲交友系统如何提升用户体验
大数据·开发语言·人工智能·小程序·系统开发
逐梦苍穹10 分钟前
速通GPT:Improving Language Understanding by Generative Pre-Training全文解读
论文阅读·人工智能·gpt·语言模型·论文笔记
为为-180-3121-145514 分钟前
“AI大语言模型+”助力大气科学相关交叉领域实践技术应用
人工智能·语言模型·自然语言处理
文艺倾年20 分钟前
【大模型专栏—进阶篇】语言模型创新大总结——“三派纷争”
人工智能·pytorch·语言模型·自然语言处理·大模型
陈敬雷-充电了么-CEO兼CTO23 分钟前
自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计
人工智能·gpt·搜索引擎·ai·自然语言处理·chatgpt·aigc
⊙月24 分钟前
CMU 10423 Generative AI:lec5(Encoder-only Transformers + 阅读材料Bert, ViT)
人工智能·深度学习·aigc·bert
强哥之神29 分钟前
白话:大型语言模型中的幻觉(Hallucinations)
人工智能·机器学习·语言模型·自然语言处理·llm·llama·hallucinations
妄想...32 分钟前
最大余额法,解决百分比计算相加不等于100%(扇形/饼图百分比使用的此算法)
前端·javascript·算法
AI人工智能集结号34 分钟前
使用 Azure 机器学习微调小型语言模型 (SLM) Phi-3
机器学习·语言模型·azure
鱼跃鹰飞40 分钟前
Leetcode面试经典150题-148.排序链表
算法·leetcode·链表·面试