2016-11-09 48 views
1

我有一个var temp,比如temp = 100。我想要做的是生成8个数据点。这8点显示如图所示。它看起来像正态分布,但我想在这些点上添加很多随机值,以便它们看起来不像完美的正态分布。最终数据(曲线下方的面积)应为,总计为温度。有人可能会建议如何在Python中轻松整齐地做到这一点吗?基于python中的一个值生成“正态分布”数据

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

enter image description here

+0

解决方法有很多,这里有7个工具:

你最好的选择是从与相应的平均分配样本7个随机点,然后点添加到数据集承担差额https://www.dataquest.io/blog/python-data-visualization-libraries/ –

+0

你的问题不清楚。你想绘制一个随机生成的数字的直方图,约束他们的总和是100? –

+0

@ItamarKatz是的。我想生成这些看起来像正常分布的8个点,但它们总结为temp(在本例中为100)。 – wildcolor

回答

1

通过施加总和temp=100你介绍的依赖至少两个数据点之间,因此无法建立一套独立的采样随机数据点。

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

一个简单的例子:

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

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

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

因此,您将系统的总体随机性从2位降低到1位。因此不可能从具有总和约束的正态分布抽样8个真(伪)随机点。在比较

>>> 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 
+0

谢谢你的回答。我想要的比你的回答容易。我不需要像你提到的那样严格的“随机性”。我想要的是生成这些8点看起来像正态分布,但他们有一些随机性。例如我可以简单地为列表中的第二个元素添加一个随机值,并在第三个最后一个元素中减去相同的值,以便总和保持不变。 – wildcolor

+0

答案的主要问题是总和不等于temp。当你'追加'最后一个值时,最终的分布不再像正常一样。有什么建议么? – wildcolor

相关问题