当前位置:   article > 正文

DBSCAN聚类算法——MATLAB实现_dbscan聚类算法matlab代码

dbscan聚类算法matlab代码

    声明:本文修改自《数学建模清风》老师的代码

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

        作为经典的聚类算法,DBSCAN聚类在数学建模竞赛中用到的概率很大。本文不详细展开讲解DBSCAN的原理,只介绍相关代码的使用步骤。

DBSCAN函数代码:

  1. function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
  2. C=0;
  3. n=size(X,1);
  4. IDX=zeros(n,1); % 初始化全部为0,即全部为噪音点
  5. D=pdist2(X,X);
  6. visited=false(n,1);
  7. isnoise=false(n,1);
  8. for i=1:n
  9. if ~visited(i)
  10. visited(i)=true;
  11. Neighbors=RegionQuery(i);
  12. if numel(Neighbors)<MinPts
  13. % X(i,:) is NOISE
  14. isnoise(i)=true;
  15. else
  16. C=C+1;
  17. ExpandCluster(i,Neighbors,C);
  18. end
  19. end
  20. end
  21. function ExpandCluster(i,Neighbors,C)
  22. IDX(i)=C;
  23. k = 1;
  24. while true
  25. j = Neighbors(k);
  26. if ~visited(j)
  27. visited(j)=true;
  28. Neighbors2=RegionQuery(j);
  29. if numel(Neighbors2)>=MinPts
  30. Neighbors=[Neighbors Neighbors2]; %#ok
  31. end
  32. end
  33. if IDX(j)==0
  34. IDX(j)=C;
  35. end
  36. k = k + 1;
  37. if k > numel(Neighbors)
  38. break;
  39. end
  40. end
  41. end
  42. function Neighbors=RegionQuery(i)
  43. Neighbors=find(D(i,:)<=epsilon);
  44. end
  45. end

绘制聚类图的代码:
 

  1. function PlotClusterinResult(X, IDX)
  2. k=max(IDX);
  3. Colors=hsv(k);
  4. Legends = {};
  5. for i=0:k
  6. Xi=X(IDX==i,:);
  7. if i~=0
  8. Style = 'x';
  9. MarkerSize = 8;
  10. Color = Colors(i,:);
  11. Legends{end+1} = ['Cluster #' num2str(i)];
  12. else
  13. Style = 'o';
  14. MarkerSize = 6;
  15. Color = [0 0 0];
  16. if ~isempty(Xi)
  17. Legends{end+1} = 'Noise';
  18. end
  19. end
  20. if ~isempty(Xi)
  21. plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);
  22. end
  23. hold on;
  24. end
  25. hold off;
  26. axis equal;
  27. grid on;
  28. legend(Legends);
  29. legend('Location', 'NorthEastOutside');
  30. end

接下来是主函数:

  1. clc;
  2. clear;
  3. close all;
  4. load mydata;
  5. %%注意,此处Data.mat用于导入自己的数据,数据名字要用X,或者在下方改变量名也可以
  6. if size(X,2)==2
  7. %%如果列数=2才可以运算
  8. epsilon=0.5;
  9. %%规定聚类半径
  10. MinPts=10;
  11. %%规定半径内最小数目点
  12. %%上面两个参数对聚类的结果很敏感,可以多次修改得出最好的结果
  13. IDX=DBSCAN(X,epsilon,MinPts);
  14. %%调用DBSCAN函数,输入参数有三个,分别是原始数据,聚类半径,最小数目点
  15. %%IDX用于保存每一项数据所属的聚类类别数目
  16. PlotClusterinResult(X, IDX);
  17. %%画出聚类结果图
  18. title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
  19. else
  20. disp("请修改数据,DBCASN对二维聚类最佳!")
  21. end

如下是聚类结果:

 使用要点:

        前两个函数分别保存为独立的m文件,将其与主函数放置同一文件夹目录之下即可。此外,自己的数据要独立保存为.mat文件,也在同一目录之下。最后直接运行main函数即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/80119
推荐阅读
相关标签
  

闽ICP备14008679号