一.算法概述

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

  该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是由于它直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征密度的参数,因此也具有两个比较明显的弱点:

  (1)当数据量增大时,要求较大的内存支持I/O消耗也很大;

  (2)当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差(有些簇内距离较小,有些簇内距离很大,但是Eps是确定的,所以,大的点可能被误判断为离群点或者边界点,如果Eps太大,那么小距离的醋内,可能会包含一些离群点或者边界点,KNN的k也存在同样的问题)。

  (1)与K-MEANS比较起来,不需要输入要划分的聚类个数;

  (2)聚类簇的形状没有偏倚(这个不明白啥意思);

  (3)可以在需要时输入过滤噪声的参数;

二.算法基本定义

三.算法描述

3.1 算法前提

  DBSCAN算法基于一个事实:一个聚类可以由其中的任何核心对象唯一确定。等价可以表述为:任一满足核心对象条件的数据对象p,数据库D中所有从p密度可达的数据对象o所组成的集合构成了一个完整的聚类C,且p属于C。

3.2 算法流程

四.算法实现

  1. %% DBSCAN
  2. clear all;
  3. clc;
  4. %% 导入数据集
  5. % data = load('testData.txt');
  6. data = randn(50,2);
  7. % 定义参数EpsMinPts
  8. MinPts = 5;
  9. Eps = epsilon(data, MinPts);
  10. [m,n] = size(data);%得到数据的大小
  11. x = [(1:m)' data];
  12. [m,n] = size(x);%重新计算数据集的大小
  13. types = zeros(1,m);%用于区分核心点1,边界点0和噪音点-1
  14. dealed = zeros(m,1);%用于判断该点是否处理过,0表示未处理过
  15. dis = calDistance(x(:,2:n));
  16. number = 1;%用于标记类
  17.  
  18. %% 对每一个点进行处理
  19. for i = 1:m
  20. %找到未处理的点
  21. if dealed(i) == 0
  22. xTemp = x(i,:);
  23. D = dis(i,:);%取得第i个点到其他所有点的距离
  24. ind = find(D<=Eps);%找到半径Eps内的所有点
  25. %% 区分点的类型
  26. %边界点
  27. if length(ind) > 1 && length(ind) < MinPts+1
  28. types(i) = 0;
  29. class(i) = 0;
  30. end
  31. %噪音点
  32. if length(ind) == 1
  33. types(i) = -1;
  34. class(i) = -1;
  35. dealed(i) = 1;
  36. end
  37. %核心点(此处是关键步骤)
  38. if length(ind) >= MinPts+1
  39. types(xTemp(1,1)) = 1;
  40. class(ind) = number;
  41.  
  42. % 判断核心点是否密度可达
  43. while ~isempty(ind)
  44. yTemp = x(ind(1),:);
  45. dealed(ind(1)) = 1;
  46. ind(1) = [];
  47. D = dis(yTemp(1,1),:);%找到与ind(1)之间的距离
  48. ind_1 = find(D<=Eps);
  49.  
  50. if length(ind_1)>1%处理非噪音点
  51. class(ind_1) = number;
  52. if length(ind_1) >= MinPts+1
  53. types(yTemp(1,1)) = 1;
  54. else
  55. types(yTemp(1,1)) = 0;
  56. end
  57.  
  58. for j=1:length(ind_1)
  59. if dealed(ind_1(j)) == 0
  60. dealed(ind_1(j)) = 1;
  61. ind=[ind ind_1(j)];
  62. class(ind_1(j))=number;
  63. end
  64. end
  65. end
  66. end
  67. number = number + 1;
  68. end
  69. end
  70. end
  71. % 最后处理所有未分类的点为噪音点
  72. ind_2 = find(class==0);
  73. class(ind_2) = -1;
  74. types(ind_2) = -1;
  75.  
  76. %% 画出最终的聚类图
  77. hold on
  78. for i = 1:m
  79. if class(i) == -1
  80. plot(data(i,1),data(i,2),'.r');
  81. elseif class(i) == 1
  82. if types(i) == 1
  83. plot(data(i,1),data(i,2),'+b');
  84. else
  85. plot(data(i,1),data(i,2),'.b');
  86. end
  87. elseif class(i) == 2
  88. if types(i) == 1
  89. plot(data(i,1),data(i,2),'+g');
  90. else
  91. plot(data(i,1),data(i,2),'.g');
  92. end
  93. elseif class(i) == 3
  94. if types(i) == 1
  95. plot(data(i,1),data(i,2),'+c');
  96. else
  97. plot(data(i,1),data(i,2),'.c');
  98. end
  99. else
  100. if types(i) == 1
  101. plot(data(i,1),data(i,2),'+k');
  102. else
  103. plot(data(i,1),data(i,2),'.k');
  104. end
  105. end
  106. end
  107. hold off

  么么哒.............

  1. %% 计算矩阵中点与点之间的距离
  2. function [ dis ] = calDistance( x )
  3. [m,n] = size(x);
  4. dis = zeros(m,m);
  5. for i = 1:m
  6. for j = i:m
  7. %计算点i和点j之间的欧式距离
  8. tmp =0;
  9. for k = 1:n
  10. tmp = tmp+(x(i,k)-x(j,k)).^2;
  11. end
  12. dis(i,j) = sqrt(tmp);
  13. dis(j,i) = dis(i,j);
  14. end
  15. end
  16. end

  么么哒.............

  1. function [Eps]=epsilon(x,k)
  2. % Function: [Eps]=epsilon(x,k)
  3. %
  4. % Aim:
  5. % Analytical way of estimating neighborhood radius for DBSCAN
  6. %
  7. % Input:
  8. % x - data matrix (m,n); m-objects, n-variables
  9. % k - number of objects in a neighborhood of an object
  10. % (minimal number of objects considered as a cluster)
  11.  
  12. [m,n]=size(x);
  13. Eps=((prod(max(x)-min(x))*k*gamma(.5*n+1))/(m*sqrt(pi.^n))).^(1/n);

  注意:prod是数组内元素的乘积,A^n是A*A*....*A,A.^n是A中每个元素的n次方。

基于密度的聚类之Dbscan算法的更多相关文章

  1. 【机器学习】DBSCAN Algorithms基于密度的聚类算法

    一.算法思想: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层 ...

  2. 简单易学的机器学习算法—基于密度的聚类算法DBSCAN

    简单易学的机器学习算法-基于密度的聚类算法DBSCAN 一.基于密度的聚类算法的概述 我想了解下基于密度的聚类算法,熟悉下基于密度的聚类算法与基于距离的聚类算法,如K-Means算法之间的区别.    ...

  3. 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

  4. DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式

    一.DBSCAN聚类概述 基于密度的方法的特点是不依赖于距离,而是依赖于密度,从而克服基于距离的算法只能发现"球形"聚簇的缺点. DBSCAN的核心思想是从某个核心点出发,不断向密 ...

  5. R与数据分析旧笔记(十六) 基于密度的方法:DBSCAN

    基于密度的方法:DBSCAN 基于密度的方法:DBSCAN DBSCAN=Density-Based Spatial Clustering of Applications with Noise 本算法 ...

  6. 聚类:层次聚类、基于划分的聚类(k-means)、基于密度的聚类、基于模型的聚类

    一.层次聚类 1.层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离.每次将距离最近的点合并到同一个类.然后,再计算类与类之间的距离,将距离最近的类合并为一 ...

  7. 机器学习--聚类系列--DBSCAN算法

    DBSCAN算法 基本概念:(Density-Based Spatial Clustering of Applications with Noise) 核心对象:若某个点的密度达到算法设定的阈值则其为 ...

  8. 聚类之dbscan算法

    简要的说明: dbscan为一个密度聚类算法,无需指定聚类个数. python的简单实例: # coding:utf-8 from sklearn.cluster import DBSCAN impo ...

  9. 基于密度聚类的DBSCAN和kmeans算法比较

    根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次.划分.密度.图论.网格和模型的几大类. 其中,基于密度的聚类算法以DBSCAN最具有代表性.  场景 一 假设有如下图的一组数据, 生成数据 ...

随机推荐

  1. ebay的api的开发技术笔记

    使用eBay API基本步骤介绍 要开始使用eBay API,需要如下基本步骤: 1.    注册开发帐号: https://developer.ebay.com/join/Default.aspx ...

  2. 全选按钮的设定和POST处理当前循环的列表

    以下为全选按钮的代码,通过class实现. //全选按钮 $(function () { $("#selectall").change(function () { var isch ...

  3. 多文件上传artDialog+plupload

    一.效果展示 包括文件上传面板以及文件上传列表 二.介绍 长话短说,采用spring springMVC mybatis maven mysql,实现多文件上传功能,下载使用的是流的形式. 其中涉及的 ...

  4. 使用CInternetSession CHttpFile下载网页链接地址的文件

    思路很清晰,使用CInternetSession创建CHttpFile对象.然后对该对象获取文件信息.进行文件读写操作均可. void DownloadFile(LPCTSTR szURL, LPCT ...

  5. Cllimbing Stairs [LeetCode 70]

    1- 问题描述 You are climbing a stair case. It takes n steps to reach to the top. Each time you can eithe ...

  6. 记一次linux samba服务问题调试

    linux下samba服务加入windows域控后,samba共享名与合法用户名不应一致,否则无法访问此共享.

  7. 《boot分区监控的小脚本》

    #!/bin/bash TEST=`df | grep "boot" |awk '{print $5}' |cut -f1 -d"%"` if [ $TEST ...

  8. ▲教你如何轻易的做linux计划任务▲——小菜一碟

    一次性计划任务的安排: at :安排作业在某一时刻执行一次(一般都是用它) batch:安排作业在系统负载不重时执行一次 第一步: #service atd start  开启一次性计划任务   at ...

  9. Sending Email from mailx Command in Linux Using Gmail’s SMTP

    The mailx or mail command in Linux is still providing service for guys like me, especially when we n ...

  10. 【quartz】 入门

    把技术债务给还了,首先来一个最简单的demo: 2.x版比1.x有很多改进,1.x基于fw1.2: 2.x基于fw3.5以上:语法上有很大的不同,摒弃了很多1.x的很多东西: 直接以2.x来demo ...