本文主要为了完成平日作业,并进一步加深对算法的理解。也希望对来访的读者有所帮助。


目录

一、什么是DBSCAN算法

二、DBSCAN算法的意义

三、DBSCAN算法代码解析

1.关键概念

2.大致思路

3.对照每行代码的详细注解

(1)DBSCAN.m文件注解如下:

(2)mydata.mat文件注解如下:

(3)PlotClusterinResult.m文件注解如下:

(4)main.m文件注解如下:

四、总结


一、什么是DBSCAN算法

DBSCAN基于高密度连通区域的、基于密度的聚类算法,能够将具有足够高密度的区域划分为,并在具有噪声的数据中发现任意形状的簇。简单来说,DBSCAN目的就是找到密度相连对象的最大集合。其原理的基本要点有:DBSCAN算法需要选择一种距离度量,对于待聚类的数据集中,任意两个点之间的距离,反映了点之间的密度,说明了点与点是否能够聚到同一类中。由于DBSCAN算法对高维数据定义密度很困难,所以对于二维空间中的点,可以使用欧几里德距离来进行度量。

二、DBSCAN算法的意义

首先,就得提到聚类算法。聚类算法可以聚类分析利用数据内部簇结构和模式进行分类,不需要对样本进行训练得到先验知识,降低了计算复杂度。引入深度学习对数据内部结构和模式进行特征学习,得到数据的初步聚类,再对初步聚类进行不断优化得到最终的分类效果。实验结果表明,算法很好地解决了信息全面与维数灾难的矛盾,具有良好的实用性和主观一致性。

而DBSCAN聚类算法广泛应用于人脸识别以及交通等领域。

三、DBSCAN算法代码解析

1.关键概念

Eps 参数:定义密度时的邻域半径;

MmPts 参数:定义核心点时的阈值;

Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域;

核心对象:如果给定对象Ε领域内的样本点数大于等于MinPts,则称该对象为核心对象;

直接密度可达:对于样本集合D,如果样本点q在p的Ε领域内,并且p为核心对象,那么对象q从对象p直接密度可达;

密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达;

密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联。

2.大致思路

DBSCAN 算法对簇的定义很简单,由密度可达关系导出的最大密度相连的样本集合,即为最终聚类的一个簇。DBSCAN 算法的簇里面可以有一个或者多个核心点。如果只有一个核心点,则簇里其他的非核心点样本都在这个核心点的 Eps 邻域里。如果有多个核心点,则簇里的任意一个核心点的 Eps 邻域中一定有一个其他的核心点,否则这两个核心点无法密度可达。这些核心点的 Eps 邻域里所有的样本的集合组成一个 DBSCAN 聚类簇。
       DBSCAN算法的描述如下:

  • 输入:数据集,邻域半径 Eps,邻域中数据对象数目阈值 MinPts;
  • 输出:密度联通簇。

具体处理流程如下:
1)从数据集中任意选取一个数据对象点 p;
2)如果对于参数 Eps 和 MinPts,所选取的数据对象点 p 为核心点,则找出所有从 p 密度可达的数据对象点,形成一个簇;
3)如果选取的数据对象点 p 是边缘点,选取另一个数据对象点;
4)重复(2)、(3)步,直到所有点被处理。

3.对照每行代码的详细注解

(1)DBSCAN.m文件注解如下:

