我已经从python数据集中提取了一些变量,我想从我的分布中生成更大的数据集。问题是我试图在保持相似行为的同时为新数据集引入一些可变性。这是我提取的数据的一个示例,其中包含400个观察值:
Value Observation Count Ratio of Entries
1 352 0.88
2 28 0.07
3 8 0.02
4 4 0.01
7 4 0.01
13 4 0.01
现在,我正在尝试使用此信息来生成具有2,000个观测值的相似数据集。我知道numpy.random.choice
和random.choice
函数,但是我不想使用完全相同的发行版。相反,我想根据分布生成随机变量(值列),但具有更大的可变性。我想要更大的数据集的示例:
Value Observation Count Ratio of Entries
1 1763 0.8815
2 151 0.0755
3 32 0.0160
4 19 0.0095
5 10 0.0050
6 8 0.0040
7 2 0.0010
8 4 0.0020
9 2 0.0010
10 3 0.0015
11 1 0.0005
12 1 0.0005
13 1 0.0005
14 2 0.0010
15 1 0.0005
因此,如果我用指数衰减函数拟合原始数据,则可以估算新分布,但是,我对连续变量不感兴趣。我该如何解决这个问题,并且有一种与我想做的事情相关的特定方法或数学方法吗?
听起来您想基于第二张表中所述的PDF生成数据。PDF就像
0 for x <= B
A*exp(-A*(x-B)) for x > B
A
定义分布的宽度,该宽度将始终归一化为1。B
水平偏移量,在您的情况下为零。您可以通过与合并将其设为整数分布ceil
。
归一化衰减指数的CDF为1 - exp(-A*(x-B))
。通常,进行自定义分发的一种简单方法是生成统一编号并通过CDF映射它们。
幸运的是,您不必这样做,因为它scipy.stats.expon
已经提供了您要寻找的实现。您所要做的就是将最后一列中的数据拟合为A
(B
显然为零)。您可以轻松地做到这一点curve_fit
。请记住,它A
映射为1.0/scale
scipy PDF语言。
这是一些示例代码。我在这里通过计算目标函数从n-1
到n
整数输入的整数,并在进行拟合时为您考虑了合并,从而增加了一层复杂性。
import numpy as np
from scipy.optimize import curve_fit
from scipy.stats import expon
def model(x, a):
return np.exp(-a * (x - 1)) - exp(-a * x)
#Alternnative:
# return -np.diff(np.exp(-a * np.concatenate(([x[0] - 1], x))))
x = np.arange(1, 16)
p = np.array([0.8815, 0.0755, ..., 0.0010, 0.0005])
a = curve_fit(model, x, p, 0.01)
samples = np.ceil(expon.rvs(scale=1/a, size=2000)).astype(int)
samples[samples == 0] = 1
data = np.bincount(samples)[1:]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句