NumPy 中的加权标准差

新手上路,请多包涵

numpy.average() 有权重选项,但 numpy.std() 没有。有没有人有解决方法的建议?

原文由 YGA 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

下面这个简短的“手工计算”怎么样?

 def weighted_avg_and_std(values, weights):
    """
    Return the weighted average and standard deviation.

    values, weights -- Numpy ndarrays with the same shape.
    """
    average = numpy.average(values, weights=weights)
    # Fast and numerically precise:
    variance = numpy.average((values-average)**2, weights=weights)
    return (average, math.sqrt(variance))

原文由 Eric O Lebigot 发布,翻译遵循 CC BY-SA 4.0 许可协议

statsmodels 中有一个类可以轻松计算加权统计信息: statsmodels.stats.weightstats.DescrStatsW

假设此数据集和权重:

 import numpy as np
from statsmodels.stats.weightstats import DescrStatsW

array = np.array([1,2,1,2,1,2,1,3])
weights = np.ones_like(array)
weights[3] = 100

您初始化类(请注意,您必须传入校正因子,此时 的自由度 增量):

 weighted_stats = DescrStatsW(array, weights=weights, ddof=0)

然后你可以计算:

  • .mean 加权平均值
   >>> weighted_stats.mean
  1.97196261682243

  • .std 加权标准差
   >>> weighted_stats.std
  0.21434289609681711

  • .var 加权方差
   >>> weighted_stats.var
  0.045942877107170932

   >>> weighted_stats.std_mean
  0.020818822467555047

以防万一您对标准误差和标准偏差之间的关系感兴趣:标准误差是(对于 ddof == 0 )计算为加权标准偏差除以权重总和的平方根负 1( GitHub 上 statsmodels 版本 0.9 的相应来源):

   standard_error = standard_deviation / sqrt(sum(weights) - 1)

原文由 MSeifert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