一、基本原理

基于密度的聚类方法,聚类前不需要预先指定聚类的个数,生成的簇的个数基于给定数据。优点:能发现任意形状的簇,同时过滤噪声信号。
三种数据
核心点:在半径Eps内含有不少于MinPts数目的点
边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的领域内
噪音点:既不是核心点也不是边界点的点
密度聚类.png

二、代码(来自matlab源码)

  1. %
  2. % Copyright (c) 2015, Yarpiz (www.yarpiz.com)
  3. % All rights reserved. Please read the "license.txt" for license terms.
  4. %
  5. % Project Code: YPML110
  6. % Project Title: Implementation of DBSCAN Clustering in MATLAB
  7. % Publisher: Yarpiz (www.yarpiz.com)
  8. %
  9. % Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
  10. %
  11. % Contact Info: sm.kalami@gmail.com, info@yarpiz.com
  12. %
  13. function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
  14. %epsilon表示点的半径,MinPts表示关键点半径内所需包含的最小点数
  15. C=0;
  16. n=size(X,1); % n代表点的数量
  17. IDX=zeros(n,1); % IDX存储了所有元素的分类,初始化全部为0,即全部为噪音点
  18. D=pdist2(X,X); % 计算两点之间的距离
  19. visited=false(n,1); %初始化
  20. isnoise=false(n,1);
  21. for i=1:n
  22. if ~visited(i)
  23. visited(i)=true;
  24. Neighbors=RegionQuery(i);% 找到半径内所包含的点
  25. if numel(Neighbors)<MinPts % 标记噪音点
  26. % X(i,:) is NOISE
  27. isnoise(i)=true;
  28. else
  29. C=C+1;
  30. ExpandCluster(i,Neighbors,C);
  31. end
  32. end
  33. end
  34. function ExpandCluster(i,Neighbors,C) % 找到同一类的点并打标
  35. IDX(i)=C;
  36. k = 1;
  37. while true
  38. j = Neighbors(k);
  39. if ~visited(j)
  40. visited(j)=true;
  41. Neighbors2=RegionQuery(j);
  42. if numel(Neighbors2)>=MinPts
  43. Neighbors=[Neighbors Neighbors2]; %#ok
  44. end
  45. end
  46. if IDX(j)==0
  47. IDX(j)=C;
  48. end
  49. k = k + 1;
  50. if k > numel(Neighbors)
  51. break;
  52. end
  53. end
  54. end
  55. function Neighbors=RegionQuery(i)
  56. Neighbors=find(D(i,:)<=epsilon);
  57. end
  58. end