
一、函数概述
ST_ClusterKMeans 用于将几何对象集合划分为指定数量(k)的聚类,使用 K 均值算法返回每个输入几何图形的簇 id 的窗口函数。该算法基于几何中心或边界框中心的距离进行聚类,并支持权重和最大半径约束。特别适用于识别空间热点区域、资源分配规划和模式识别等场景。与 DBSCAN 等密度聚类不同,K-means 需要预先指定聚类数量,但能更均匀地划分空间数据。
二、核心参数与语法结构
sql
integer ST_ClusterKMeans(
geometry geom, -- 输入几何对象
integer number_of_clusters, -- 目标聚类数量(k)
float max_radius -- 最大聚类半径约束(可选)
) OVER ();
- 参数说明 :
- geom:输入的几何列(支持点、线、面等类型)。
- number_of_clusters:目标簇的数量(K 值)。
- 返回值:为每行数据分配一个簇 ID(整数),表示其所属的聚类。
三、算法核心原理
1. 基础思想
K-means 算法的目标是将数据点划分为K 个簇,使得每个簇内数据点到簇中心的欧氏距离平方和最小。具体步骤如下:
- 初始化质心:随机选择 K 个数据点作为初始簇中心。
- 分配数据点:计算每个数据点到 K 个质心的距离,将其分配到最近的簇。
- 更新质心:重新计算每个簇的质心(所有点的均值)。
- 迭代收敛:重复分配和更新步骤,直到质心不再显著变化或达到最大迭代次数。
2. 距离计算方式
在 PostGIS 中,几何对象(如点、线、面)的距离计算基于其质心坐标
- 2D 几何:基于几何质心(ST_Centroid)的欧氏距离
- 3D 几何 :基于边界框中心(ST_3DCentroid)的欧氏距离
点数据(POINT 类型):支持 M 坐标作为权重值
3. 最大半径约束(max_radius)
- 若指定该参数,算法可能生成超过 k 个聚类,确保每个聚类的半径不超过设定值
- 适用于可达性分析或服务范围约束场景
四、参数调优策略
1. k 值选择
- 过小:可能合并本应分离的聚类
- 过大:可能将相似区域分割成多个聚类
- 建议方法:
- 经验法:根据业务需求或领域知识预估 K 值。例如,物流调度中可根据仓库数量确定簇数
- 肘部法:绘制簇内平方和(WCSS)随 K 值变化的曲线,拐点处通常为较优的 K 值
- 轮廓系数:通过计算轮廓系数(Silhouette Score)评估聚类效果,选择得分最高的 K 值
2.最大半径约束
- 需与数据坐标系单位一致(如 WGS 84 为度,UTM 为米)
- 建议先转换为投影坐标系再应用约束
3. 坐标系选择
- 平面距离(如 UTM):适用于局部区域分析
- 球面距离(如 SRID 4978):适用于全球或大范围分析
五、与 DBSCAN 的对比
| 特性 | K-means | DBSCAN |
|---|---|---|
| 簇形状假设 | 凸形状 | 任意形状 |
| 需预先指定参数 | K 值 | 半径 (eps) 和最小点数 (minPts) |
| 对噪声敏感性 | 高 | 低 |
| 空间索引需求 | 高(加速距离计算) | 高(加速邻域查询) |
| 适用场景 | 簇数已知、数据分布紧凑 | 簇数未知、存在噪声或任意形状数据 |
六、典型用法示例
示例 1:城市设施聚类规划
sql
-- 将城市划分为 K 个配送区域,使每个区域的订单密度均衡
-- 将订单点聚为5个簇,作为配送区域
SELECT
order_id,
ST_ClusterKMeans(geom, 5) OVER () AS cluster_id
FROM orders;
示例 2:带权重的人口聚类分析
sql
-- 基于人口密度聚类城市区域
WITH population_data AS (
SELECT
region_id,
population,
ST_SetSRID(ST_MakePoint(longitude, latitude), 4326) AS geom
FROM census_data
)
SELECT
region_id,
population,
ST_ClusterKMeans(
ST_AddMeasure(geom, population), -- 使用人口作为权重
10
) OVER () AS demographic_cluster
FROM population_data;
示例 3:最大半径约束的应急响应分区
sql
-- 生成半径不超过10公里的应急响应区域
WITH emergency_stations AS (
SELECT
station_id,
geom
FROM emergency_facilities
)
SELECT
station_id,
ST_ClusterKMeans(geom, 8, 10000) OVER () AS response_cluster -- 10公里约束
FROM emergency_stations;
七、应用场景
1. 城市规划
- 设施服务区域划分(如医院、学校覆盖范围)
- 商业区、住宅区等功能区识别
2. 物流与配送
- 仓库选址与配送区域优化
- 基于需求点的配送中心聚类
3. 环境监测
- 监测站点的最优布局规划
- 污染区域的空间聚类分析
4. 公共安全
- 应急响应区域划分
- 犯罪热点区域识别与警力部署
八、注意事项
1. 算法局限性
- 对初始中心敏感,可能导致不同运行结果
- 倾向于生成大小相近的聚类,不适合处理密度差异大的数据
- 建议使用ORDER BY确保结果确定性:
sql
ST_ClusterKMeans(geom, 5) OVER (ORDER BY unique_id)
2. 性能优化
sql
-- 为提高性能,建议在聚类字段上创建GIST索引
CREATE INDEX idx_geom ON your_table USING GIST (geom);
3. 3D 与权重支持
- 3D 聚类需使用含 Z 坐标的几何类型(如ST_Force3D)
- 权重需通过 M 坐标设置(如ST_AddMeasure)
九、扩展应用:多维度聚类分析
sql
-- 结合空间位置和属性数据进行多维度聚类
WITH multi_dim_data AS (
SELECT
facility_id,
geom,
ST_AddMeasure(
geom,
attribute_value -- 使用属性值作为权重
) AS weighted_geom
FROM facility_data
)
SELECT
facility_id,
ST_ClusterKMeans(weighted_geom, 8) OVER () AS multi_dim_cluster
FROM multi_dim_data;
通过ST_ClusterKMeans函数,可有效实现空间数据的 K-means 聚类分析,为地理信息决策提供支持。合理选择聚类数量和约束参数,并结合空间索引优化,能显著提升聚类效果和性能,满足从城市规划到环境监测等多种领域的空间分析需求。