DBSCAN的理解和matlab实现

2023-11-17

DBSCAN是基于密度的聚类算法,以下总结一下编写matlab时遇到的一些问题。

1、算法的基本流程

步骤1 : 首先初始化变量,主要包括原始数据变量(此处为一个二维矩阵,包括x,y坐标,共1500个采样点),由randmperm生成的随机标签向量(一个一维的列向量),这个向量主要是用来随机挑选数据中的一个点开始分类。初始化数据的分类代号向量,这是一个一维列向量,他的值表征了每一个采样点是被分为哪一类。计算距离矩阵,这是一个二维的矩阵,主要是计算个点之间的距离。

步骤2 :生成用于分类的数据,参考程序中的生成方法

步骤3:开始按照randmperm的随机标签来遍历数据集中的数据,若当前遍历到的数据点已经被分类完成(即其分类代号向量中的值不再是0,而被赋予了其他值),那么跳过已完成的分类点,如果当前点没有被分类过,那么进入下一个步骤。

步骤4:按照DBSCAN的想法,我们首先要搜寻半径为rmax领域内所有的点,搜索完成后得到领域内数据点的个数,以及他们在数据矩阵中的位置。之后判定领域内数据点的个数是否满足最小个数要求,如果不满足,那么这是个噪声点,直接将其分类代号赋值为-1(表示噪声点);如果他满足领域内最小点数要求,那么进入下一步

步骤5:这一步关键要想清楚一件事前,假设我们首先初始化一个队列向量,他用来存储第4步中搜索得到的领域中所有点的标号,按照算法,下一步需要以领域中的每一个点在作为中心点去搜寻他们各自领域中的点,判定是否满足条件,这里有点别捏,我们详细的说明

假设初始化队列Qurey = [] ;%给他赋空值

并且 Qurey = [Qurey epsilonspace];%把第四步中遍历得到领域内的点首先给到队列之中,其中

                                                        %epsilonspace包含的是第四步中搜寻得到的领域内的所有点

//由于Qurey中的点还要在继续遍历,所以他的长度是要根据数据来自动增加的,每遍历一个Qurey中的点的领域,那些符合条件的点在按顺序补齐在Qurey之后,然后知道遍历完成所有的点,即结束,所以按照这个思路,实现的方法如下:

Qurey = [Qurey epsilonspace];   %把核心点在领域范围内的点都取出来
                      
countervalid = length(Qurey);
kcount = 1;

%开始对中心点内的所有点做遍历,由于此处需要不断地添加Qurey的个数,但是不同核心点中领 %域内可能存在相同的点,就是C点即在A的领域内,又在B的领域内,所以为了避免这种情况,需 %要删除在遍历过程中相同的点,
while(kcount <= countervalid) %这么写的目的就是为了方便删除相同的点


            Q = Qurey(kcount);

           %这是个领域搜寻函数,他的结果是输出领域内点的个数以及符合点的位置
            [tempnumber tempspace] = Searchepsilon(Q , rmax , clustter);

            %这个是个bug修复,因为距离矩阵计算时自己和自己的距离也算了是0
            tempspace(find(tempspace == Q)) = [];
            if tempnumber > pmin%pmin是聚类的最小要求点数
                difftemp = setdiff(tempspace , Qurey);
                Qurey = [Qurey difftemp];        %这个是把不同的点在重新添加到队列中
                clustter(Qurey) = clusttercount; %clusttercount表示了类的标号
            else
               clustter(Q) = clusttercount;   %表征这是边界点 ,任然归为当前类,此处不做特殊处理
            end
            kcount = kcount + 1;
            countervalid = length(Qurey);
        end
        clusttercount = clusttercount + 1;
    end 

步骤6 在完成步骤5后,相当于是一个点他完成了与他所有密度想通点的分类,我们可以跳转到第三步开始选择其他的点开始遍历。

下面是matlab代码

clearvars; close all;clc;
dbstop if error;
model_class = 3;
dim = 2;
% 期望值
m = [0, 0;
    2, 2;
    -2, -2];
% 协方差阵
s(:, :, 1) = [0.1, 0;
              0, 0.1];
s(:, :, 2) = [0.5, 0.3;
              0.3, 0.5];
s(:, :, 3) = [1, -0.5;
              -0.5, 1];
          
