scipy 如何在Python中从Burr-Type XII分布中采样?

63lcw9qa  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(96)

我需要在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和scale,以使样本的均值为零,方差为单位?
非常感谢提前。

nx7onnlm

nx7onnlm1#

我应该如何设置c、d、loc和scale,以使样本的均值为零,方差为单位?
首先,我将回答这个问题:“我应该如何设置c,d,loc和scale,以便 * 分布 * 具有零均值和单位方差?”
简而言之,使用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]上归一化的事实解释的。
尽管如此,* 样本 * 均值和 * 样本 * 方差并不完全符合您的预期。

np.mean(rvs)  # -0.00024686599935315023
np.std(rvs, ddof=1)  # 0.69110486803508


这是不可避免的,除非你可以画一个无限大的样本。分布是重尾的,所以当考虑整个总体时,有一些罕见但非常大的值会增加方差,但你观察到的样本方差会倾向于更小的值。
除此之外,由于样本服从分布,因此还需要确定样本的均值和单位方差为零的含义。如果希望它们每次都恰好为0和1,则可以从样本中减去样本均值,然后除以样本标准差。

相关问题