DBSCAN聚类遍历参数组合生成CSV仅输出最后结果问题排查
问题排查
原代码无法输出全量参数组合结果,核心错误如下:
- 导入语句存在语法错误,pandas导入和sklearn导入行粘连
- 未提前加载CSV坐标数据,DBSCAN拟合时输入的
points变量未定义 - 循环内变量名引用错误:训练完成的模型对象名、eps/min_samples参数名拼写错误,导致代码本身无法正常运行
- 每次循环重复读取原始CSV文件,存在不必要的IO开销
- 未按要求新增「簇内点数量」列
- 未做变量隔离,后续循环的计算结果容易覆盖之前的数值
修正后代码
%matplotlib notebook import numpy as np from interp import * import pandas as pd from sklearn.cluster import DBSCAN from sklearn.neighbors import NearestNeighbors from sklearn.metrics import silhouette_score import itertools points_file = "examples/example-1/fcr.csv" # 循环外一次性加载原始数据,提取DBSCAN需要的坐标输入 df_origin = pd.read_csv(points_file, header=None, names=["x", "y", "z", "id"]) points = df_origin[["x", "y", "z"]].values eps_values = np.arange(0.1, 0.5, 0.1) min_samples_values = np.arange(5, 20) dbscan_params = list(itertools.product(eps_values, min_samples_values)) for eps, min_sam in dbscan_params: # 训练当前参数下的DBSCAN模型 db_model = DBSCAN(eps=eps, min_samples=min_sam).fit(points) cluster_labels = db_model.labels_ # 统计每个簇(含标签为-1的噪声点)的点数量 cluster_size_map = pd.Series(cluster_labels).value_counts().to_dict() # 复制原始数据追加新列,避免修改原数据导致后续循环出错 df_result = df_origin.copy() df_result["cluster_label"] = cluster_labels df_result["cluster_point_count"] = df_result["cluster_label"].map(cluster_size_map) df_result["eps"] = eps df_result["min_samples"] = min_sam # 生成输出文件名,eps保留2位小数避免浮点数精度导致文件名异常 output_name = f'fcr_eps{round(eps,2)}_minsamples{min_sam}.csv' df_result.to_csv(output_name, index=False)
代码说明
- 所有参数组合遍历完成后,会在当前运行目录生成对应数量的独立CSV文件,文件名直接标注所用的eps和min_samples取值,方便后续筛选
- 输出CSV保留原始x/y/z/id四列,新增四列:簇标签、对应簇的总点数、当前eps值、当前min_samples值,其中标签为-1的行是DBSCAN识别出的噪声点,簇内点数量统计的是总噪声点数
- 循环内每次复制原始数据生成新的结果表,不会出现不同参数的计算结果互相覆盖的问题
- 去掉了原代码中无意义的空列表追加逻辑,如果需要统计所有参数组合的簇总数,可以在循环内按需追加到对应列表即可
内容的提问来源于stack exchange,提问作者JoshDragon
相关产品推荐
相关产品推荐

