【问题标题】:Generating the best exponential distribution with percentile constraints生成具有百分位约束的最佳指数分布
【发布时间】:2020-05-10 04:35:49
【问题描述】:

我正在尝试生成最佳指数分布(适合明智) 将具有以下特点:

1.结果的范围在[0,500]

2.CDF百分位数接近以下关系(.percentile,value) 0.3-50,0.5-100, 0.8:200,0.9-300, 0.95-400, 1-500

首先,我尝试通过 100 的中值约束来获得 lambda 系数: lambda=100/ln(2)= 0.006931 然后绘制分布:

data = np.random.exponential((1/0.006931), size=1000)
plt.hist(data,bins=30)
plt.show()

重新缩放到 [0,500]

data=(data-min(data))/(max(data)-min(data))*500    
plt.hist(data,bins=30)
plt.show()

我试图将结果重新缩放到 500 并绘制直方图和 CDF,但我离类似于百分位数的红点还很远,我也想接近分布。

x = np.sort(data)
y = np.arange(1, len(x) +1) /len(x)
_ = plt.plot(x,y, marker ='.', linestyle='none')
x_percentile = np.array([0,50, 100, 200, 350, 400, 500])
y_percentile = np.array([0,30, 50, 80, 90, 95, 100])
plt.scatter(x_percentile, y_percentile/100,color='r')
plt.xlabel('results')
plt.ylabel('ECDF')
plt.show()

如何找到最接近我的问题的分布函数?

【问题讨论】:

  • 如果它在 500 之后被限制为 0,那么它并不是真正的指数分布。您是否有这样的限制,即 CDF 在 x=0 时也应该为 0? “最佳”/最接近的指数分布可以通过曲线拟合到您的目标百分位数来找到。
  • 嗯,是的,它不是经典的指数,但它应该在 [0,500] 范围内看起来“指数”
  • 你检查我的答案了吗?够了吗?

标签: python statistics distribution exponential


【解决方案1】:

您也许可以使用scipy.optimize.curve_fit 来找到“最佳”指数。假设您有一个约束条件,即 CDF 在 0 时应为 0,即移位为 0,因此 loc=0,我们只需要拟合尺度参数 (lambda):

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import expon
from scipy.optimize import curve_fit

def fitfun(x, *a):
    ex = expon(loc=0, scale=a[0])
    return ex.cdf(x)

y = 0, 0.3, 0.5, 0.8, 0.9, 0.95, 1
x = 0, 50, 100, 200, 300, 400, 500
p, _ = curve_fit(fitfun, x, y, 100/np.log(2))
print(p[0]) # 133.99106748543082
solution = expon(loc=0, scale=p[0])

X = arange(600)
plt.plot(X, solution.cdf(X))
plt.plot(x, y, marker='o', ls='')
plt.show()

使用curve_fit,您可以为拟合添加不确定性,以使 CDF 中的约束 0-0 和 1-500 比其他约束更强,或者使用不同的优化例程。 curve_fit 默认使用最小二乘法和 Levenberg-Marquardt 进行拟合。这只是一个想法,而不是完美的解决方案。

【讨论】:

  • 谢谢!!以及如何绘制新分布的直方图?
  • 绘制solution.pdf(X)。您可以查看 scipy stats 文档:docs.scipy.org/doc/scipy/reference/stats.html 如果您喜欢这个答案,请接受(并投票)。
  • 您也可以使用solution.rvs(size=num)从分布中抽取num随机变量。
  • 谢谢!我可以将随机数生成器的最大数量限制为 500 吗?
  • 不,如果您遇到 > 500 的值,您可以再次采样。这显然会使您的样本有偏差,但这正是您想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
相关资源
最近更新 更多