【问题标题】:Create random numbers with left skewed probability distribution创建具有左偏概率分布的随机数
【发布时间】:2014-09-11 08:38:49
【问题描述】:

我想在 1-100 之间随机选择一个数字,这样获得数字 60-100 的概率高于 1-59。

我希望有概率成为数字 1-100 的左偏分布。也就是说,它有一条长长的尾巴和一个尖峰。

类似的东西:

pers = np.arange(1,101,1)
prob = <left-skewed distribution>
number = np.random.choice(pers, 1, p=prob)

我不知道如何生成左偏离散概率函数。有任何想法吗?谢谢!

【问题讨论】:

    标签: python statistics


    【解决方案1】:

    这是您使用 SciPy 函数“skewnorm”寻找的答案。它可以使任何正整数集向左或向右倾斜。

    from scipy.stats import skewnorm
    import matplotlib.pyplot as plt
    
    numValues = 10000
    maxValue = 100
    skewness = -5   #Negative values are left skewed, positive values are right skewed.
    
    random = skewnorm.rvs(a = skewness,loc=maxValue, size=numValues)  #Skewnorm function
    
    random = random - min(random)      #Shift the set so the minimum value is equal to zero.
    random = random / max(random)      #Standadize all the vlues between 0 and 1. 
    random = random * maxValue         #Multiply the standardized values by the maximum value.
    
    #Plot histogram to check skewness
    plt.hist(random,30,density=True, color = 'red', alpha=0.1)
    plt.show()
    

    请参考这里的文档: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.skewnorm.html

    Histogram of left-skewed distribution

    代码生成如下图。

    【讨论】:

      【解决方案2】:

      就像你描述的那样,只要确保你的偏态分布加起来为 1.0:

      pers = np.arange(1,101,1)
      
      # Make each of the last 41 elements 5x more likely
      prob = [1.0]*(len(pers)-41) + [5.0]*41
      
      # Normalising to 1.0
      prob /= np.sum(prob)
      
      number = np.random.choice(pers, 1, p=prob)
      

      【讨论】:

      • 感谢您的回答,但我真的在寻找概率分布,而不是范围之间的固定值。例如,我希望概率发生变化,使其具有明显的峰值和长尾。这就是我所说的左偏。
      • @aging_gorrila:嗯,有很多方法可以做到这一点。你的数字代表什么?从您的回答中,您可能会发现您可以简单地坚持通常的 np.random.normal、np.random.poisson...
      • 是的,这会有所帮助。我猜你的例子的链接没有通过。可以再发一次吗?
      • 如果你只需要一个偏态分布的例子,你可以使用这个简单的二项式例子。抛硬币 100 次后的“正面”总数,假设正面:反面概率为 0.8:0.2:prob=np.random.binomial(100, 0.8, 100)。这将返回 100 个随机数,包括 0 到 100 之间,峰值概率为 80。
      • 这是完美的。谢谢!
      【解决方案3】:

      np.random.choice 的 p 参数是与第一个参数中数组中每个元素相关联的概率。所以像:

          np.random.choice(pers, 1, p=[0.01, 0.01, 0.01, 0.01, ..... , 0.02, 0.02])
      

      其中 0.01 是 1-59 的较低概率,0.02 是 60-100 的较高概率。

      SciPy 文档有一些有用的示例。

      http://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.random.choice.html

      编辑: 您也可以尝试此链接并寻找适合您正在寻找的模型的分布(大约在页面的一半处)。

      http://docs.scipy.org/doc/scipy/reference/stats.html

      【讨论】:

      • 谢谢,但正如我上面解释的那样,我正在寻找一个分布而不是固定值。
      • 我添加了一个新链接,其中包含一些应该适合您正在寻找的分布。
      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多