【问题标题】:Standard Deviation calculation error标准差计算错误
【发布时间】:2015-04-27 21:43:18
【问题描述】:

我试图弄清楚为什么这个过程给了我一个错误的答案。

对于 [1,2,3,4,5] 我得到的是 1.2 而不是 1.414

def standard_deviation(number_list):
  average = sum(number_list) / float(len(number_list))
  stdev = 0
  for value in number_list:
      stdev += math.sqrt((average - value)**2) / float(len(number_list))
  return stdev

standard_deviation([1,2,3,4,5])

【问题讨论】:

  • 重新检查文本中的公式。标准差通常会除以len(number_list)-1

标签: python math standard-deviation


【解决方案1】:

您错误地执行了公式。

定义是“标准偏差是平均值的平方偏差的平均值的平方根”。 This numpy page explains it well (see the Notes section).

代码math.sqrt((average - value)**2) 不符合您的要求; sqrt 和 **2 相互抵消,所以结果只是abs(average-value)

numpy 页面简洁地将实现描述为std = sqrt(mean(abs(x - x.mean())**2))

对您的代码进行以下更正会更好:

def standard_deviation(number_list):
  average = sum(number_list) / float(len(number_list))
  sqdev = 0
  for value in number_list:
      sqdev += (average-value)**2
  sqdev = sqdev / float(len(number_list))
  return math.sqrt(sqdev)

【讨论】:

  • 将 sqdev += (average-value)**2 / float(len(number_list)) 工作在一行吗?
  • 是的,你可以做一个运行平均。根据您的目标,有多种方法可以优化功能。