num = [500, 500, 500];
data = generate_data_GMM(dim, model_class, m, s, num);
data = data(:, (1:2));
figure;
scatter(data(:,1),data(:,2));
xlim([-5 5]);
ylim([-5 5]);

%% DBSCAN
global distanmatrix;
datasize = size(data,1);
index = randperm(datasize);
clustter = zeros(datasize , 1);     %数据样本点的分类信息 0为初始值,-1为噪声点值
distanmatrix = squareform(pdist(data));

rmax = 0.3 ; 
pmin = 12;
clusttercount = 1;

for i = 1 : 1 : datasize    %开始遍历数据库中的数据,是以随机序列的顺序来完成遍历的
    
    currentindex = index(i);
    currentpoint = data(currentindex,:);    %获取当前的数据
    
    if clustter(currentindex) ~= 0
       continue; 
    end
    Qurey = [];
    [epsilonnumber epsilonspace] = Searchepsilon(currentindex , rmax , clustter);  % 获取当前点的epsilon领域内的所有点,以及他们对应的标号
    
    if epsilonnumber < pmin
        clustter(currentindex) = -1;        %如果不满足领域个数条件,判定该点为噪声点    
    else
        clustter(currentindex) = clusttercount;
        epsilonspace(find(epsilonspace == currentindex)) = [];
        Qurey = [Qurey epsilonspace];   %把核心点在领域范围内的点都取出来
                      
        countervalid = length(Qurey);
        kcount = 1;
        cnt = 1;
        while(kcount <= countervalid)   %开始对中心点内的所有点做遍历,由于此处需要不断地添加Qurey的个数,所以查询完成一个就删除一个
            Q = Qurey(kcount);
            [tempnumber tempspace] = Searchepsilon(Q , rmax , clustter); 
            tempspace(find(tempspace == Q)) = [];
            if tempnumber > pmin
                difftemp = setdiff(tempspace , Qurey);
                if(~isempty(difftemp))                   
                    cnt = cnt + 1;
                end
                Qurey = [Qurey difftemp];
                clustter(Qurey) = clusttercount;
            else
               clustter(Q) = clusttercount;   %表征这是边界点 ,任然归为当前类,此处不做特殊处理
            end
            kcount = kcount + 1;
            countervalid = length(Qurey);
        end
        clusttercount = clusttercount + 1;
    end  
end

for i = 1 : 1 : clusttercount-1
   
    scatter(data(find(clustter == i),1),data(find(clustter == i),2));hold on;
end
scatter(data(find(clustter == -1),1),data(find(clustter == -1),2) , '*');hold on;
xlim([-5 5]);
ylim([-5 5]);
grid on;

% 领域搜寻函数,以currentpoint为中心点,搜寻其领域为rmax范围内所有的点的个数以及其领域内的所有点;
function [epsilonnumber epsilonspace] = Searchepsilon(currentindex , rmax , clustter)
    global distanmatrix;    %全局变量
    valiedindex = find(distanmatrix(currentindex , :) <= rmax);
%     deletindex = find(clustter ~= 0);
%     for i = 1 : length(deletindex)
%        
%         valiedindex(find(valiedindex == deletindex(i))) = [];
%     end
    

    epsilonnumber = length(valiedindex);
    epsilonspace = valiedindex;
end



%%
function data = generate_data_GMM(dim, model_class, m, s, num)
    %   生成多组多维高斯分布数据
    %   dim为高斯分布的维数
    %   model_class为生成的数据组数
    %   m为高斯分布的期望值,大小为model_class*dim
    %   s为高斯分布的协方差阵,大小为dim*dim*model_class
    %   num为各组高斯分布的数据量,其大小为model_class*1
    %   返回值data为生成的数据,其大小为num*(dim+1)
    %   前dim列为高斯分布数据,第(dim+1)列为组的类别编号
    %   该函数用于生成多组高斯分布数据,可为聚类算法提供数据
    data = [];
    for i = 1 : model_class
        data1 = ones(num(i), dim + 1);
        data1(:, (1 : dim)) = mvnrnd(m(i, :), s(:, :, i), num(i));
        for j = 1 : num(i)
            data1(j, dim + 1) = i;
        end
        data = [data; data1];
    end
