在python中实现特定的分发
我想返回在python中实现特定的分发,python,random,probability,Python,Random,Probability,我想返回1这会很有趣。。。我对这些东西有点生疏,所以一个好的数学家可以修正我的推理 要从公式生成分布,首先需要做一些积分并计算指定间隔的累积密度函数。 特别是我们需要开始计算归一化常数。 对于“k”,该积分给出: 累积密度函数的“意义”是“获得属于我需要的区间的某个数字的概率是多少?”。这个问题可以用另一种方式来理解:“取一个小于或等于10的数字的概率必须是1”。这导致以下方程式有助于找到参数“C”。注意,第一个therm是k,第二个therm是2^(1-x)的一般积分,其中我将x替换为10
1这会很有趣。。。我对这些东西有点生疏,所以一个好的数学家可以修正我的推理
要从公式生成分布,首先需要做一些积分并计算指定间隔的累积密度函数。
特别是我们需要开始计算归一化常数。
对于“k”,该积分给出:
累积密度函数的“意义”是“获得属于我需要的区间的某个数字的概率是多少?”。这个问题可以用另一种方式来理解:“取一个小于或等于10的数字的概率必须是1”。这导致以下方程式有助于找到参数“C”。注意,第一个therm是k,第二个therm是2^(1-x)的一般积分,其中我将x替换为10。
解决了这个问题,我们终于找到了CDF(同样,找到CDF的方法可能更容易):
此时,我们需要反转X的CDF。X现在是介于0和1之间的随机数生成器。公式是:
在python代码中,我尝试了以下方法:
import numpy as np
import matplotlib.pyplot as plt
a=[ 1- np.log2(1-(1-2**(-9))*np.random.rand()) for i in range(10000)]
plt.hist(a, normed=True)
这有意义吗?虽然@Fabrizio的答案可能是正确的,但有一种更简单的方法来完成工作——你想要的是指数截断,因为你的PDF看起来像
PDF(x)~2-x=e-x日志(2)
SciPy中已经有截断指数,请看
只要设置适当的规模和位置,工作就完成了。代码
import numpy as np
from scipy.stats import truncexpon
import matplotlib.pyplot as plt
vmin = 1.0
vmax = 10.0
scale=1.0/np.log(2.0)
r = truncexpon.rvs(b=(vmax-vmin)/scale, loc=vmin, scale=scale, size=100000)
print(np.min(r))
print(np.max(r))
plt.hist(r, bins=[1,2,3,4,5,6,7,8,9,10], density=True)
直方图
若你们只需要采样整数值,Numpy中也有一个很好的助手函数,下面的代码,这个图非常相似
#%%
import numpy as np
import matplotlib.pyplot as plt
vmin = 1
vmax = 10
v = np.arange(vmin+1, vmax, dtype=np.int64)
p = np.asarray([1.0/2**(l-1) for l in range(vmin+1, vmax)]) # probabilities
p /= np.sum(p) # normalization
r = np.random.choice(v, size=100000, replace=True, p=p)
print(np.min(r))
print(np.max(r))
plt.hist(r, bins=[1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5], density=True)
让您付出了很多努力,这可能是对的,但是截断指数(实际上就是这样)已经在Python生态系统中实现了,请看我的回答true和true。另一方面,我的推理路线可以推广到几乎任何函数。所以另一个程序员可以按照我的推理为他想要的函数找到一个生成器。但事实上,您的解决方案更简单。但有一个问题,PDF(x)~2^-x对于x~1不是很好的近似值,因为他的函数是PDF(x)~2^(1-x)。我在第一个箱子上看到我的柱状图和你的柱状图有点不同,是因为这个吗+谢谢你的回答。在直方图中,您有10个箱子,我有9个箱子。请指定您是指离散分布还是连续分布