1
聚类相关
聚类,通俗的说就是的“物以类聚”,你挨着谁近(地理位置上的意义)就可能是同一类别,反之,就可能不是同属类,这也符合地理学第一定律。
基本原理都是根据要素的自身属性,可能是空间的或者非空间的,利用数学方法按照某种相似性或差异性的指标,定量的确定各个要素之间的亲疏关系,然后按照这种亲疏关系的程度对要素进行聚类。
统计学以及机器学习中都有涉及相关的聚类算法,从地理空间要素的角度考虑,这也是我们GIS中能和机器学习结合的其中一个点,我们对地理空间数据结构、管理组织的理解,也算是相比专业计算机干机器学习的一个小优点。
Postgis主要实现并提供了四种聚类方法,前两个为窗口函数,后两个为聚合函数:
ST_ClusterKMeans -- 该函数是窗口函数,主要是用K-means(K均值聚类)算法进行聚类,算法原理比较简单,容易实现,主要适用于点样本数据,如果是多边形则用多边形的中心点计算,只有一个参数K簇,就是事先明确了要把这一堆样本数据聚成K个类,然后去计算一个目标函数达到最优解,因此K值对结果影响比较大,不太好选取,而且该算法而且适合凸的数据集,这也算法容易收敛;
ST_ClusterDBSCAN -- 该函数也是窗口函数,主要利用DBSCAN算法对输入的地理要空间素进行聚类,该算法基于密度进行聚类,直觉上更加符合认知,主要是通过地理要素分布的紧密程度决定,同一类别的样本之间是紧密相连的,不同样本是分离的。该算法相对复杂,比较常用,聚类效果较好,详细原理这里不做介绍,Spark,python,r语言等提供的很多机器学习包都提供了该算法的实现,曾经也写过简单的python实现,有兴趣可查阅相关资料了解,能够直接用就行。
ST_ClusterIntersecting -- 该函数是一个聚合函数,方法比较好理解,顾名思义就是把相交关联关系的地理要素作为一个类簇。具体的函数声明和用法,看官网的例子介绍很容易看懂,也可以拿数据进行测试实验,不是很常用,不做重点;
ST_ClusterWithin -- 该函数也是一个聚合函数,也很好理解,顾名思义通过一个距离参数,将距离之内的地理要素聚成一个类别,距离之外的就是非同类。详细可参考官网,也不做重点;
下面对ST_ClusterDBSCAN作详细介绍,该聚类方法用处比较大,有较多应用场景,比如可以应用于点抽稀,聚合展示,热力图,在数据量较大时实现在不同尺度下降低数据量的渲染等等 。为了对该函数的使用有更好的理解,简要介绍下DBSCAN,该算法定义了一系列术语,这里讲两个重要的:
一是领域半径eps,通俗解释就是,以我为圆心,半径为eps内的其他要素可以作为我的邻域,也就是我们是可能作为同一类的,一般我们采用投影坐标;
另一个是MinPts,因为是密度聚类算法,这个最小的点数目就是作为聚类的密度约束,每个类簇至少有MinPts个点;
总的来说,你以eps半径进行搜索,搜到我附近至少有了MinPts个点,那说明你就是一个核心点,是有可能发展成一个类簇的。
2
官网介绍相关
函数定义,有三个参数,(窗口函数中的每一个地理要素,搜索半径,最小点数),根据以上分析应该不难理解:
integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);
官网给的解释:
对于那些处在边界的地理要素,按照eps搜索半径搜索归类时,可能处于模糊状态,可以被分到不同的类别中,但是可以保证每次调用该算法时都得到相同的分类结果,我们平常用postgis的时候不会过多考虑,倒是后边两个参数,可能需要多次试验,已达到理想的效果。
官网给出的注意事项:
对于输入的一个地理要素,如果不满足聚类的规则条件,没有被分到任何一个类簇,那么他的类簇id就是空的。
3
测试实验
数据源:
实验数据采用osm上下载的poi点数据,选取河南省范围内的1565条数据;
数据处理:
由于osm数据下载的都是经纬度坐标,需要先通过工具进行投影转换,转为投影坐标,可查阅arcgis坐标投影的相关操作;
实验过程:
1.参数eps=1km,MinPts=3,聚类后并创建新的分类表:
2.查询多少各类
3.对聚类结果进行合并,将同一类的合并取中心点坐标,然后统计该类别的数目,并导出表:
其中还用到了ST_Collect,ST_Centroid两个函数,比较简单,可直接参考官网。
实验结果:
在eps=1km,MinPts=3的参数条件下:
聚类结果共69类,
包含1291个点,
类簇最大的有284个点,
有274个点没有被划分到任何一个类别
聚类结果在Arcgis中打开,其中小方块显示的是该类簇下的点个数,圆圈越大表示该类簇下的点数越多,可以根据需求作为一个权重值,浅蓝色的点是原始的poi点。
文章涉及数据源可以后台回复:"postgis聚类"获得。
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211207_227129b4-5758-11ec-b803-fa163eb4f6be.png)
◆
![](https://oss-emcsprod-public.modb.pro/wechatSpider/modb_20211207_227efe22-5758-11ec-b803-fa163eb4f6be.png)