%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPML110
% Project Title: Implementation of DBSCAN Clustering in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
//上面的部分应该是运行前的加载文件,不做过多解读function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)    //DBSCAN聚类函数C=0;                       //统计簇类个数,初始化为0n=size(X,1);               //把矩阵X的行数数赋值给n,即一共有n个点IDX=zeros(n,1);            //定义一个n行1列的矩阵D=pdist2(X,X);             //计算(X,X)的行的距离visited=false(n,1);        //创建一维的标记数组,全部初始化为false,代表还未被访问isnoise=false(n,1);        //创建一维的异常点数组,全部初始化为false,代表该点不是异常点for i=1:n                  //遍历1~n个所有的点if ~visited(i)         //未被访问,则执行下列代码visited(i)=true;   //标记为true,已经访问Neighbors=RegionQuery(i);     //查询周围点中距离小于等于epsilon的个数if numel(Neighbors)<MinPts    //如果小于MinPts% X(i,:) is NOISE        isnoise(i)=true;          //该点是异常点else              //如果大于MinPts,且距离大于epsilonC=C+1;        //该点又是新的簇类中心点,簇类个数+1ExpandCluster(i,Neighbors,C);    //如果是新的簇类中心,执行下面的函数endendend                    //循环完n个点,跳出循环function ExpandCluster(i,Neighbors,C)    //判断该点周围的点是否直接密度可达IDX(i)=C;                            //将第i个C簇类记录到IDX(i)中k = 1;                             while true                           //一直循环j = Neighbors(k);                //找到距离小于epsilon的第一个直接密度可达点if ~visited(j)                   //如果没有被访问visited(j)=true;             //标记为已访问Neighbors2=RegionQuery(j);   //查询周围点中距离小于epsilon的个数if numel(Neighbors2)>=MinPts //如果周围点的个数大于等于Minpts,代表该点直接密度可达Neighbors=[Neighbors Neighbors2];   %#ok  //将该点包含着同一个簇类当中endend                              //退出循环if IDX(j)==0                     //如果还没形成任何簇类IDX(j)=C;                    //将第j个簇类记录到IDX(j)中end                              //退出循坏k = k + 1;                       //k+1,继续遍历下一个直接密度可达的点if k > numel(Neighbors)          //如果已经遍历完所有直接密度可达的点,则退出循环break;endendend                                      //退出循环function Neighbors=RegionQuery(i)        //该函数用来查询周围点中距离小于等于epsilon的个数Neighbors=find(D(i,:)<=epsilon);endend

(2)mydata.mat文件注解如下:

原始数据是很明显是二维数据,也即是平面中的点。源码中的数据展示如下:

(4月18日补充:这里有很多读者在问是什么,补充一下。这是所有点的初始坐标,每一行代表一个点的横坐标和纵坐标,如图有1000*2行的数据,说明有1000个数据,并且第一个数据的坐标为(0.8514,-0.4731),第二个数据的坐标为(-0.0143,0.6897),依次类推,当然这些数据是官网上的数据,自己在应用时可以产生自己的数据)

(3)PlotClusterinResult.m文件注解如下:

%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPML110
% Project Title: Implementation of DBSCAN Clustering in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
//上面的程序依旧应该是加载文件,不做过多的解析function PlotClusterinResult(X, IDX)                //绘图,标绘聚类结果k=max(IDX);                                     //求矩阵IDX每一列的最大元素及其对应的索引Colors=hsv(k);                                  //颜色设置Legends = {};for i=0:k                                       //循环每一个簇类Xi=X(IDX==i,:);                    if i~=0                                     Style = 'x';                            //标记符号为xMarkerSize = 8;                         //标记尺寸为8Color = Colors(i,:);                    //所有点改变颜色改变Legends{end+1} = ['Cluster #' num2str(i)]; elseStyle = 'o';                            //标记符号为oMarkerSize = 6;                         //标记尺寸为6Color = [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');      //legend默认的位置在NorthEast,将其设置在外侧end                                              //结束循环

(4)main.m文件注解如下:

%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPML110
% Project Title: Implementation of DBSCAN Clustering in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
//上面的代码又应该是加载程序,这里不做过多解释clc;                    //清理命令行的意思
clear;                  //清楚存储空间的变量,以免对下面的程序运行产生影响
close all;              //关闭所有图形窗口%% Load Data            //定义data.mat数据文件加载模块data=load('mydata');    //数据读取
X=data.X;%% Run DBSCAN Clustering Algorithm    //定义Run运行模块epsilon=0.5;                          //规定两个关键参数的取值
MinPts=10;
IDX=DBSCAN(X,epsilon,MinPts);         //传入参数运行%% Plot Results                       //定义绘图结果模块PlotClusterinResult(X, IDX);          //传入参数,绘制图像
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);

四、总结

上面四个部分是DBSCAN算法的完整代码,有需要data.X文件数据的可以私聊我,我可以发给你,当然在实际应用中是根据自己的实际使用数据进行操作的。

以上就是对于DBSCAN算法每行代码详细注解的全部内容啦,希望对大家有所帮助,快快收藏,好好学习这个算法吧!我也很乐意与读者进行探讨!

