我正在寻找一个计算第n个中心矩的函数
(与scipy.stats.moment中的一个相同)
用于我的合并数据(超出numpy.histogram函数)。
# Generate normal distributed data
import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(size=500,loc=1,scale=2)
H = np.histogram(data,bins=50)
plt.scatter(H[1][:-1],H[0])
plt.show()
在我上面的代码示例中,前四个时刻的结果应为(0,4,0,48),因为sigma = 2(对于中心矩)。
最佳答案
处理合并数据与处理加权数据基本相同。人们将每个仓的中点用作数据点,并将该仓的计数作为其权重。如果scipy.stats.moment
支持权重,我们可以直接进行此计算。照原样,使用支持权重的方法numpy.average
。
midpoints = 0.5 * (H[1][1:] + H[1][:-1])
ev = np.average(midpoints, weights = H[0])
print(ev)
for k in range(2, 5):
print(np.average((midpoints - ev)**k, weights = H[0]))
输出(显然是随机的):
1.08242834443
4.21602099286
0.713129264647
51.6257736139
我没有打印居中的第一时刻(在构造上为0),而是打印了期望值。理论上*,它们是1、4、0、48,但是对于任何给定的样本,都将与分布参数有些偏差。
(*) 不完全是。在方差公式中,我未包含校正因子
n/(n-1)
(其中n是数据集的总大小,即权重之和)。此因子调整sample variance,使其成为总体方差的无偏估计量。如果愿意,可以包含它。对于高阶矩,可能需要进行类似的调整(如果目标是拥有无偏的估计量),但我必须对此进行检查,并且无论如何这都不是一个统计站点。