DBSCAN全称Density-Based Spatial Clustering of Applications with Noise,是一种密度聚类算法。

和Kmeans相比,不需要事先知道数据的类数。

以编程的角度来考虑,具体算法流程如下:

1.首先选择一个待处理数据。

2.寻找和待处理数据距离在设置半径内的数据。

3.将找到的半径内的数据放到一个队列中。

4.拿队列头数据作为当前待处理数据并不断执行第2步。

5.直到遍历完队列中所有数据,将这些数据记为一类。

6.选择没有处理到的数据作为一个待处理数据执行第2步。

7.直到遍历完所有数据,算法结束。

大概就是下图所示的样子:

我这里没有单独输出离群点,不过稍微改进增加离群点个数判断阈值应该就可以,比较容易修改。

代码如下:

clear all;
close all;
clc; theta=:0.01:*pi;
p1=[*cos(theta) + rand(,length(theta))/;*sin(theta)+ rand(,length(theta))/]; %生成测试数据
p2=[*cos(theta) + rand(,length(theta))/;*sin(theta)+ rand(,length(theta))/];
p3=[cos(theta) + rand(,length(theta))/;sin(theta)+ rand(,length(theta))/];
p=[p1 p2 p3]'; randIndex = randperm(length(p))'; %打乱数据顺序
p=p(randIndex,:);
plot(p(:,),p(:,),'.') flag = zeros(length(p),); %聚类标记
clsnum = ; %类的个数
disnear = 0.3; %聚类半径 for i=:length(p)
nxtp = p(i,:); %初始聚类半径内的邻域点队列
if flag(i)==
clsnum = clsnum+;
pcstart = ; %设置队列起始指针
preflag = flag; %聚类标记更新
while pcstart<=length(nxtp) %判断是否完成队列遍历
curp = nxtp(pcstart,:); %得到当前要处理的点
pcstart = pcstart+; %队列指针更新
diffp = p-curp; %这里直接和所有数据比较了,数据量大的时候可以考虑kdtree
dis = sqrt(diffp(:,).*diffp(:,)+diffp(:,).*diffp(:,)); %判断当前点与所有点之间的距离 ind = dis<disnear; %得到距离小于阈值的索引
flag(ind) = clsnum; %设置当前聚类标记 diff_flag = preflag-flag;
diff_ind = (preflag-flag)<; %判断本次循环相比上次循环增加的点 tmp = zeros(length(p),);
tmp(diff_ind) = clsnum;
flag = flag + tmp; %增加的点将其标记为一类
preflag = flag; %聚类标记更新
nxtp = [nxtp;p(diff_ind,:)]; %增加聚类半径内的邻域点队列
end
end
end

%聚类可能不止三组,我偷懒不想判断并plot了
figure;
plot(p(flag==,),p(flag==,),'r.')
hold on;
plot(p(flag==,),p(flag==,),'g.')
plot(p(flag==,),p(flag==,),'b.')

结果如下:

原始数据:

聚类结果:

matlab练习程序(DBSCAN)的更多相关文章

  1. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  2. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  3. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

  4. matlab练习程序(透视投影,把lena贴到billboard上)

    本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将 ...

  5. matlab练习程序(多圆交点)

    最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...

  6. matlab练习程序(矩形变换为单连通形状)

    变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了. 虽然非单连通模板也有办法处理,不过不是这里要讨论的. 这里用到的方法和矩形变换为圆那片文 ...

  7. matlab练习程序(渲染三原色)

    这里我用的空间是x向右为正,y向下为正,z向屏幕里面为正.相当于标准右手系绕x轴旋转了180度. 将三个点光源放在 r = [0.3,0,0.5];g = [0.3,-0.5*cos(pi/6),-0 ...

  8. matlab练习程序(生成希尔伯特曲线)

    能够使用这样一条线遍历图像中所有的像素,不过这里没有这样做,而只是生成了这样一条曲线. 程序中h,w是最终图像的高和宽,n为希尔伯特曲线阶数. 这里如果n等于log2(h)或log2(w),则图像就全 ...

  9. matlab练习程序(随机直线采样)

    我只是感觉好玩,写了这样一段程序. 原理就是先随机生成两个点,然后根据这两个点画直线,最后在直线上的像素保留,没在直线上的像素丢弃就行了. 最后生成了一幅含有很多空洞的图像. 当然,对含有空洞的图像是 ...

随机推荐

  1. Android开发笔记:Android开发环境搭建

    基于Eclipse开发 1. 安装JDK 首先进入JDK下载页面,选择需要的版本下载安装. JDK 下载地址:https://www.oracle.com/technetwork/java/javas ...

  2. bzoj1812 [IOI2005]riv河流

    题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个 ...

  3. PKUWC/SC 做题笔记

    去年不知道干了些啥,什么省选/营题都没做. 现在赶应该还来得及(?) 「PKUWC2018」Minimax Done 2019.12.04 9:38:55 线段树合并船新玩法??? \(O(n^2)\ ...

  4. python做中学(七)ord() 函数

    描述 ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII ...

  5. 从游击队到正规军(二):马蜂窝旅游网的IM客户端架构演进和实践总结

    一.引言 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不断扩展.这促使所有的移动应用开发者都要从用户 ...

  6. 解决centos下tomcat启动太慢 & JDBC连接oracle太慢的问题

    近期遇到一个非常奇怪的问题,也不知道改了什么,tomcat启动非常慢,以前几秒就启动好了,现在要30秒左右. 而且,通过jdbc连接oracle数据库也非常慢,以前建立一个连接只要几十毫秒,现在也要1 ...

  7. 深入理解Java中的Garbage Collection

    前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对Ho ...

  8. HikariCP监控指标介绍和应用

    概述 HikariCP提供了一些监控指标,他的监控指标都是基于MicroMeter提供出来的,然后支持Prometheus和Dropwizard.本次我们将讨论一下HikariCp的监控指标有哪些,为 ...

  9. 安装Keepalived namespaces.c:187: error: ‘SYS_setns’ undeclared (first use in this function)

    错误信息 namespaces.c: In function ‘setns’: namespaces.c:: error: ‘SYS_setns’ undeclared (first use in t ...

  10. c# 字符串中全角和半角字符互转

    public class ConvertDBCAndSBC { /// <summary>半角转成全角 /// 半角空格32,全角空格12288 /// 其他字符半角33~126,其他字符 ...