当前位置: 首页 > article >正文

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

目录

一、先看案例

1、对K-mean算法

1)优点:

2)缺点:

2、使用DBSCAN去分类

二、DBSCAN算法

1、什么是DBSCAN

2、实现过程

三、参数解析

1、用法

2、参数

        1)eps: 邻域的距离阈值

        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、用法

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、代码实现

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、运行结果


http://www.kler.cn/a/286466.html

相关文章:

  • Golang笔记——常用库context和runtime
  • 【Rust自学】15.0. 智能指针(序):什么是智能指针及Rust智能指针的特性
  • 人工智能在计算机视觉中的应用与创新发展研究
  • github制作静态网页
  • 在线课堂小程序设计与实现(LW+源码+讲解)
  • 生成模型:扩散模型(DDPM, DDIM, 条件生成)
  • Flink窗口API使用教程
  • 2024年6月 青少年等级考试机器人实操真题二级
  • Web3常见概念
  • 系统分析师6:计算机网络
  • HTML学习笔记——用HTML记录学习过程5-全局属性
  • 如何用Java SpringBoot+Vue打造高效产品订单管理系统?
  • Markdown语法与Latex公式汇总
  • Linux网络:TCP UDP socket
  • Vue3: customRef自定义响应数据
  • Springboot + AOP + 注解做全局日志拦截并且排除敏感属性以及接口相应时间
  • Web:PHP序列化和反序列化
  • TLS握手性能测试工具:快速重置、多线程与高级统计分析(C/C++代码实现)
  • 一.海量数据实时分析-Doris入门和安装
  • 全能型AI“草莓”的未来展望:多样性VS专业性,谁将引领市场潮流?
  • 在Web服务应用中,如何编程使用Redis的缓存功能?包括缓存页面内容、缓存数据库查询结果、用户会话信息等代码分享
  • Adobe DC 2022提示无法识别的错误 - 解决方案
  • Nginx 反向代理实现 Tomcat 高可用性负载均衡详解
  • python 实现检查三个点在 3D 中是否共线算法
  • MySQL:简述对事务的认识
  • vue页面自适应 动态 postcss postcss-pxtorem