生成符合分布的平滑随机数
我有两个变量,叫它们 x
和 y
,在图上显示为散落的蓝点。我用Scipy的curve_fit功能对它们进行了拟合。
我想生成大约500000个“平滑的”随机数,这些随机数要模仿 x
和 y
的分布。
这里的“平滑的”意思是,我不想要那些完全复制我数据的随机数(x
和 y
),就像下面的图那样,红色的菱形代表我的数据分布,而直方图则是我生成的随机数。(甚至数据的波动都在这里被复制了!!!!)我想要一个“平滑”的直方图。
到目前为止,我尝试用 curve_fit
来拟合 x
和 y
的点。现在我知道数据的分布是什么样的。接下来,我需要创建遵循上述拟合/分布的随机数。
附注:我还尝试过从0到1生成均匀随机数,并试图获取拟合曲线下方的点,但我不知道该怎么做!
2 个回答
1
我觉得你可以尝试把你的数据调整到y的范围[0,1],然后开始下面的循环:
- 生成一个随机的x值
- 对于这个x值,生成一个在[0,1]范围内的y值
- 如果这个y值低于在这个x值处调整后的数据值,就接受这个x-y对;否则就丢弃这个x-y对,继续下一次循环
这样你应该能得到一堆符合你平滑分布的随机数
3
我建议你先把数据的分布情况搞清楚,然后再给这些数据加上一些随机的“噪音”。这样做可以生成一些仍然符合你原来分布的数据,但这些数据会变得随机,适合你需要的各种用途。
下面的代码会先获取一个数据分布的拟合结果(在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个随机化的结果。如果你需要更多,可以修改代码来生成你想要的数量。