我需要从 Python 中均值为零且单位方差为零的 Burr-Type XII 分布中进行采样。在 scipye 中,有
scipy.stats.burr12
,这似乎是正确的使用方式。但是,我不清楚如何设置参数 c、d、loc 和 scale 以使分布具有零均值和单位方差。
我尝试设置 c=1 和 d=2.1,用
mean,var=burr12.stats(c,d,moments='mv')
计算平均值和方差,并尝试用 x=(burr12.rvs(c,d)-mean)/np.sqrt(var)
重新缩放样本。但是,如果我用 1000 个这样的随机样本制作直方图,它看起来不会有 0 均值和单位方差。
我应该如何设置 c、d、loc 和比例以获得均值和单位方差为零的样本?
提前非常感谢。
我应该如何设置 c、d、loc 和比例以获得均值和单位方差为零的样本?
首先,我将回答这个问题“我应该如何设置 c、d、loc 和标度,以使 distribution 具有零均值和单位方差?”
简而言之,使用
root
来求解您需要的参数。
import numpy as np
from scipy import optimize, stats
# Assuming these are fixed
c = 1
d = 2.1
def f(x):
# when loc and scale are right, this function will return [0, 0]
loc, scale = x
mean, var = stats.burr12.stats(c, d, loc=loc, scale=scale, moments='mv')
return [mean, var - 1]
res = optimize.root(f, [0, 1])
loc, scale = res.x
dist = stats.burr12(c, d, loc=loc, scale=scale)
dist.stats(moments='mv')
# (0.0, 0.9999999999999998)
您可以确认随机变量的 PDF 和直方图彼此非常一致。
import matplotlib.pyplot as plt
x = np.linspace(loc, loc + 1, 300)
plt.plot(x, dist.pdf(x), label='pdf')
rvs = dist.rvs(size=10000000)
plt.hist(rvs, bins=np.linspace(loc, loc+1, 100),
density=True, label='histogram')
plt.xlim(x[0], x[-1])
plt.title("Burr 12 Histogram vs PDF")
直方图略有过剩的原因是直方图在 [0, 1] 而不是 [0, oo] 上进行归一化。
尽管如此,sample均值和sample方差并不完全符合您的预期。
np.mean(rvs) # -0.00024686599935315023
np.std(rvs, ddof=1) # 0.69110486803508
这是不可避免的,除非你可以抽取无限大的样本。该分布是重尾分布,因此在考虑整个总体时,有一些罕见但极大的值会增加方差,但您观察到的样本方差将趋向于较小的值。
如果您确实需要样本均值和样本方差分别为 0 和 1,而无需手动调整,则需要进行一些对话。