DBSCAN+KD-Tree聚类算法 JAVA版本

最近应老板需求,对面状要素(polygon)根据其距离的远近进行分组/聚类,然后分析比较组间区别以及组内特征。

通过查看网上的介绍,发现对面状要素进行分组/聚类的文章或算法不太多(好吧,我承认我懒,看到比较复杂的算法脑壳就疼),但是对点要素进行聚类的算法相当成熟(K近邻、DBCSAN等等)

emm…于是,我就想能否把面状要素转为点,然后面积作为点的一个属性/权值对其进行聚类呢?

这样做肯定不精确,因为面状要素形状不规则,不同边界到其他面状要素的距离也不同。我这么做一是为了将面积加入到聚类算法中,二是为了简单起见,并不需要特别正确的对面状要素进行分组。
使用ArcGIS的Feature To Point先将面要素转为点,然后给点要素一个权重属性weight,使用字段计算器将面要素的面积赋值给相应的点,最后使用算法对其进行分组。

一开始通过ArcGIS自带的分组分析Grouping Analysis工具进行分类,使用的K近邻聚类方法,这种方法有两个不足:
1、需要指定分组数目,但是这个组的个数我们没法确定
2、当分组数目超过15组时,该工具无法对每类分组进行评估,以找到最合适的分组(虽然可以改工具的代码,调整最大分组数据,但是给我的感觉是没有理论支撑[其实是我调整了最大分组数后脚步运行有问题,懒得调代码了],先作为一个备选方式吧)

后来通过咨询同学,结合网上说的方法,决定使用DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)

有关DBSCAN方面的知识我就不介绍了,我也是刚开始学习,可能理解的不是很深就不误导你们了【但是我写完算法以后才明白这个“具有噪声的”是什么意思】

算法伪代码如下
DBSCAN+KD-Tree聚类算法 JAVA版本_第1张图片

主要参考文章如下:

https://www.cnblogs.com/pinard/p/6208966.html
https://www.cnblogs.com/zhangchaoyang/articles/2182748.html
https://blog.csdn.net/allenalex/article/details/50926032

我自己写的DBSCAN算法github地址

  1. 目前只实现了简单的点聚类,未考虑面积影响
  2. 基于KD-Tree进行近邻搜索

https://github.com/smalltails/DBSCAN.git


10.10后续:
写完以后突然发现没对聚类结果进行评价
然后想起来python的sklearn包应该有详细的算法实现
果真。。。
下一步就是研究python中的dbscan和他的评价方法了。。。


10.15后续
发现有篇文章《Understanding of Internal Clustering Validation Measures》,评价了各个聚类算法的效果,有个算法S_Dbw,好像精度很高。。。这几天应该去好好看看这个算法的思路。。。

参考文章 https://blog.csdn.net/chixujohnny/article/details/51852633

                                  ## 大家!千万不要重复造轮子啊!!!

你可能感兴趣的:(算法学习,DBCSAN,KD-Tree,JAVA,聚类算法)