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

问题描述 投票:0回答:1

我需要从 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 和比例以获得均值和单位方差为零的样本?

提前非常感谢。

python scipy sampling
1个回答
0
投票

我应该如何设置 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,而无需手动调整,则需要进行一些对话。

© www.soinside.com 2019 - 2024. All rights reserved.