scipy 中的连续分布看起来像两个幂律?

Continuous distribution in scipy that looks like two powerlaws?

我需要从大致如下所示的分布生成随机样本:

为了生成上图,我组合了两个幂律:

y = a * x**(a - 1) + b * x**(b - 1)

使用参数 a, b 控制分布的形状。理想情况下,单个形状参数会更好。

scipyContinuous distributions 部分定义了数十种发行版,但我一直无法找到符合我需要的发行版。

在这种情况下,答案很简单。

a * x**(a - 1) + b * x**(b - 1) 在区间 [0, 1] 上的积分仅为 2,表明此分布是两个 power-law 分布的混合,其中一个以相同的概率绘制和另一个一样。* 具体来说,您的分布具有以下密度函数:

(a * x**(a - 1))/2 + (b * x**(b - 1))/2.

然后,从这个分布中抽样的一个简单算法是:

  • 生成 u,[0, 1] 中的均匀随机变量。
  • 概率为 1/2,return u**(1/a)。否则,return u**(1/b).

代码如下:

import scipy.stats as st
import random

def mixpowerlaw(a,b,size):
   unif=st.uniform.rvs(size=size)
   pla=st.powerlaw(a)
   plb=st.powerlaw(b)
   ret=[0 for i in range(size)]
   for i in range(size):
      if unif[i]<0.5:
         ret[i]=pla.rvs()
      else:
         ret[i]=plb.rvs()
   return ret

# Alternate implementation
def mixpowerlaw2(a,b):
   if random.random()<0.5:
      return random.random()**(1/a)
   else:
      return random.random()**(1/b)

* 这是混合分布的 PDF 的性质。由于您在问题的示例中添加了两个 PDF(均集成为 1),因此组合函数将集成为 2,因此该函数除以 2 以获得再次集成为 1 的 PDF。这个组合的 PDF 是 (PDF1)*(1/2) + (PDF2)*(1/2) 形式的混合,因此在这种情况下从这个 PDF 采样意味着从 PDF1 以概率 1/2 或从 PDF2 以概率 1/2 采样。另见 p. Devroye 的“Non-Uniform 随机变量生成”的第 66 个。