首页
/ TinyBench项目中Median Absolute Deviation计算Bug分析

TinyBench项目中Median Absolute Deviation计算Bug分析

2025-07-05 07:35:26作者:邬祺芯Juliet

问题背景

在性能基准测试库TinyBench中,发现了一个关于Median Absolute Deviation(MAD,中位数绝对偏差)计算的bug。当样本数量为奇数时,MAD计算结果总是返回0,这显然不符合预期。

MAD计算原理

中位数绝对偏差是统计学中用于衡量数据离散程度的稳健指标。其计算步骤如下:

  1. 首先计算数据集的中位数(Median)
  2. 然后计算每个数据点与中位数的绝对偏差
  3. 最后计算这些绝对偏差的中位数

MAD相比标准差对异常值更不敏感,因此在性能基准测试中是一个很有价值的指标。

Bug具体表现

以样本[1, 2, 3]为例:

  1. 计算中位数p50 = 2
  2. 计算绝对偏差:[|1-2|, |2-2|, |3-2|] = [1, 0, 1]
  3. 计算绝对偏差的中位数:medianSorted([1, 0, 1])

问题出在第三步,medianSorted函数期望接收一个已排序的数组,但[1, 0, 1]并未排序,导致计算结果错误地返回0而不是1。

问题根源

代码中存在两个关键函数:

  1. getStatisticsSorted() - 处理已排序的样本
  2. absoluteDeviation() - 计算绝对偏差并应用聚合函数

虽然getStatisticsSorted()接收的是已排序样本,但absoluteDeviation()内部生成的绝对偏差数组却没有被排序,而后续又直接对这个未排序数组调用medianSorted(),导致了错误结果。

解决方案

修复方法很简单:在计算绝对偏差的中位数前,先对绝对偏差数组进行排序。这保证了medianSorted函数能够正确工作。

经验教训

这个bug提醒我们:

  1. 函数的前置条件必须明确文档化
  2. 当函数对输入有特定要求(如已排序)时,应该:
    • 要么在函数内部处理
    • 要么明确声明并验证前置条件
  3. 链式调用时要注意中间结果的格式是否符合下游函数的要求

总结

TinyBench中的这个MAD计算bug展示了即使简单的统计计算也可能因为微妙的假设而出现问题。通过仔细分析函数间的数据流动和前置条件,我们能够发现并修复这类问题。这也提醒开发者在编写统计计算代码时要特别注意中间结果的正确处理。

登录后查看全文
热门项目推荐
相关项目推荐