Numpy 用Python计算加权统计矩
我一直在寻找一个函数或包,它允许我以加权的方式计算分布的偏斜和峰度,因为我有直方图数据 例如,我有数据Numpy 用Python计算加权统计矩,numpy,scipy,skew,kurtosis,code-statistics,Numpy,Scipy,Skew,Kurtosis,Code Statistics,我一直在寻找一个函数或包,它允许我以加权的方式计算分布的偏斜和峰度,因为我有直方图数据 例如,我有数据 将numpy导入为np np.数组([[1,2], [2, 5], [3, 6], [4,12], [5, 1]) 其中第一列[1,2,3,4,5]是数值,第二列[2,5,6,12,1]是数值的频率 我已经找到了如何使用中指定的加权的\u avg\u和\u std函数以加权方式进行前两个矩(平均值、标准偏差),但我不太确定如何将其扩展到偏斜和峰度,甚至第n个统计矩 我已经找到了定义本身,可以
将numpy导入为np
np.数组([[1,2],
[2, 5],
[3, 6],
[4,12],
[5, 1])
其中第一列[1,2,3,4,5]
是数值,第二列[2,5,6,12,1]
是数值的频率
我已经找到了如何使用中指定的加权的\u avg\u和\u std
函数以加权方式进行前两个矩(平均值、标准偏差),但我不太确定如何将其扩展到偏斜和峰度,甚至第n个统计矩
我已经找到了定义本身,可以手动编写函数来从头开始实现它,但在我开始之前,我想知道是否有任何现有的包或函数可以实现这一点
谢谢
编辑:
我明白了,下面的代码是有效的(请注意,这是针对人口时刻的)
skewnews=np.average((平均值)/np.sqrt(方差))**3,权重=权重)
及
kurtosis=np.average((平均值)/np.sqrt(方差))**4-3,权重=权重)
我想您已经按照您提供的链接中的配方列出了所需的所有成分:
将numpy导入为np
a=np.数组([[1,2],[2,5],[3,6],[4,12],[5,1]]
值,权重=a.T
定义n_加权力矩(值、权重,n):
断言n>0&(values.shape==weights.shape)
w_平均值=np平均值(值,权重=权重)
w_var=np.和(权重*(值-w_平均值)**2)/np.和(权重)
如果n==1:
返回w_平均值
elif n==2:
返回w_var
其他:
w_标准=np.sqrt(w_变量)
返回np.和(权重*((值-w_平均值)/w_标准)**n)/np.和(权重)
#与np.平均值相同((值-w_平均值)/w_标准)**n,权重=权重)
其结果是:
范围(1,5)内的n的:
打印(f'矩{n}值为{n_加权_矩(值,权重,n)}')
力矩1的值为3.19230769223076925
力矩2值为1.0784023668639053
力矩3值为-0.5962505715592139
力矩4的值为2.384432138280637
请注意,在计算多余峰度时,为一般n矩实现的公式没有考虑到这一点。摘自
这是密码
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))