PostGIS 中的 K-Means 聚类操作及应用

K-Means算法:

  K-means 是数据科学和商业的基本算法。让我们深入了解一下。

1. K-means是一种流行的用于聚类的无监督机器学习算法。它是用于客户细分、库存分类、市场细分甚至异常检测的核心算法。

2. 无监督:K-means 是一种无监督算法,用于没有标签或预定义结果的数据。目标不是预测目标输出,而是通过识别数据集中的模式、聚类或关系来探索数据的结构。

3. 目标函数:K-means 的目标是最小化簇内平方和(WCSS)。它通过一系列迭代步骤(包括分配和更新步骤)来实现这一点。

4. 分配步骤:在此步骤中,将每个数据点分配给最近的聚类质心。“最近”通常使用欧几里得距离来确定。

5.更新步骤:重新计算质心作为簇中所有点的平均值。每个质心是其簇中点的平均值。

6.迭代:重复分配和更新步骤,直到质心不再发生显着变化,表明集群稳定。此过程最大限度地减少了簇内方差。

7. 输出:聚类质心、标签和距离平方和。质心代表每个聚类中所有点的平均位置,对于解释聚类结果至关重要。标签是聚类分配。距离平方和是簇中每个点距簇质心距离的度量。

8. 评估。有多种评估 K 均值的方法。两种常见的方法是剪影评分法和肘部法。

9. Silhouette Score:该指标衡量数据点与其他集群相比与其自身集群的相似程度。轮廓得分范围从 -1 到 1,其中高值表示数据点与其自己的簇匹配良好,而与相邻簇匹配较差。

10. 肘部法:该方法涉及将惯性绘制为簇数量的函数,并在图中寻找“肘部”。下降率急剧变化的肘点对于簇数来说是一个不错的选择。

PostGIS 中的 K-Means 聚类操作及应用:

   POSTGRESS是非常有名的开源数据库,POSTGIS是它的空间数据库扩展插件。相当于ARCGIS 中 ORACLE 和 SDE的关系。

点聚类是地理空间数据分析的常见任务,PostGIS提供了多种聚类功能,例如:

  • ST_ClusterDBSCAN

  • ST_ClusterKMeans

  • ST_ClusterIntersectingWin

  • ST_ClusterWithinWin

本文探讨了PostGIS 的  ST_ClusterKMeans函数的功能。K-Means 聚类作为一种对高维 LLM 嵌入进行分组的流行方式现在很流行,但它在较低维度的空间聚类中也很有作用。

ST_ClusterKMeans将对 2 维和 3 维数据进行聚类,并且当在点的“测量”维度中提供权重时,还会对点执行加权聚类。

为了尝试 K 均值聚类,我们需要一些点进行聚类,在本例中是 来自Natural Earth的1:10M 人口分布的数据。将其下载 GIS 文件并加载到数据库中,在此示例中使用 ogr2ogr。

ogr2ogr \  -f PostgreSQL \  -nln popplaces \  -lco GEOMETRY_NAME=geom \  PG:'dbname=postgres' \  ne_10m_populated_places_simple.shp
 

平面聚类(二维聚类)

二维空间中的简单聚类如下所示,使用 10 作为聚类数:

CREATE TABLE popplaces_geographic ASSELECT geom, pop_max, name,  ST_ClusterKMeans(geom, 10) OVER () AS clusterFROM popplaces;
 

请注意,俄罗斯的部分地区与阿拉斯加聚集在一起,而大洋洲则被分开。这是因为我们将这些点的经度/纬度坐标视为在一个平面上,因此阿拉斯加距离西伯利亚非常远。

对于仅限于小区域的数据,诸如日期变更线分裂之类的影响并不重要,但对于我们的全球示例来说,却很重要。幸运的是,有一种方法可以解决这个问题。

地心聚类(三维聚类)

我们可以使用ST_Transform将原始数据的经度/纬度坐标转换为地心坐标系 。“地心”系统是一种原点为地球中心的系统,位置由距该中心的 X、Y 和 Z 距离定义。

在地心系统中,日期变更线两侧的位置在空间中仍然非常接近,因此非常适合对全球数据进行聚类,而无需担心两极或日期变更线的影响。在本例中,我们将使用EPSG:4978作为我们的地心系统。

以下是转换为地心坐标的纽约坐标。

 
SELECT ST_AsText(ST_Transform(ST_PointZ(74.0060, 40.7128, 0, 4326), 4978), 1);
POINT Z (1333998.5 4654044.8 4138300.2)SELECT ST_AsText(ST_Transform(ST_PointZ(74.0060, 40.7128, 0, 4326), 4978), 1);
 
POINT Z (1333998.5 4654044.8 4138300.2)
 

这是在地心空间中执行的聚类操作。

CREATE TABLE popplaces_geocentric ASSELECT geom, pop_max, name,  ST_ClusterKMeans(    ST_Transform(      ST_Force3D(geom),      4978),    10) OVER () AS clusterFROM popplaces;
 

结果看起来与平面聚类非常相似,但您可以在几个地方看到“整个世界”效应,例如澳大利亚和大洋洲的所有岛屿现在位于一个聚类中,以及西伯利亚和阿拉斯加之间的分界点星团已向西移动越过日期变更线。

值得注意的是,尽管我们在二维中显示结果,但该聚类是在三个维度上执行的(因为地心坐标需要 X、Y 和 Z)。

加权聚类

除了朴素 k 均值之外, ST_ClusterKMeans还可以执行 加权 k 均值聚类,以使用输入点的“M”维度(第四维数据)增加额外信息来提高聚类质量。

由于我们有一个“人口稠密的地方”数据集,因此使用人口作为此示例的权重是有意义的。加权算法要求严格为正权重,因此我们过滤掉少数非正记录。

