如何利用python中的威布尔分布numpy.random.weibull()函数生成三参数的随机数序列你好,有两个办法:
一个是自己写一个函数
def Nweibull(a,size, scale)
return scale*numpy.random.weibull(a,size)
另外一个是换一个库,用scipy.stats.weibull_min,他需要三个参数:
from scipy.stats import weibull_min
n = 100# number of samples
k = 2.4# shape
lam = 5# scale
x = weibull_min.rvs(k, loc=0, scale=lam, size=n)
如何根据概率密度函数生成随机数如何根据概率密度函数生成随机数
我这里并不是要讲“伪随机”、“真随机”这样python概率分布函数的问题python概率分布函数,而是关于如何生成服从某个概率分布的随机数(或者说 sample)的问题 。比如,python概率分布函数你想要从一个服从正态分布的随机变量得到 100 个样本,那么肯定抽到接近其均值的样本的概率要大许多,从而导致抽到的样本很多是集中在那附近的 。当然,要解决这个问题,我们通常都假设我们已经有python概率分布函数了一个 生成 0 到 1 之间均匀分布的随机数的工具,就好像 random.org 给我们的结果那样,事实上许多时候我们也并不太关心它们是真随机数还是伪随机数,看起来差不多就行了 。:p
现在再回到我们的问题,看起来似乎是很简单的,按照概率分布的话,只要在概率密度大的地方多抽一些样本不就行了吗?可是具体要怎么做呢?要真动起手 来,似乎有不是那么直观了 。实际上,这个问题曾经也是困扰了我很久,最近又被人问起,那我们不妨在这里一起来总结一下 。为了避免一下子就陷入抽象的公式推 导,那就还是从一个简单的具体例子出发好了,假设我们要抽样的概率分布其概率密度函数为 p(x) = \frac{1}{9}x^2 , 并且被限制在区间 [0, 3] 上,如右上图所示 。
好了,假设现在我们要抽 100 个服从这个分布的随机数 , 直观上来讲,抽出来的接近 3 的数字肯定要比接近 0 的数字要多 。那究竟要怎样抽才能得到这样的结果呢?由于我们实际上是不能控制最原始的随机数生成过程的,我们只能得到一组均匀分布的随机数,而这组随机数 的生成过程对于我们完全是透明的,所以,我们能做的只有把这组均匀分布的随机数做一些变换让他符合我们的需求 。找到下手的点了,可是究竟要怎样变换呢?有 一个变换相信大家都是很熟悉的,假设我们有一组 [0,1] 之间的均匀分布的随机数 X_0 , 那么令 X_1=3X_0 的话,X_1 就是一组在 [0,3] 之间均匀分布的随机数了,不难想象,X_1 等于某个数 x^* 的概率就是 X_0 等于 x^*/3 的概率(“等于某个数的概率”这种说法对于连续型随机变量来说其实是不合适的 , 不过大概可以理解所表达的意思啦) 。似乎有一种可以“逆转回去”的感觉了 。
于是让我们来考虑更一般的变换 。首先 , 我们知道 X_1 的概率密度函数是 f(x) = 1/3, x\in[0,3],假设现在我们令 Y = \phi (X_1),不妨先假定 \phi(\cdot) 是严格单调递增的函数,这样我们可以求其逆函数 \phi^{-1}(\cdot) (也是严格单调递增的) 。现在来看变换后的随机变量 Y 会服从一个什么样的分布呢?
这里需要小心,因为这里都是连续型的随机变量,并不像离散型随机变量那样可以说成“等于某个值的概率”,因此我们需要转换为概率分布函数来处理 , 也就是求一个积分啦:
\displaystyle F(x) = P(X \leq x) = \int_{-\infty}^x f(t)dt
那么 X_1 的概率分布函数为 F(x) = \frac{1}{3}x。很显然 Y 小于或等于某个特定的值 y^* 这件事情是等价于 X_1=\phi^{-1}(Y)\leq\phi^{-1}(y^*) 这件事情的 。换句话说,P(Y\leq y^*) 等于 P(X_1 \leq \phi^{-1}(y^*))。于是 , Y 的概率分布函数就可以得到了:
推荐阅读
- 如何浏览单个pdf,如何快速浏览多个pdf文件
- 区块链怎么报销发票,区块链发票能开专票吗
- 希腊即时战略游戏是什么,希腊即时战略游戏是什么游戏
- 怎么查mysql安装路径 怎么看mysql安装路径
- 小程序里文件怎么删,微信小程序里的文件
- 如何把pdf转成word,如何把pdf转成word文件
- 怎么用python2画爱心,用python画一个爱心
- vb.net网络监控 vbs监控进程的脚本
- redis主机内存需求的简单介绍