生成具有百分比约束的最佳指数分布

贝努斯13

我试图生成最佳指数分布(明智的做法),该分布将具有以下特征:

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()

在此处输入图片说明

比Im尝试将结果重新缩放到500并绘制直方图和CDF,但是Im离类似于百分位数的红点相差很远,我也希望与分布接近。

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()

在此处输入图片说明

如何找到最适合我问题的分布函数?

简·克里斯托夫·泰拉莎

您也许可以使用它scipy.optimize.curve_fit来找到“最佳”指数。假设您有一个约束,即CDF应该在0处为0,即平移为0,因此loc = 0,我们只需要拟合scale参数(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进行拟合。这仅是一个想法,而不是一个完美的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章