You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在已完成空间聚类的地图点内进行参数值子聚类?

替代循环实现聚类内子聚类的几种方案

嘿,这个需求我之前做空间数据分析时刚好遇到过!循环写法虽然直观,但数据量大的时候效率容易拉胯,而且代码显得啰嗦。给你分享几个更优雅高效的实现思路:

方案一:Pandas Groupby + Apply 分组处理

这是最直接替代循环的方法,利用Pandas的分组功能自动遍历每个主聚类,对组内数据单独做子聚类,最后自动合并结果:

import pandas as pd
from sklearn.cluster import KMeans  # 你可以替换成DBSCAN、AgglomerativeClustering等

def process_subcluster(sub_df, n_subclusters=2):
    # 传入单个主聚类的子集,针对参数列做子聚类
    param_data = sub_df[['你的参数列名']].values  # 若多参数就传多列
    # 初始化聚类器(这里以KMeans为例,可根据需求调整)
    sub_clust_model = KMeans(n_clusters=n_subclusters, random_state=42)
    # 生成子聚类标签,建议加上主聚类前缀避免不同组的子ID重复
    sub_df['subClust'] = f"{sub_df['Clust'].iloc[0]}_sub_" + sub_clust_model.fit_predict(param_data).astype(str)
    return sub_df

# 应用到整个数据集
df_with_subclust = df.groupby('Clust').apply(process_subcluster).reset_index(drop=True)

这个方法的优势是代码简洁易读,Pandas会自动处理分组、子任务执行和结果拼接,不用手动维护循环索引和临时变量。如果用的是Scikit-learn这类优化过的聚类算法,效率也比纯Python循环高很多。

方案二:向量化批量处理(适合特定聚类算法)

如果你的子聚类用的是基于距离/密度的无监督算法(比如DBSCAN),且可以通过参数区分不同主聚类的样本,也可以尝试向量化批量处理:

比如给每个主聚类的参数值加上一个偏移量,让不同主聚类的参数空间完全分隔开,然后一次性跑全局聚类,最后再把偏移量去掉还原子聚类标签:

from sklearn.cluster import DBSCAN

# 给每个主聚类的参数加偏移,确保不同组的参数不重叠
df['param_with_offset'] = df['你的参数列名'] + df['Clust'] * (df['你的参数列名'].max() - df['你的参数列名'].min() + 1)

# 全局跑DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=3)
df['temp_subclust'] = dbscan.fit_predict(df[['param_with_offset']].values)

# 还原子聚类标签,按主聚类分组重新编号
def reset_subclust_ids(sub_df):
    sub_df['subClust'] = sub_df['temp_subclust'].rank(method='dense').astype(int) - 1
    sub_df['subClust'] = sub_df['Clust'].astype(str) + '_sub_' + sub_df['subClust'].astype(str)
    return sub_df

df_with_subclust = df.groupby('Clust').apply(reset_subclust_ids).drop('param_with_offset', axis=1).drop('temp_subclust', axis=1)

这个方法适合追求极致效率的场景,避免了多次拟合聚类器的开销,但只适用于能通过偏移量分隔组的情况,通用性不如第一种方案。

方案三:并行化分组处理(大数据场景)

如果你的数据集特别大,还可以用Dask这类并行计算库来加速分组聚类:

import dask.dataframe as dd

# 转成Dask DataFrame
ddf = dd.from_pandas(df, npartitions=4)

# 定义和之前一样的子聚类函数
def process_subcluster(sub_df):
    # 内容和方案一一致
    param_data = sub_df[['你的参数列名']].values
    sub_clust_model = KMeans(n_clusters=2, random_state=42)
    sub_df['subClust'] = f"{sub_df['Clust'].iloc[0]}_sub_" + sub_clust_model.fit_predict(param_data).astype(str)
    return sub_df

# 并行分组处理
ddf_with_subclust = ddf.groupby('Clust').apply(process_subcluster, meta=df.dtypes).compute()

Dask会自动把任务分配到多个CPU核心上执行,能显著缩短大数据量下的处理时间。

附上空间点分层聚类的效果对比图:
空间点分层聚类对比
(上方为完成空间聚类后的点分布,不同颜色代表不同主聚类;下方为添加参数子聚类后的结果,每个主聚类内部用不同深浅区分子聚类)

内容的提问来源于stack exchange,提问作者val

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:59:57