Matlab pcsegdist与Python DBSCAN点云分割聚类结果差异问题咨询
Matlab pcsegdist与sklearn DBSCAN聚类结果差异原因及解决方法
核心差异原因
- 底层聚类逻辑不同
Matlab的pcsegdist采用的是基于类间距离阈值的聚类规则:要求最终得到的任意两个不同聚类之间的所有点对最小欧氏距离都大于minDistance参数,不存在链状可达的判定逻辑。而sklearn的DBSCAN是基于密度可达的规则:只要两个点之间存在一条路径,路径上每一步的相邻点距离都小于等于eps,就会被归为同一类,不要求两类的全局最小距离大于eps,这是二者结果不一致的最核心原因。 - 参数名义等价但实际逻辑不同
直接把minDistance和eps设为相同值的对齐方式存在偏差:eps是单个点的邻域半径判定阈值,仅用于判定核心点和邻接关系;而minDistance是最终输出聚类的类间距离约束,二者的作用阶段完全不同。 - 最小点数参数的作用逻辑不同
pcsegdist的minPoints是最终聚类的保留阈值:所有点数少于该值的聚类都会被直接判定为噪声丢弃。而DBSCAN的min_samples是核心点的判定阈值:只有邻域内点数量大于等于该值的点才会被标记为核心点,边界点不属于核心点但可以被归到有核心点的聚类中,最终聚类的点数可能小于min_samples,需要额外过滤才能和pcsegdist的输出对齐。 - 边界点处理与浮点精度差异
DBSCAN中可同时属于两个聚类的边界点,归属结果和点的遍历顺序有关,sklearn和Matlab的内部遍历顺序不同会导致边界点分配差异。同时二者的浮点数距离计算精度存在细微差别,刚好卡在阈值附近的点的邻域判定结果也会出现偏差。
对齐结果的调整方案
- 调整DBSCAN后续处理逻辑:跑完DBSCAN后,先过滤掉所有点数小于
minPoints的小簇,再计算不同聚类之间的最近邻距离,把最近邻距离小于minDistance的聚类合并,即可对齐pcsegdist的输出规则。 - 统一距离计算逻辑:提前手动计算点云的成对欧氏距离矩阵,分别作为两个函数的输入,排除底层距离计算的精度差异影响。
- 微调参数适配:如果不需要严格对齐逻辑仅需要结果近似,可以适当调小
DBSCAN的eps值(通常为原minDistance的0.8-0.9倍),即可让聚类数量和pcsegdist的输出接近。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

