DBSCAN聚类算法——MATLAB实现

article/2025/10/2 1:50:41

    声明:本文修改自《数学建模清风》老师的代码

   DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。 

        作为经典的聚类算法,DBSCAN聚类在数学建模竞赛中用到的概率很大。本文不详细展开讲解DBSCAN的原理,只介绍相关代码的使用步骤。

DBSCAN函数代码:

function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)C=0;n=size(X,1);IDX=zeros(n,1);  % 初始化全部为0,即全部为噪音点D=pdist2(X,X);visited=false(n,1);isnoise=false(n,1);for i=1:nif ~visited(i)visited(i)=true;Neighbors=RegionQuery(i);if numel(Neighbors)<MinPts% X(i,:) is NOISEisnoise(i)=true;elseC=C+1;ExpandCluster(i,Neighbors,C);endendendfunction ExpandCluster(i,Neighbors,C)IDX(i)=C;k = 1;while truej = Neighbors(k);if ~visited(j)visited(j)=true;Neighbors2=RegionQuery(j);if numel(Neighbors2)>=MinPtsNeighbors=[Neighbors Neighbors2];   %#okendendif IDX(j)==0IDX(j)=C;endk = k + 1;if k > numel(Neighbors)break;endendendfunction Neighbors=RegionQuery(i)Neighbors=find(D(i,:)<=epsilon);endend

绘制聚类图的代码:
 

function PlotClusterinResult(X, IDX)k=max(IDX);Colors=hsv(k);Legends = {};for i=0:kXi=X(IDX==i,:);if i~=0Style = 'x';MarkerSize = 8;Color = Colors(i,:);Legends{end+1} = ['Cluster #' num2str(i)];elseStyle = 'o';MarkerSize = 6;Color = [0 0 0];if ~isempty(Xi)Legends{end+1} = 'Noise';endendif ~isempty(Xi)plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);endhold on;endhold off;axis equal;grid on;legend(Legends);legend('Location', 'NorthEastOutside');end

接下来是主函数:

clc;
clear;
close all;load mydata;
%%注意,此处Data.mat用于导入自己的数据,数据名字要用X,或者在下方改变量名也可以if size(X,2)==2%%如果列数=2才可以运算epsilon=0.5;%%规定聚类半径MinPts=10;%%规定半径内最小数目点%%上面两个参数对聚类的结果很敏感,可以多次修改得出最好的结果IDX=DBSCAN(X,epsilon,MinPts);%%调用DBSCAN函数,输入参数有三个,分别是原始数据,聚类半径,最小数目点%%IDX用于保存每一项数据所属的聚类类别数目PlotClusterinResult(X, IDX);%%画出聚类结果图title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
else disp("请修改数据,DBCASN对二维聚类最佳!")
end

如下是聚类结果:

 使用要点:

        前两个函数分别保存为独立的m文件,将其与主函数放置同一文件夹目录之下即可。此外,自己的数据要独立保存为.mat文件,也在同一目录之下。最后直接运行main函数即可


http://chatgpt.dhexx.cn/article/gyKYtDNZ.shtml

相关文章

DBSCAN聚类算法实用案例

目录 1、DBSCAN算法介绍4、DBSCAN 的参数选择5、Scikit-learn中的DBSCAN的使用核心参数:属性:1、DBSCAN算法介绍 下图中,左边的图形可以使用K-Means算法进行聚类,右边两个有交叉部分【噪音】,故需要使用密度聚类(DBSCAN)算法 K-Means和层次聚类算法,是基于对象之间的距…

DBSCAN 聚类算法详解

参考&#xff1a; https://www.cnblogs.com/zhengxingpeng/p/6670486.htmlhttps://www.cnblogs.com/chaosimple/p/3164775.htmlhttps://www.jianshu.com/p/e8dd62bec026 1. DBSCAN简介&#xff1a; DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with …

数据挖掘(七) DBSCAN聚类算法

数据挖掘&#xff08;七&#xff09; DBSCAN聚类算法 DBSCAN是一种非常著名的基于密度的聚类算法。其英文全称是 Density-Based Spatial Clustering of Applications with Noise&#xff0c;意即&#xff1a;一种基于密度&#xff0c;对噪声鲁棒的空间聚类算法。直观效果上看&…

DBSCAN聚类算法的实现

DBSCAN聚类算法的实现 1. 作者介绍2.关于理论方面的知识介绍2.1 DBSCAN算法介绍2.2 鸢尾花数据集介绍 3&#xff0e;实验过程3.1 实验代码3.2 实现过程3.3 实验结果 4&#xff0e;参考文献 1. 作者介绍 刘鹏程&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;…

毫米波雷达点云 DBSCAN聚类算法

毫米雷达点云 DBSCAN聚类算法 聚类的目的聚类算法分类原型聚类层次聚类密度聚类 DBSCAN聚类算法原理相关定义算法流程以及伪代码DBSCAN算法优缺点DBSCAN参数选择聚类衡量指标 DBSCAN算法仿真DBSCAN代码DBSCAN算法对毫米波雷达点云数据进行聚类 聚类的目的 聚类的目的是将一组数…

使用Python实现DBSCAN聚类算法及可视化

目录 实战过程 数据准备 DBSCAN模型 聚类结果评估 可视化展示 运行结果 总结 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种基于密度的聚类算法&#xff0c;可以发现任意形状的簇&#xff0c;并且能够在噪声数据的…

