生成遵循分布的平滑的随机数

时间:2014-06-05 12:37:20

标签: python random histogram

我有两个变量,我们称之为xy,它们在绘制时是图中分散的蓝点。 我使用Scipy的曲线拟合了它们。

我想生成(比方说500000)"平滑" 随机数复制分布,后跟xy

enter image description here

通过"平滑" 我的意思是,我不希望randoms完全复制我的数据(xy)数字低于 red diamonds being my data distribution and the histogram being my generated randoms. 甚至数据的波动在这里复制!!!! )。我想要一个平滑的"直方图。

enter image description here

到目前为止,我尝试过使用scipy中的x来匹配点ycurve_fit。所以现在我知道数据分布是什么。现在我需要创建遵循上述拟合 /分布的随机数。

P.S我也试过从0到1创建统一的randoms并试图得到拟合曲线下面的点,但我不知道怎么做!

2 个答案:

答案 0 :(得分:2)

我建议您对数据分布进行拟合,然后向其中添加一些随机的“噪声”,这应该会产生一些仍然遵循您的分布的数据,但是随机出现以用于您需要的任何目的。

下面是一些代码,它使数据分布适合(在函数curve中),然后使用numpy.random模块随机化从中检索的数据。

import numpy as np
import matplotlib.pyplot as plt
from random import random

# I don't have your data but let's assume that this function 
# replicates the data distribution you want to work with.
def curve(x):
    return 2. * x + 5.

N = 100
x = np.linspace(0,1,100)
y_fit = curve(x)

# margin controls how "noisy" you want your fit to be.
margin = 0.5

noise = margin*(np.random.random(N)-0.5)
y_ran = y_fit + noise

plt.plot(x, y_fit) # Plot the fitted distribution.
plt.plot(x, y_ran, 'rx') # Plot the noisy data.

plt.show()

请注意,这只创建了100个随机结果,如果您愿意,可以根据需要修改代码。

Plot

答案 1 :(得分:0)

我认为您可以做的是将您的拟合重新缩放到y范围[0,1],然后开始以下循环:

  
      
  • 生成随机x值
  •   
  • 对于此x值,生成范围为[0,1]
  • 的y值   
  • 如果此y值低于该x值的重新缩放拟合值,则接受它,否则丢弃x-y对并转到循环的下一次迭代
  •   

这应该会给你一堆跟随你的平滑分布的随机数