创建遵循特定数据分布的数据

0 投票
1 回答
918 浏览
提问于 2025-04-18 09:16

我有一个变量 x,里面有2700个数据点。这些是我的原始数据。

我的数据的直方图看起来是这样的。青色的线表示我的数据分布。我使用了 curve_fit 来拟合我的直方图,并得到了拟合曲线。这个拟合曲线是一个包含100000个点的numpy数组。

enter image description here

我想生成一组平滑的 随机数据,比如说100000个点,这些点要遵循我 原始数据分布。也就是说,我希望这些点在拟合曲线的下面,从0.0开始,随着曲线的变化一直增加到0.5。

到目前为止,我尝试过的方法是:

我使用 np.random.uniform(0,0.5,100000) 生成了一些均匀的随机数。

random_x = []

u = np.random.uniform(0,0.5,100000)

for i in u:
    if i<=y_ran:  # here y_ran is the numpy array of the fitted curve
        random_x.append(i)

但是我遇到了一个错误 `ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()`。

我知道上面的代码不太对,但我该怎么继续呢?

1 个回答

0

我会这样来解决这个问题:首先,把你的 y_ran 拟合曲线调整成一个高斯曲线(你可以参考一下这个问题),然后用已知的参数从一个正态分布中抽样,可以通过np.random.normal这个函数来实现。大概可以这样做(部分内容来自我提到的那个问题的回答):

import numpy
from scipy.optimize import curve_fit    

# Define model function to be used to fit to the data above:
def gauss(x, *p):
    A, mu, sigma = p
    return A*numpy.exp(-(x-mu)**2/(2.*sigma**2))

# p0 is the initial guess for the fitting coefficients (A, mu and sigma above)
p0 = [1., 0., 1.]

coeff, var_matrix = curve_fit(gauss, x, y_ran, p0=p0)

sample = numpy.random.normal(*coeff, (100000,))

注意:1. 这个还没有经过测试,2. 你需要为你的拟合曲线准备 x 值。

撰写回答