【发布时间】:2017-05-30 04:31:38
【问题描述】:
我希望能够生成具有来自绘制曲线的概率密度函数的随机数。下面这两个具有相同的曲线下面积,但应生成具有不同特征的随机数列表。
我的直觉是这样做的一种方法是对曲线进行采样,然后使用这些矩形的区域来提供np.random.choice 以选择一个范围以在该矩形范围的范围内进行普通随机.
感觉这不是一种非常有效的方法。有没有更“正确”的方法呢?
我真的很擅长做这件事:
import matplotlib.pyplot as plt
import numpy as np
areas = [4.397498, 4.417111, 4.538467, 4.735034, 4.990129, 5.292455, 5.633938,
6.008574, 6.41175, 5.888393, 2.861898, 2.347887, 2.459234, 2.494357,
2.502986, 2.511614, 2.520243, 2.528872, 2.537501, 2.546129, 7.223747,
7.223747, 2.448148, 1.978746, 1.750221, 1.659351, 1.669999]
divisons = [0.0, 0.037037, 0.074074, 0.111111, 0.148148, 0.185185, 0.222222,
0.259259, 0.296296, 0.333333, 0.37037, 0.407407, 0.444444, 0.481481,
0.518519, 0.555556, 0.592593, 0.62963, 0.666667, 0.703704, 0.740741,
0.777778, 0.814815, 0.851852, 0.888889, 0.925926, 0.962963, 1.0]
weights = [a/sum(areas) for a in areas]
indexes = np.random.choice(range(len(areas)), 50000, p=weights)
samples = []
for i in indexes:
samples.append(np.random.uniform(divisons[i], divisons[i+1]))
binwidth = 0.02
binSize = np.arange(min(samples), max(samples) + binwidth, binwidth)
plt.hist(samples, bins=binSize)
plt.xlim(xmax=1)
plt.show()
方法貌似可行,就是有点重!
【问题讨论】:
-
您是说您只有一个带有该曲线的图像文件吗?或者你真的有代表曲线上点坐标的数字吗?
-
也可以。它可能是图像文件,但更可能是绘制的曲线。 svg 或触摸屏上的某种墨水。
-
SVG 是一个图像文件。如果它是在屏幕上绘制的,那么您的程序如何访问它?我问的是您的程序将使用的数据 format 是什么,而不是事物的创建方式。'
-
目前只是假设性的。我在 CAD 程序中对其进行原型设计,但它可能会出现在任何地方。我假设您的意思是位图,可以访问 SVG 曲线中的坐标。 (最终!)
-
从数学上讲,我要做的是整合 PDF 以获得累积分布函数。如果然后将其反转,您将获得一个函数,您可以在其中插入一个随机数 [0, 1] 并有效地从原始分布中获取一个值。您实际如何做到这一点取决于您的数据格式。
标签: python random statistics