生成符合分布的平滑随机数

3 投票
2 回答
2126 浏览
提问于 2025-04-18 08:43

我有两个变量,叫它们 xy,在图上显示为散落的蓝点。我用Scipy的curve_fit功能对它们进行了拟合

我想生成大约500000个“平滑的”随机数,这些随机数要模仿 xy 的分布。

enter image description here

这里的“平滑的”意思是,我不想要那些完全复制我数据的随机数(xy),就像下面的图那样,红色的菱形代表我的数据分布,而直方图则是我生成的随机数。甚至数据的波动都在这里被复制了!!!!)我想要一个“平滑”的直方图。

enter image description here

到目前为止,我尝试用 curve_fit 来拟合 xy 的点。现在我知道数据的分布是什么样的。接下来,我需要创建遵循上述拟合/分布的随机数。

附注:我还尝试过从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个随机化的结果。如果你需要更多,可以修改代码来生成你想要的数量。

Plot

撰写回答