基于distance matrix的站点聚类方案咨询(Python 3环境)
Python 3 站点聚类解决方案(基于距离矩阵/坐标)
针对你的站点聚类需求,结合已有的距离矩阵和站点坐标,推荐以下几种实用的Python解决方案:
1. 层次聚类(Agglomerative Clustering)
适合基于预计算距离矩阵的聚类,无需提前指定聚类数量(也可手动指定),能直观展示聚类层级关系。使用scikit-learn实现:
from sklearn.cluster import AgglomerativeClustering import numpy as np # 转换距离矩阵为numpy数组 distance_matrix = np.array(data['distance_matrix']) # 初始化聚类器,使用预计算的距离矩阵 # linkage可选:ward(最小化簇内方差)、complete(簇间最大距离)、average(簇间平均距离) cluster = AgglomerativeClustering( n_clusters=None, # 不指定聚类数,通过距离阈值停止聚类 distance_threshold=500, # 聚类停止的距离阈值,可根据业务需求调整 affinity='precomputed', linkage='ward' ) # 执行聚类并获取每个站点的标签 labels = cluster.fit_predict(distance_matrix) # 输出结果 for idx, label in enumerate(labels): print(f"站点 {idx}: 聚类标签 {label}")
若需要固定聚类数量,将n_clusters设为目标数值,移除distance_threshold参数即可。
2. DBSCAN 密度聚类
适合识别地理上的高密度聚集区域,能自动过滤孤立站点,支持直接使用预计算距离矩阵:
from sklearn.cluster import DBSCAN import numpy as np distance_matrix = np.array(data['distance_matrix']) # 初始化DBSCAN # eps: 邻域半径,控制簇的大小;min_samples: 邻域内最少站点数,过滤稀疏区域 dbscan = DBSCAN( eps=500, min_samples=2, metric='precomputed' ) labels = dbscan.fit_predict(distance_matrix) # 输出结果,标签为-1代表该站点是孤立点 for idx, label in enumerate(labels): print(f"站点 {idx}: 聚类标签 {label}")
3. K-Means 聚类(基于站点坐标)
如果你有原始站点坐标,K-Means是效率更高的选择,适合大规模站点数据:
from sklearn.cluster import KMeans import numpy as np # 假设你有站点坐标数组,格式为[[经度, 纬度], ...] coordinates = np.array([[x0, y0], [x1, y1], ...]) # 指定目标聚类数,random_state保证结果可复现 kmeans = KMeans(n_clusters=4, random_state=42) labels = kmeans.fit_predict(coordinates) # 输出结果 for idx, label in enumerate(labels): print(f"站点 {idx}: 聚类标签 {label}")
实用建议
- 聚类前可对距离矩阵做标准化处理,避免不同量级的距离干扰聚类结果
- 若需要可视化聚类效果,可结合
matplotlib绘制散点图,或用folium生成地理热力图展示簇分布 - 聚类完成后,可将每个簇的站点作为独立任务,继续用Google OR-Tools生成各簇的优化路线
内容的提问来源于stack exchange,提问作者zxcv
相关产品推荐
相关产品推荐

