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

2024-08-28 20:04

本文主要是介绍《机器学习》 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,最小样本点个数为iscore = metrics.silhouette_score(x,labels)  # 输出聚类质量评分存入scorescores.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、运行结果

这篇关于《机器学习》 DBSCAN算法 原理、参数解析、案例实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1115743

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同