在Python中计算加权统计矩

3

我一直在寻找一种函数或包,可以让我以加权的方式计算分布的偏度和峰度,因为我有直方图数据。

例如,我有以下数据

import numpy as np

np.array([[1, 2],
          [2, 5],
          [3, 6],
          [4,12],
          [5, 1])

第一列 [1,2,3,4,5] 是值,第二列 [2,5,6,12,1] 是相应的频率。

我已经找到了如何使用此主题中指定的weighted_avg_and_std函数按加权方式计算前两个时刻(平均值、标准偏差),但我不太确定如何将它扩展到偏度和峰度,甚至是第n时刻。

我在这里找到了定义本身,并可以手动编写函数来从头开始实现它,但在我开始这样做之前,我想知道是否有任何现有的软件包或函数可以完成此操作。

谢谢

编辑: 我找到了解决方法,以下代码有效(请注意,这适用于人口时刻)

skewnewss = np.average(((values-average)/np.sqrt(variance))**3, weights=weights)

并且
kurtosis=np.average(((values-average)/np.sqrt(variance))**4-3, weights=weights)
2个回答

2

取自 此处

这里是代码

def weighted_mean(var, wts):
    """Calculates the weighted mean"""
    return np.average(var, weights=wts)


def weighted_variance(var, wts):
    """Calculates the weighted variance"""
    return np.average((var - weighted_mean(var, wts))**2, weights=wts)


def weighted_skew(var, wts):
    """Calculates the weighted skewness"""
    return (np.average((var - weighted_mean(var, wts))**3, weights=wts) /
            weighted_variance(var, wts)**(1.5))

def weighted_kurtosis(var, wts):
    """Calculates the weighted skewness"""
    return (np.average((var - weighted_mean(var, wts))**4, weights=wts) /
            weighted_variance(var, wts)**(2))

1
我想你已经列出了所需的所有原料,按照你提供的链接中的配方进行操作。
import numpy as np

a = np.array([[1,2],[2,5],[3,6],[4,12],[5,1]])
values, weights = a.T

def n_weighted_moment(values, weights, n):

    assert n>0 & (values.shape == weights.shape)
    w_avg = np.average(values, weights = weights)
    w_var = np.sum(weights * (values - w_avg)**2)/np.sum(weights)

    if n==1:
        return w_avg
    elif n==2:
        return w_var
    else:
        w_std = np.sqrt(w_var)
        return np.sum(weights * ((values - w_avg)/w_std)**n)/np.sum(weights)
              #Same as np.average(((values - w_avg)/w_std)**n, weights=weights)


这导致了什么结果:
for n in range(1,5):
    print(f'Moment {n} value is {n_weighted_moment(values, weights, n)}')

Moment 1 value is 3.1923076923076925
Moment 2 value is 1.0784023668639053
Moment 3 value is -0.5962505715592139
Moment 4 value is 2.384432138280637

请注意,当您计算超额峰度时,通用的n阶矩公式并未考虑此因素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接