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

深度解读 python 实现 dbscan算法

DBScan (密度基于空间聚类) 是一种聚类算法,它通过找到图像中的密度峰值来对数据进行聚类。

文章目录

    • DBScan 算法解释说明
    • DBScan 算法的应用场景
    • Python 实现的 DBScan 算法
    • Python 实现 dbscan 高级算法
    • 再演示一种 python 实现 dbscan 算法的代码
    • 总结

DBScan 算法解释说明

DBScan 是密度基于空间聚类,它是一种基于密度的聚类算法,其与其他聚类算法(如K-Means)不同的是,它不需要事先知道簇的数量。

DBScan 算法通过构建基于密度的图模型,对数据进行聚类。

该算法使用两个参数:半径 eps 和最小样本数 minPts

它通过遍历每一个数据点,并将它们分为核心对象,边界对象和噪声。

如果一个数据点是核心对象,则它周围的数据点也属于该簇。

DBScan 算法通过找到密度高的区域,并将其作为簇,最终得到聚类结果。

DBScan 算法的应用场景

  • 对非球形簇进行聚类:DBScan 算法可以识别出非球形的簇,因此适用于识别非球形的结构。
  • 对不平衡数据进行聚类:DBScan 算法可以适用于对不平衡的数据进行聚类,因为它不像 K-Means 那样需要事先知道簇的数量。
  • 异常值检测:DBScan 算法可以识别异常值,因为它可以识别出非核心对象的点,并将它们作为异常值。
  • 处理高维数据:DBScan 算法可以很好地处理高维数据,因为它不基于欧几里得距离,而是基于密度关系。
  • 对动态数据进行聚类:DBScan 算法可以适用于对动态数据进行聚类,因为它可以很好地处理动态数据的变化。

Python 实现的 DBScan 算法

from sklearn.cluster import DBSCAN
import numpy as np

# 创建样本数据
X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])

# 创建并训练模型
db = DBSCAN(eps=3, min_samples=2).fit(X)

# 获取聚类标签
labels = db.labels_

# 打印聚类结果
print("Labels:", labels)

在代码中,首先创建了样本数据,然后创建了一个 DBSCAN 模型,并通过设置参数 epsmin_samples 训练该模型。最后,我们通过调用 model.labels_ 属性获取了聚类标签,并打印出了聚类结果。

eps 参数表示数据点之间的最大距离,min_samples 参数表示确定一个簇所需的最小数据点数量。

Python 实现 dbscan 高级算法

import numpy as np

def euclidean_distance(x, y):
    return np.sqrt(np.sum((x - y)**2))

def dbscan(X, eps, min_samples):
    m = X.shape[0]
    labels = [0] * m
    C = 0
    for i in range(m):
        if labels[i] != 0:
            continue
        neighbors = []
        for j in range(m):
            if euclidean_distance(X[i], X[j]) < eps:
                neighbors.append(j)
        if len(neighbors) < min_samples:
            labels[i] = -1
        else:
            C += 1
            labels[i] = C
            for j in neighbors:
                labels[j] = C
    return labels

X = np.array([[1,2],[2,2],[2,3],[8,7],[8,8],[25,80]])
labels = dbscan(X, 3, 2)
print(labels)

上面的代码中, X 是输入的数据矩阵, eps 是半径(或阈值), min_samples 是半径内的最小样本数。

dbscan() 函数内,首先对每一个样本点,找出它的领域内的样本点(即与其距离小于阈值的样本点),并判断是否满足要求的最小样本数,如果满足,将其作为核心点,并将其他在领域内的样本点聚为同一类,如果不满足,说明该点是噪声点,不聚为任何一类。

最后返回每一个样本点所属的类别标签。

再演示一种 python 实现 dbscan 算法的代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN

# 创建数据集
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)

# 初始化 DBScan 模型
dbscan = DBSCAN(eps=0.3, min_samples=5)

# 训练模型
y_pred = dbscan.fit_predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

上述代码使用了 scikit-learn 库中的 DBSCAN 模型,在创建数据集时使用了 make_moons() 函数,可以创建一个月牙形数据集。
接着,初始化了一个 DBScan 模型,其中 eps 参数表示邻域半径, min_samples 参数表示在邻域内至少需要有多少个样本。接下来使用 fit_predict() 方法训练模型并预测结果。最后使用 scatter() 函数可视化结果。

运行代码得到如下结果。

在这里插入图片描述

总结

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 865 篇原创博客

👇 全网 6000+人正在学习的 爬虫专栏 👇👇👇👇

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

相关文章:

  • 2023年“华数杯”国际大学生数学建模A题完整思路
  • C++ 入门
  • 机器学习研究的 12 个宝贵经验
  • LabVIEW更高的吞吐量与更少的延迟2
  • 【C语言练习】杨氏矩阵、杨辉三角
  • 【Java】到底什么是包?|最通俗易懂讲解|保姆级
  • 【YBT2023寒假Day4 B】人人人数(数学)
  • MasterSlave概念与配置与eeprom信息擦除解决步骤
  • FPGA和CPLD芯片选型介绍(二)
  • 【C++】继承
  • 第九层(10):STL之函数对象
  • 边缘检测与角点检测(模式识别与图像处理课程作业)
  • STL使用方法(C++)
  • 懂了委托,才算真正入门C#
  • 2023 年 1 月的5篇深度学习论文推荐
  • Android Studio:GIT提交项目到远程仓库
  • Asm.js的简单介绍
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • JS数组方法汇总
  • js学习笔记
  • leetcode98. Validate Binary Search Tree
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • mongodb--安装和初步使用教程
  • mysql外键的使用
  • node-glob通配符
  • node学习系列之简单文件上传
  • 给初学者:JavaScript 中数组操作注意点
  • 面试总结JavaScript篇
  • 如何学习JavaEE,项目又该如何做?
  • 如何在 Tornado 中实现 Middleware
  • 少走弯路,给Java 1~5 年程序员的建议
  • 设计模式 开闭原则
  • 什么软件可以剪辑音乐?
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • !!Dom4j 学习笔记
  • #HarmonyOS:Web组件的使用
  • (4)STL算法之比较
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转) ns2/nam与nam实现相关的文件
  • (转)Mysql的优化设置
  • (转)setTimeout 和 setInterval 的区别
  • (转)视频码率,帧率和分辨率的联系与区别
  • (状压dp)uva 10817 Headmaster's Headache
  • *** 2003
  • ***利用Ms05002溢出找“肉鸡
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET导入Excel数据
  • .Net的DataSet直接与SQL2005交互
  • .py文件应该怎样打开?