指数分布java_如何以有效的方式截断numpy / scipy指数分布?

本文介绍了如何在Java中有效地截断指数分布。通过生成指数分布的随机变量并进行筛选,或者使用累积分布函数(CDF)和百分位点函数(PPF)直接生成截断值,可以实现截断。此外,还讨论了如何调整截断分布的期望平均值。
摘要由CSDN通过智能技术生成

有两种方法可以做到这一点:

第一种是生成指数分布的随机变量,然后将值限制为(1,10) .

In [14]:

import matplotlib.pyplot as plt

import scipy.stats as ss

Lambda = 2.5 #expected mean of exponential distribution is lambda in Scipy's parameterization

Size = 1000

trc_ex_rv = ss.expon.rvs(scale=Lambda, size=Size)

trc_ex_rv = trc_ex_rv[(trc_ex_rv>1)&(trc_ex_rv<10)]

In [15]:

plt.hist(trc_ex_rv)

plt.xlim(0, 12)

Out[15]:

(0, 12)

ad0da4c382ecec466e0128713f8812c6.png

In [16]:

trc_ex_rv

Out[16]:

array([...]) #a lot of numbers

当然,问题是你不会得到确切的随机数(这里由 Size 定义) .

In [17]:

import numpy as np

def trunc_exp_rv(low, high, scale, size):

rnd_cdf = np.random.uniform(ss.expon.cdf(x=low, scale=scale),

ss.expon.cdf(x=high, scale=scale),

size=size)

return ss.expon.ppf(q=rnd_cdf, scale=scale)

In [18]:

plt.hist(trunc_exp_rv(1, 10, Lambda, Size))

plt.xlim(0, 12)

Out[18]:

(0, 12)

de94d89311d2825ab6a81938768eaabe.png

如果希望得到的有界分布具有给定值的预期平均值,比如说 2.5 ,则需要求解得到预期均值的scale参数 .

import scipy.optimize as so

def solve_for_l(low, high, ept_mean):

A = np.array([low, high])

return 1/so.fmin(lambda L: ((np.diff(np.exp(-A*L)*(A*L+1)/L)/np.diff(np.exp(-A*L)))-ept_mean)**2,

x0=0.5,

full_output=False, disp=False)

def F(low, high, ept_mean, size):

return trunc_exp_rv(low, high,

solve_for_l(low, high, ept_mean),

size)

rv_data = F(1, 10, 2.5, 1e5)

plt.hist(rv_data, bins=50)

plt.xlim(0, 12)

print rv_data.mean()

结果:

2.50386617882

81834776798aca90a6dac7526da3305a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值