from scipy import stats, optimize
import numpy as np
def random_by_moment(moment, value, size):
""" Draw `size` samples out of a generalised Gamma distribution
where a given moment has a given value """
assert moment in 'mvsk', "'{}' invalid moment. Use 'm' for mean,"\
"'v' for variance, 's' for skew and 'k' for kurtosis".format(moment)
def gengamma_error(a):
m, v, s, k = (stats.gengamma.stats(a[0], a[1], moments="mvsk"))
moments = {'m': m, 'v': v, 's': s, 'k': k}
return (moments[moment] - value) ** 2 # has its minimum at the desired value
a, c = optimize.minimize(gengamma_error, (1, 1)).x
return stats.gengamma.rvs(a, c, size=size)
n = random_by_moment('k', 3, 100000)
# test if result is correct
print("mean={}, var={}, skew={}, kurt={}".format(np.mean(n), np.var(n), stats.skew(n), stats.kurtosis(n)))
在对几个分布进行了实验之后,广义Gamma分布似乎足够灵活,可以将倾斜或峰度调整到所需的值,但并不像他在评论中提到的question@gabriel中所要求的那样同时进行调整。在
因此,要从具有一个单一固定矩的g-Gamma分布中提取一个样本,您可以使用^{} 来找到一个惩罚函数最小的分布(我选择了
(target - value) ** 2
)在此之前,我提出了一个函数,它与skew和峰度相匹配。然而,即使是g-伽马射线也不够灵活,不足以达到这个目的,这取决于你的条件有多极端
^{pr2}$相关问题 更多 >
编程相关推荐