end

 左边是原始数据,右边是分类完成的数据,“ * ”号点表示是噪声点,原点表示的是分类的点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DBSCAN的理解和matlab实现 的相关文章

  • 将 3d 矩阵重塑为 2d 矩阵

    我有一个 3d 矩阵 n by m by t 在 MATLAB 中表示n by m一段时间内网格中的测量值 我想要一个二维矩阵 其中空间信息消失了 只有n m随着时间的推移测量t剩下 即 n m by t 我怎样才能做到这一点 你需要命令r
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • 在 MATLAB 中定义其他中缀运算符

    有没有办法在 MATLAB 中定义额外的中缀运算符 具体来说 我想定义两个中缀运算符 gt and lt gt 这些符号是理想的 但如果需要 它可以是单个字符 它调用函数implies and iff以同样的方式 calls and and
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • 归一化互相关的基础知识

    我正在尝试使用范数校正2 归一化互相关 http en wikipedia org wiki Cross correlation Normalized cross correlation 来自 MATLAB 用于计算发育中胚胎中移动形状的速
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • getappdata 在 MATLAB 中返回空矩阵

    我有一段代码 我在其中使用setappdata然后我使用以下方式调用数据getappdata即使它不为空 它也会返回一个空矩阵 我的一段简化代码如下 function edit1 Callback hObject eventdata han
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 在 MATLAB 中模拟 C++ 模板

    我试图找出创建 C 模板或 Java 通用对象的替代方案的最佳方法 出于多种不同的原因 我过去曾多次想这样做 但现在我想做的是为几个相关的类创建 saveobj 和 loadobj 函数 我的想法是 我想要一组通用的例程来创建默认结构 然后
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • MATLAB 除法...29/128 应该返回 0 吗?

    我真的不认为这是一个精度问题 答案应该是0 226左右 这是确切的代码 val I i j bucketSize pos val bucketSize I只是我从中获取值的矩阵 以下是 MATLAB 的输出 val 29 bucketSiz
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu

