基于python中的一个值生成类似于数据的“正态分布”

时间:2016-11-09 08:39:14

标签: python gaussian

我有一个var temp,比如temp = 100.我想要做的是生成8个数据点。这8个点显示如图所示。它看起来像正态分布,但我想在这些点中添加大量随机值,这样它们看起来就不像一个完美的正态分布。最终数据(曲线下面积)应加总为temp 。有人可以建议如何在Python中轻松整齐地做到这一点吗?

我试过在numpy / matplot中使用分布函数。但是,我想知道如何获得如图所示的8点(x = 0,1,2,3,4 ......)?另外,我无法弄清楚如何将它们总和为100?

enter image description here

1 个答案:

答案 0 :(得分:1)

通过强加总和temp=100,您会在至少两个数据点之间引入依赖关系,从而无法创建一组独立采样的随机数据点。

This answer on mathworks提供了更详细的信息。

一个更简单的例子:

想象一下硬币翻转。系统中的随机性恰好是一个二进制结果,或1位。

想象一下两个硬币翻转。系统中的随机性恰好是两个二进制结果或2位。

现在想象一下对两个硬币翻转施加一个总和约束,假设你想要系统中硬币翻转的总和恰好等于1.因为第二个硬币翻转的结果是由第一个二元决策的结果决定的,系统中的随机性会缩小。

因此,您将系统的总随机性从2位降低到1位。

因此无法从具有和约束的正态分布中采样8个真正(伪)随机点。

您最好的选择是从具有适当均值的分布中抽取7个随机点,然后在数据集中添加一个点以吸收差异:

>>> import numpy as np
>>> temp = 100.0
>>> datapoints = 8
>>> dev = 1
>>> data = np.random.normal(temp/datapoints, dev, datapoints-1)
>>> print(data)
[ 11.70369328  10.77010243  11.20507387  12.40637644  12.81099137
  12.55329521  10.95809056]
>>> data = np.append(data,temp-sum(data))
>>> data
array([ 11.70369328,  10.77010243,  11.20507387,  12.40637644,
        12.81099137,  12.55329521,  10.95809056,  17.59237685])
>>> sum(data)
100.0