CREATE TABLE popplaces_geocentric_weighted ASSELECT geom, pop_max, name,  ST_ClusterKMeans(    ST_Force4D(      ST_Transform(ST_Force3D(geom), 4978),      mvalue => pop_max    ),    10) OVER () AS clusterFROM popplacesWHERE pop_max > 0;
 

同样,差异是微妙的,但请注意印度现在是一个单一集群,巴西集群现在如何偏向人口稠密的东海岸,以及北美现在如何分为东部和西部。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode刷题(javaScript)——分治思想(二分查找、快速排序)相关场景题总结

分治思想是一种将问题分解成更小的子问题,然后解决子问题并将结果合并的算法设计策略。二分查找、快速排序和折半查找都属于分治思想的经典算法。在leetcode里,分治思想一般结合其他场景出现,构成复合型题目。但是在看题时一定要了解能否用分…

C语言分析基础排序算法——计数排序

目录 计数排序 计数排序基本思路 计数排序改进思路 计数排序 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。具体思路为: 统计相同元素出现次数根据统计的结果将序列回收到原来的序列中 计数排序基本思路 基本思路分析: //以…

安卓项目:app注册/登录界面设计

目录 第一步:设计视图xml 第二步:编写登录和注册逻辑代码 运行效果展示: 总结: 提前展示项目结构: 第一步:设计视图xml 在layout目录下面创建activity_login.xml和activity_main.xml文件 activity_lo…

19.创建帖子

文章目录 一、建立路由二、开发CreatePostHandler三、编写logic四、编写dao层五、编译测试运行 一、建立路由 这里要稍微注意的是:需要登录后才可以发表帖子,所以需要用到我们之前写的鉴权中间件。中间件对用户携带的token解析成功后,便会将…

String、StringBuilder、StringBuffer 有什么区别?

1、典型回答 String、StringBuilder 和 StringBuffer 都是 Java 语言中,用于操作字符串的类,但它们在性能、可变性和线程安全性方面有一些区别 1、String:不可变字符串类,也就是说一旦创建,它的值就不可变。每次对 S…

Spring boot 集成netty实现websocket通信

一、netty介绍 Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和U…

数码管的动态显示(二)

1.原理 这个十六进制是右边的dp为高位。 数码管的动态显示,在第一个计数周期显示个位,在第二个周期显示十位,在第三个周期显示百位由于人眼的视觉和数码管的特性,感觉就是显示了234,每个数码管的显示需要从输入的数据里…

Flutter第四弹:Flutter图形渲染性能

目标: 1)Flutter图形渲染性能能够媲美原生? 2)Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView,也不使用操作系统的原生控件,而是…

labview中6种机械动作的区别

1.单击时转换:单击时转换,需要手动转换或者赋值回复原来状态; 2.释放时转换:释放时时转换,需要手动转换或者赋值回复原来状态; 3.单击时转换保持到鼠标释放:触发两次,自动恢复原来状…

Linux:导出环境变量命令export

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的内建命令export命令用于创建一个环境变量,或将一个普通变量导出为环境变量,并且在这个过程中,可以给该环境变量赋值。 下面…

多数问题求解之蒙特卡洛与分治法

多数问题(Majority Problem)是一个有多种求解方法的经典问题,其问题定义如下: 给定一个大小为 n n n的数组,找出其中出现次数超过 n / 2 n/2 n/2的元素 例如:当输入数组为 [ 5 , 3 , 5 , 2 , 3 , 5 , 5 ] […

【WPS】压缩图片

第一步: 点击插入,点击图片 第二步: 点击图片工具,点击压缩图片 第三步:

Vue3 前端生成随机id( 生成 UUID )

效果展示 封装工具(代码展示) 重新创建一个文件**/utils/someTools.js**,并在里面写入如下代码。 function Tools() {}Tools.prototype.guid function () {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, function (c) {v…

jQuery模态框弹窗提示代码

jQuery模态框弹窗提示代码 下载地址 jQuery模态框弹窗提示代码

Requests教程-17-请求代理设置

上一小节我们学习了requests解决乱码的方法,本小节我们讲解一下requests设置代理的方法。 代理基本原理 代理实际上指的就是代理服务器, 英文叫作proxy server ,它的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户,我们通常会选择CICD工具来减少人力投入产生的成本,开源的工具比如有成熟的Jenkins,但是本文讲的是阿里云提高的解决方案云效平台,通过配置流水线的形式实现项目的快速部署到服务器…

【数据结构】双向链表及LRU缓存的实现

目录 前言 1. 在原有的自定义链表类 Linked 的基础上,添加新的 “节点添加”方法 addNode(Node node) 测试用例 测试结果 2. 在自定义链表类的基础上,使用双重循环“强力” 判断两个节点是否发生相交 测试用例 测试结果 3. 在自定义链表类的基础上…

基于opencv的手势识别

当然可以,下面是一个使用OpenCV实现简单手势识别,并在摄像头捕捉的视频中描绘出手部轮廓为线条的示例。该代码会读取摄像头流,然后检测出手部,并用线条描绘出手的轮廓。 首先,你需要安装OpenCV库。如果你还没有安装&am…

Vulnhub靶机:Kioptrix_Level1.1

一、介绍 运行环境:Virtualbox 攻击机:kali(192.168.56.101) 靶机:Kioptrix_Level1.1(192.168.56.104) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vul…

C语言例2-3:从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数

回文数是将自然数n的各位数字反向排列得到自然数n1,若n1与n相等,则称为回文数,例如12321 //从键盘输入一个正整数(位数小于或等于10),判断其是否是回文数 //回文数是将自然数n的各位数字反向排列得到自然数…