绪论
刚刚完成了一个关于DBSCAN的作业,由于刚开始学习MATLAB的使用便用它完成了一个练手任务,有一点想法记录下来。以便于后来重新学习这个方法和记录一些函数,同时也希望能给同学着一点思路。有问题也请留言,会不断改正。
参考博客指路:看了不少,链接挺多,有些忘了,欢迎指出改正
推荐一个基础知识点整理的比较好的博主
万勇’s Blog
https://blog.csdn.net/qiu1440528444/article/details/80763420?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160601820019195264744375%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=160601820019195264744375&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-80763420.first_rank_ecpm_v3_pc_rank_v2&utm_term=matlab+%E5%AE%9E%E7%8E%B0DBSCAN&spm=1018.2118.3001.4449
任务目标
1.生成一个双月型数据集;
2.使用KNN求出E-PS,在本实验中预先设置了Min-point =4;
3,利用DBSCAN分类,展示分类结果
4,顺便赚点币下载别人资料(手动狗头)
实验思路
对于DBSCAN算法来说,我们需要关注以下几点:
数据集 Min-pot(阈值) Eps(半径)
有了这些才能开始算法,即使是调用封装好的函数,也是需要这些变量
这些概念可在文章开头推荐发博客中找到。
实验过程
1.生成双月型数据集
1.1思想
设计了一个半圆环,在matlab可以通过rand()函数在这个范围内生成随机数,
代码如下:
```tmp=[2*(r+w2)*(rand(N1,1)-0.5) (r+w2)*rand(N1,1)];
tmp(:,3)=sqrt(tmp(:,1).*tmp(:,1)+tmp(:,2).*tmp(:,2)); %求到原点距离
```bash
通过镜像和位移获得第二个半圆,N(生成点数量是可以自己定义)
完整代码资源指路:
https://download.csdn.net/download/Enjoy324/13137793
(在我的代码中为了简单,是把圆的大小写死了,当然,你们可以加个判断if写成可输入的模式)
2求EPS
在本次实验中,由上文生成了一个200个点的双月型数据集
2.1如何求EPS
思想:求Eps的方法有很多,在这里只是提供了一种简单的思想。针对本实验是够用了。
这种方法是求出第K近邻距离,并且将其排序(注意,不是K近邻,是第K近邻,换句话说对于200个点的数据集来说,只是一个【200,1】矩阵)
通过调用k近邻函数将距离最近的前五个保存在一个数组中,
[IDX,Dist]=knnsearch(A(1:numData,:),A(1,:),'k',5);
因为Dist包含到自己本身的距离,所以想用第四近邻点是【1.5】
将该点
保存在新的数组中
Kdist(1)=Dist(1,5);`
重复这个过程得到一个200*1的数组
排序后,将其作为纵坐标,,将点的数量作为横坐标画图找转折点来确定Eps
画图如下:
该部分完整代码指路:
https://download.csdn.net/download/Enjoy324/13137793
如图,该转折点的纵坐标在(3,3.5),因此我们暂选3.2(随意挑选,对于本次实验来讲,其实可以选择的误差允许很多)
3.如何利用DBSCAN分类
3.1数据准备
由上文我们获得了( 数据集 Min-pot Eps)
如果你只是使用,直接找个人家封装好的调用呀(狗头)
3.2在这部分我想用伪代码解释应该更清楚并且记录一下我用到的函数。
1.从数据集中取出一个点,检查有没有被遍历
if ~visited(i) %是否被遍历
visited(i)= true;
Neighbors = RegionQuery(i);
2.如果被遍历,直接将其归为已存在簇中
3.检查是不是噪音
找到其所有密度可达点生成新簇
numel() %数出有多少点跟Min-point 对比判断是不是噪音
具体代码指路
https://download.csdn.net/download/Enjoy324/13137793
(我将DBSCAN封装好了,调用就好,
找密度可达点函数封装在了DBSCAN函数中)
总结
DBSCAN其实网上有很多资料,优缺点也不赘述了,正如我推荐的博客一样。已经总结的很好。而我只是将我这次做的作业思路写了出来。由于目前事情比较多,没有时间一步步介绍。吃过晚饭匆匆忙忙写到这里,本想记录下所学函数,却得忙别的事情,这里只提供实验思路的介绍吧,等我有时间再完善,如果对您有帮助。
最后看到这了点个赞呗!
注:
仅供学习,欢迎交流,未经允许,请勿转载和他用