聚类及DBSCAN 聚类算法

聚类及DBSCAN 聚类算法 一、聚类 1.概念 聚类就是按照某个特定标准把一个数据集分割成不同的类或簇&#xff0c;使得同一个簇内的数据对象的相似性尽可能大&#xff0c;同时不在同一个簇中的数据对象的差异性也尽可能地大。 2.聚类与分类的区别 聚类时&#xff0c;我们并不…

python DBSCAN聚类算法

文章目录 DBSCAN聚类算法基本思想基本概念工作流程参数选择DBSCAN的优劣势 代码分析Matplotlib Pyplotmake_blobsStandardScaleraxes类使用plt.cm.Spectral颜色分配python numpy 中linspace函数enumerate()函数plt.scatter&#xff08;&#xff09;绘制散点图整体代码 DBSCAN聚…

聚类方法:DBSCAN算法研究(1)--DBSCAN原理、流程、参数设置、优缺点以及算法

DBSCAN聚类算法三部分&#xff1a; 1、 DBSCAN原理、流程、参数设置、优缺点以及算法&#xff1b; http://blog.csdn.net/zhouxianen1987/article/details/68945844 2、 matlab代码实现&#xff1b; blog&#xff1a;http://blog.csdn.net/zhouxianen1987/…

聚类算法--DBSCAN算法

一、DBSCAN算法 简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个基于密度的聚类算法。算法把簇看作数据空间中由低密度区域分割开的高密度对象区域&#xff1b;将足够高密度的区域划为簇&#xff0c;可以在有噪音的数据集中发现任意形状的聚类…

DBSCAN聚类算法

DBSCAN是一种基于密度的聚类算法 首先&#xff0c;DBSCAN算法会以任何尚未访问过的任意起始数据点为核心点&#xff0c;并对该核心点进行扩充。这时我们给定一个半径/距离ε&#xff0c;任何和核心点的距离小于ε的点都是它的相邻点。如果核心点附近有足够数量的点&#xff0…

DBSCAN 聚类算法

DBSCAN 聚类算法 DBSCAN 算法是一种基于密度的聚类算法&#xff0c;它能够发现任意形状的类别 (database 2)&#xff0c;而 k k k-means 只能发现凸 (convex) 的形状 (database 1)&#xff0c;同时 DBSCAN 还有很强的抗噪性 (database 3)&#xff0c;在具有噪声的数据中发现任…

基于密度的聚类算法(1)——DBSCAN详解

基于密度的聚类算法&#xff08;1&#xff09;——DBSCAN详解 基于密度的聚类算法&#xff08;2&#xff09;——OPTICS详解 基于密度的聚类算法&#xff08;3&#xff09;——DPC详解 1. DBSCAN简介 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications wit…

聚类算法之DBSCAN

DBSCAN聚类算法 1. DBSCAN算法基本概念 DBSCAN是一种典型的基于密度的聚类算法&#xff0c;基于一组邻域 ( ϵ , M i n P t s ) (\epsilon, MinPts) (ϵ,MinPts)来描述样本集的紧密程度。其中 ϵ \epsilon ϵ描述了某一样本的邻域距离阈值&#xff0c; M i n P t s MinPts Mi…

char型和int型之间的类型转换

char转换为int型数据 通过赋值方式将char类型变量转换为int型变量&#xff0c;变量值为char类型变量的ASCII码值 例如&#xff1a;int a ‘0’ 那么打印a的结果为48&#xff0c;如果想要得到正确的数字&#xff0c;需要减去ASCII码值。 int型转换为char型 char类型和int类…

C++:char转换为int(char to int )

文章目录 1.通过ascii码&#xff1a;2.直接转换&#xff08;更简单&#xff0c;推荐&#xff09; 1.通过ascii码&#xff1a; char a 0; int ia (int)a; /* note that the int cast is not necessary -- int ia a would suffice */ cout<<ia<<endl;结果如下&a…

c++ char[]与int之间的类型转换

char数组转int&#xff0c;int转char数组。 #include <cstdio> #include <iostream> #include <stdlib.h> using namespace std;int main(int argc , char *argv[]){int n 0; char str[110] "1234";//char[]转int n atoi(str);printf("%d…

c/c++,char型数组转化为int类型

char型数组转int类型 这几天遇到需要将int等类型转换并保存在char数组中&#xff0c;同时还需要将char数组转换为int等类型进行显示。 1、int等类型转换并保存在char数组中 int为4字节&#xff0c;char为1字节&#xff0c;由长变短&#xff0c;容易发出截断&#xff0c;数据…

【c++】int与char相互转换

1 通过ASCII码转换 首先先看一下ASCII表 其中数字字符对应的位置为&#xff1a;48 - 57。 需要记住的几个数值&#xff1a; 2 char ->int char 转 int 之前&#xff0c;先将运算式中的每个字符都转换成 ASCII 码值&#xff0c;再进行计算。 char c 0;int i1 c; …

c++中int与char相互转换

一、ASCII 表 了解 int 与 char 相互转换之前&#xff0c;先让我们看一下 ASCII 码表。 其中数字字符对应的位置为&#xff1a;48 - 57。 二、char 转 int char 转 int 之前&#xff0c;先将运算式中的每个字符都转换成 ASCII 码值&#xff0c;再进行计算。 以下代码为例&a…