Matlab实现DBSCAN算法(每行代码标注详细注解)相关推荐

  1. Matlab实现Kmeans算法(每行代码标注详细注解)

    本文主要为了完成平日作业,并进一步加深对算法的理解.也希望对来访的读者有所帮助. 目录 一.什么是Kmeans算法 二.Kmeans算法的意义 三.Kmeans算法代码解析 1.关键概念 2.大致思路 ...

  2. 3d人脸识别算法opencv_10行代码实现人脸识别

    什么是人脸识别 人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术.用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别的一系列相关技术 ...

  3. 【MATLAB深度学习】10行代码实现图像分类

    来自MATLAB官方文档: https://ww2.mathworks.cn/help/deeplearning/gs/try-deep-learning-in-10-lines-of-matlab- ...

  4. RL强化学习算法90行代码快速实战 DQN代码分层讲解

    强化学习DQN算法介绍: DeepMind<Playing Atari with Deep Reinforcement Learning>提出了DQN ,DQN使用卷积神经网络作为价值函数 ...

  5. 炸金花 php算法,200行代码搞定炸金花游戏(PHP版)

    0 ) { //给出一个从小到大的顺序 if( fmod($dian[0], 14 ) >= fmod($value, 14) || fmod($value, 14) == 1 ) { //得到 ...

  6. 快速排序算法讲解及代码(详细)

    快速排序算法 一.序言 二.快速排序基本思想 三.具体步骤 四.具体代码 一.序言 快速排序是一种高效且使用广泛的排序算法,在很多语言的标准库中自带的排序都是快速排序.所以我们也有必要了解快排的原理以 ...

  7. matlab 弗洛伊德算法,手写matlab的弗洛伊德算法的函数(注释很详细)

    function [dist,mypath]=myfloyd(a,sb,db) %输入邻接矩阵a:元素a(i,j)--顶点i到j之间的直达距离,可以是有向的 %sb起点的标号:db终点的标号 %输出: ...

  8. 遗传算法优化LSTM网络结构(实现自动根据适应度函数:即准确率来全局搜索最佳网络结构):主要被优化参数:网络层数,每层的神经元个数,全连接的层数,全连接层的神经元个数。代码有详细注解

    代码视频链接:https://www.bilibili.com/video/BV19q4y1Q7DR/ 代码效果图: 1.优化参数 本文优化的是LSTM的层数参数和各层神经元参数,其中包含了lstm层 ...

  9. 在Matlab实现Kmeans算法(每行代码带注释)

    目录 一.前言 二.VQ概述 三.Kmeans算法 K-means 的算法步骤为: 四.Matlab代码实现过程 五. 一点点可选改动(个人看法) 参考链接: 一.前言 本人对机器学习.人工智能算法方 ...

最新文章

  1. 移动端布局规范-固定页头页尾-中间随高度滑动
  2. JframeMaxSize
  3. 【错误记录】未安装该应用 ( 在 Android 12 之后 组件设置 android:exported=“false“ 属性 )
  4. NIO详解(十三):Java IO 和NIO 总结
  5. JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)
  6. 2021-10-09 求二叉树的高度(递归和迭代版本)
  7. 通过Log4net来配置我们需要的日志文件格式
  8. 洛谷P6097:【模板】子集卷积(FWT)
  9. mysql 行级锁 索引_mysql 行级锁 索引唯一值
  10. ubuntu16.04 kinetic外接Intel Realsense D435i配置教程
  11. ios定制中间突出的tabBar
  12. 2020-08-17 java实战项目汇总
  13. 数字图像处理 matlab 报告总结,matlab 数字图像处理实验报告(五份)
  14. 第一章 使用SOAPUI测试和开发Web Services Stubs
  15. excel合并两列内容_EXCEL数据合并、批量添加内容知识,高手嫌弃,新手太需要...
  16. SpringBoot启动图标修改(通俗易懂)
  17. iApp4Me一周年记
  18. SpringCloud学习过程中遇到错误 Rabbit health check failed
  19. matlab中==、~=、的含义
  20. Dockerfile中的指令与使用教程

热门文章

  1. impala/hive脱敏导数方法,建表跟hdfs路径关联
  2. 如何利用学生认证免费获得jetbrain全家桶
  3. 最详细教程--管理磁盘分区与文件系统(实训报告2)
  4. nc15665 maze 题解 (传送门) 广搜bfs+优先队列
  5. 住酒店集团2014年第一季度营业收入为10.978亿元
  6. jQuery Mobile 按钮、图标
  7. PGET,一个简单、易用的并行调用框架
  8. cocos2dx基础篇(7) 触碰事件
  9. Laravel集成Maatwebsite-Laravel-Excel最新版本v3
  10. 数据 | 2018年智能制造系统集成市场数据