NumPy中的加权标准差

YGA*_*YGA 64 python numpy weighted standard-deviation statsmodels

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

Eri*_*got 111

以下简短的"手动计算"怎么样?

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))
Run Code Online (Sandbox Code Playgroud)

  • 为什么不再使用`numpy.average`来获得方差? (4认同)
  • 只是想指出这会产生偏差.对于小样本量,您可能需要重新调整方差(在sqrt之前)以获得无偏差.请参阅https://en.wikipedia.org/wiki/Weighted_variance#Weighted_sample_variance (4认同)
  • `np.sqrt()` 可以工作,但是因为 `variance` 是一个简单的(Numpy)浮点数(而不是 NumPy 数组),所以 `math.sqrt()` 更明确和合适(因此通常更快,如果这很重要)。 (2认同)

MSe*_*ert 28

有一个类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
Run Code Online (Sandbox Code Playgroud)

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

weighted_stats = DescrStatsW(array, weights=weights, ddof=0)
Run Code Online (Sandbox Code Playgroud)

然后你可以计算:


Leo*_*Leo 9

这里还有一个选择:

np.sqrt(np.cov(values, aweights=weights))
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 6

在numpy/scipy中似乎没有这样的功能,但是有一张提出了这个附加功能.包含在那里你会发现Statistics.py实现加权标准偏差.