我有两个变量,我们称之为x
和y
,它们在绘制时是图中分散的蓝点。 我使用Scipy的曲线拟合了它们。
我想生成(比方说500000)"平滑" 随机数复制分布,后跟x
和y
。
通过"平滑" 我的意思是,我不希望randoms完全复制我的数据(x
和y
)数字低于, red diamonds being my data distribution and the histogram being my generated randoms.
(甚至数据的波动在这里复制!!!! )。我想要一个平滑的"直方图。
到目前为止,我尝试过使用scipy中的x
来匹配点y
和curve_fit
。所以现在我知道数据分布是什么。现在我需要创建遵循上述拟合 /分布的随机数。
P.S我也试过从0到1创建统一的randoms并试图得到拟合曲线下面的点,但我不知道怎么做!
答案 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个随机结果,如果您愿意,可以根据需要修改代码。
答案 1 :(得分:0)
我认为您可以做的是将您的拟合重新缩放到y范围[0,1],然后开始以下循环:
- 生成随机x值
- 对于此x值,生成范围为[0,1]
的y值- 如果此y值低于该x值的重新缩放拟合值,则接受它,否则丢弃x-y对并转到循环的下一次迭代
这应该会给你一堆跟随你的平滑分布的随机数