随机推荐

  • 常见的网络连接设备有哪些?

    大家好 我是你们的晴天学长 在计算级网络OSI体系结构和TCP IP模型中 网络连接设备是很重要的知识 在多个参考层中都有它的身影 请需要的小伙伴自取哦 网络互联设备 1 中继器 特点 转发所有接收到的信号 增加了网络的负担 网段上所有的节
  • .form文件_Feign完美解决服务之间传递文件、传递list,map、对象等情况

    先说下背景 前段时间有一个需求 需要将服务A生成的一个文件传递到服务B 交予服务B去做处理 最开始的时候使用的spring cloud starter openfeign 发现这一块是不支持的 然后引入了io github openfeig
  • 使用ftp服务修改删除重命名以及创建文件存取数据

    1删除 String ftpPath var ftp pub images 下载 String localPath home wang 下载 two15392444531 rar 上传 String localPath home wang
  • 【一个或多个筛选器或者Listeners启动失败 的问题探索以及解决方案】

    1 问题描述 使用IDEA作为开发工具 使用Maven作为项目管理工具 完成一个web项目后使用Tomcat作为服务器启动项目 报错一个或多个筛选器启动失败或者org apache catalina core StandardContext
  • 小程序点击右上角按钮退出,再进入时直接进入首页

    使用场景 小程序项目中 测试提了个bug 说进入某个页面之后 直接点右上角的退出 再进入小程序时 打开的是之前退出时的页面 有时左上角就没有后退按钮了 无法返回上一页 这里就涉及到页面栈的问题了 页面栈 首先先来了解一下微信小程序的运行环境
  • HTML详解连载(2)

    HTML详解连载 2 专栏链接 link http t csdn cn xF0H3 下面进行专栏介绍 开始喽 超链接 作用 代码示例 解释 经验分享 音频标签 代码示例 注意 强调 视频标签 代码示例 注意 强调 列表 作用 布局内容排列整
  • Unity Joint用法及案例

    本篇文章主要讲解如何在Unity中使用Joint组件完成一些刚体物理之间的连接效果 并且讲解一个简单案例 什么是Joint 官方文档介绍 Joint可以连接一个刚体与 另一个刚体 或世界空间某点 Joint可以通过施加力的方式来限制运动 j
  • 华硕服务器主板型号命名规则,华硕ROG系列主板命名规则详解_华硕 Maximus V Formula_主板评测-中关村在线...

    ROG玩家国度系列主板命名规则详解 玩家国度系列主板的命名方式虽然不是很常规 并且目前市售ROG系列主板仅有8款 但也遵循了一定的规则 ROG主板的命名公式为ABC AB共同代表了主板的芯片组名称 C代表主板所属系列 芯片组名称部分 Cro
  • stm32学习笔记----------从零开始

    引脚的初始化 1 GPIO InitTypeDef GPIO InitStructure 语句定义了一个GPIO InitTypeDef类型的变量 名为GPIO InitStructure 2 GPIO InitStructure GPIO
  • nginx请求超时设置

    默认60秒超时 http 配置在该区域会影响所有的server块 以下解决504问题 proxy connect timeout 300 单位秒 默认60 proxy send timeout 300 单位秒 默认60 proxy read
  • Mac/MacBookPro解决运行卡顿问题(非配置问题)

    Mac在升级后可能会出现莫名其妙的卡顿 运行缓慢等问题 如果遇到这种问题可以尝试以下几种方法恢复下 一 以安全模式启动 1 重新启动Mac 然后立即按住Shift键 显示屏上将出现Apple标志 2 看到登录窗口后松开Shift键 3 如果
  • 大厂Code Review 流程

    提交cr的流程 检查代码风格 可以安装googlestyle或者Alibaba的一些stylecheck工具 也许各开发团队会有自己的风格规范 从mainline中同步代码 注意使用 git pull rebase 而不是 git pull
  • 二叉树——初识

    链表 gt 二叉树 gt 二叉查找树 gt 平衡二叉树 二叉树时间复杂度 O logn 即2 x 树的深度 N 如 21亿点需要查找几次 2 32 21亿 查找32次 1 满二叉树 2 完全二叉树 设二叉树的深度为h 除第 h 层外 其它各
  • ⛳ Git安装与配置

    Git安装配置目录 Git安装与配置 一 git的安装 1 下载git 2 下载完成之后 双击安装即可 3 更改安装目录 没有中文且没有空格 4 所有设置选择默认设置即可 5 最后 点击Fanish 完成安装 二 检查Git版本 三 配置
  • Python 配置文件(.ini、 .conf、 .cfg)的读写

    python读取配置文件两个常用模块 ConfigParser和configobj模块 1 对比 ConfigParser的一些问题 不能区分大小写 重新写入的配置文件不能保留原有配置文件的注释 重新写入的配置文件不能保持原有的顺序 不支持
  • keil5中添加lpc213x系列芯片

    好久不见 keil5中添加lpc213x芯片 1 首先下载keil5 网上资料很多 这里就不再多述了 2 然后去这个网站 http www2 keil com mdk5 legacy 这里要注意 安装的位置要是你keil5文件的位置 3 重
  • F分布是由两个独立的卡方分布的比值所得到的分布

    import numpy as np from scipy stats import f F分布 分析两个正态分布方差比值的分布情况 F分布是由两个独立的卡方分布的比值所得到的分布 检验两个样本方差是否相等 常被用于统计分析 财务分析 市场
  • 如何实现两个数据库之间表的同步更新(增,删,改)

    这里如果知道触发器的使用方法的话 解决这个问题就很简单了 触发器 就是 种特殊的存储过程 触发器和存储过程 样是 个能够完成特定功能 存储在数据库服务器上的SQL 段 但是触发器 需调 当对数据表中的数据执 DML操作时 动触发这个SQL
  • 关于fft那些简单却难的问题们

    目录 1 傅里叶变换定义 2 频率轴设置 3 频谱幅度 4 频谱混叠 5 频谱泄露 6 频谱相位 傅里叶变换方法认为任意一个具有连续周期的信号可以根据一组由正弦和余弦曲线构成的三角函数的曲线组合而成或任意逼近 经过长期以来的发展 傅里叶变换
  • DBSCAN的理解和matlab实现

    DBSCAN是基于密度的聚类算法 以下总结一下编写matlab时遇到的一些问题 1 算法的基本流程 步骤1 首先初始化变量 主要包括原始数据变量 此处为一个二维矩阵 包括x y坐标 共1500个采样点 由randmperm生成的随机标签向量