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实现 的相关文章

  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 如何使用神经网络保存 Sift 特征向量进行分类

    SIFT 特征的 Matlab 实现发现于http www cs ubc ca lowe keypoints http www cs ubc ca lowe keypoints 在 stackoverflow 的帮助下 我想将功能保存到 m
  • 在每次迭代中使用 for 循环的索引命名图像

    我正在使用 MATLAB 进行图像处理项目 我使用 for 循环在每次循环迭代时生成某种图像数据 图像大小不同 我的问题是如何阻止它在下一次迭代中覆盖图像 Img i j data 理想情况下我希望它有 Img 1 data for 1st
  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • MATLAB中如何画水平线和垂直线?

    我目前正在尝试在 MATLAB 中绘制简单的垂直线和水平线 例如 我想绘制线 y 245 我该怎么做呢 MATLAB 根据您提供的向量逐点进行绘图 因此 要创建一条水平线 您需要改变x同时保持y对于垂直线恒定 反之亦然 xh 0 10 yh
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • 在另一列中添加具有特定条件的一列,如 excel 的 sumif

    我有一个像这样的矩阵 A 1 2 2 3 3 4 4 5 5 6 6 8 7 9 8 5 9 4 现在我想添加第二列 条件是如果 limit 0 interval 3 且 limit limit interval 或者换句话说 当第 1 列
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • Matlab 字段名索引[重复]

    这个问题在这里已经有答案了 所以我有一个包含多个表的元胞数组 我试图访问表的第一个列名称 c table1 table2 table3 以下两行都给了我错误 fieldnames c 1 1 fieldnames c 1 1 Error i
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • MATLAB 特征函数

    我很好奇哪里可以找到完整的描述FEATURE功能 它接受哪些论点 没有找到文档 我只听说过memstats and getpid 还要别的吗 gt gt which feature built in undocumented 注意 更完整的
  • 有没有办法在matlab中进行隐式微分

    我经常使用 matlab 来帮助我解决数学问题 现在我正在寻找一种在 matlab 中进行隐式微分的方法 例如 我想区分y 3 sin x cos y exp x 0关于dy dx 我知道如何使用数学方法通常做到这一点 但我一直在努力寻找使
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • matlab中的排列函数是如何工作的

    这是一个有点愚蠢的问题 但我似乎无法弄清楚排列在 matlab 中是如何工作的 以文档为例 A 1 2 3 4 permute A 2 1 ans 1 3 2 4 到底是怎么回事 这如何告诉 matlab 3 和 2 需要交换 哇 这是我迄
  • 如何使用 MATLAB 的 substruct 函数创建表示使用“end”的引用的结构?

    我想使用substruct http www mathworks com help matlab ref substruct html函数创建一个结构体以供使用subsref 目的是使用索引字符串subsref而不是通常的 符号 因为我正在
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和

随机推荐

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

    大家好 我是你们的晴天学长 在计算级网络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生成的随机标签向量