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

含0方差的Mahalanobis距离聚类算法初始化及阈值选择咨询

马氏距离聚类算法相关问题解答

我正在开发一款聚类算法,采用马氏距离判定样本点是否应被纳入聚类。聚类由两类统计量表征:

  • 各维度下所有样本点分量的和(记为SUMi)
  • 各维度下所有样本点分量的平方和(记为SUMQi)

聚类质心第i维坐标为SUMi/N(N为聚类内样本点数量),第i维方差计算公式为SUMQi/N − (SUMi/N)²。初始化阶段从数据集中随机选取k个样本点作为初始聚类(k为预设聚类数量),此时每个聚类仅包含1个样本点,导致SUMQi/N = (SUMi/N)²,方差为0,无法计算马氏距离(因计算过程需除以聚类方差)。现针对以下三个问题给出解答:


1. 0方差问题的正确解决方法

  • 添加微小扰动:对初始单样本聚类的SUMQi添加极小正值(如1e-8),让方差计算结果不为0,且不会干扰后续统计量的更新。
  • 复用全局方差:提前计算整个数据集各维度的方差,初始化阶段用全局方差替代聚类的0方差;当聚类样本数≥2时,切换为聚类自身的方差。
  • 初始化阶段改用欧氏距离:单个样本的聚类方差为0时,马氏距离无意义,此时直接用欧氏距离判定样本是否加入,待聚类有多个样本后再切换为马氏距离。

2. d维样本点的聚类判定阈值选择

  • 基于卡方分布:若样本服从正态分布,马氏距离的平方服从自由度为d的卡方分布。可根据置信度选临界值,比如95%置信度对应的卡方值(查卡方分布表),当样本点的马氏距离平方小于该值时允许加入聚类。
  • 自适应动态阈值:结合聚类当前状态调整,比如取聚类平均标准差的2-3倍(类似3σ原则),或统计已纳入样本的马氏距离分布,取90%分位数作为阈值。
  • 实验确定经验阈值:在验证集上测试不同阈值下的聚类效果(如轮廓系数、互信息等指标),选择最优值,适配数据集的实际分布和聚类目标。

3. 方差向量的模或均值作为阈值是否可行?

  • 方差向量均值:可行,但需搭配经验系数。均值代表各维度的平均离散程度,可设置为均值的2倍左右作为阈值,但仅适合各维度离散程度相近的数据集,忽略了维度间的方差差异。
  • 方差向量的模:不推荐。模会放大高方差维度的权重,导致阈值对离散程度高的维度过度敏感,无法准确反映样本在多维度空间的整体偏离情况,容易让聚类结果偏向高方差维度。

附C语言实现的马氏距离计算函数

double mahalanobis(double *cluster, double *point, int dimension) {
   
    double* std_dev = malloc(dimension * sizeof(double));

    /**
     * variance of the cluster
     */
    for (int i = 0; i < dimension; ++i) {
        std_dev[i] = cluster[i + dimension + 1]/cluster[0] - pow(cluster[i + 1]/cluster[0], 2);
    }

    /**
     * mahalanobis distance
     */
    double sum = 0;
    for (int i = 0; i < dimension; ++i) {
        sum += pow(point[i] - ((cluster[i+1] + point[i])/(cluster[0] + 1)), 2)/std_dev[i];
    }

    free(std_dev);
    return sqrt(sum);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:40:22