生成具有散布的上下限标准差的随机数

wydwbb8l  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(124)

我必须根据包含最可能值和标准差的天文表格产生随机生成的正态分布数字。奇怪的是,标准差不是由一个数字给出的,而是两个数字--误差的上限标准偏差和较低的标准偏差,类似于:

mass_object, error_up, error_down
7.33, 0.12, 0.07
9.40, 0.04, 0.02
6.01, 0.11, 0.09
...

例如,这意味着对于第一个物体,如果用m<7.33产生随机质量m,那么它可能会比在m>7.33的情况下离7.33更远。所以我现在正在寻找一种随机生成数字的方法,这种方法必须包括2个可能的标准差。如果我只处理每个对象的一个标准差,我将创建第一个对象的随机数(质量),如下所示:

mass_random = np.random.normal(loc=7.33, scale=0.12)

你知道如何创建这些具有上下限散布标准差的随机数吗?TNX

enyaitl3

enyaitl31#

正如我们在评论中讨论的,正态分布在每个方向上具有相同的标准差(它围绕平均值对称)。所以我们知道我们的分布不会是正态分布。我们可以尝试对数正态分布方法,因为这允许我们引入skewness的概念。要在Python中做到这一点,您将需要Scipy。这里有一个粗略的方法,假设68%的数据处于平均水平,16%处于高点,16%处于低点。我们将分布与该原始数据集进行拟合,然后我们可以从该分布计算新的点:

import scipy.stats

# Choose one of the rows

mean, high, low = 7.33, 0.12, 0.07

# Create a dummy dataset to fit the distribution

values = [mean] * 68 + [mean + high] * 16 + [mean - low ] * 16

# Print the fit distribution

fit_dist = scipy.stats.lognorm.fit(values)
print(fit_dist)

# Calculate 10 new random values based on the fit

scipy.stats.lognorm.rvs(*fit_dist, size=10)

array([7.25541865, 7.34873107, 7.33831589, 7.36387121, 7.26912469,
       7.33084677, 7.35626689, 7.33907124, 7.32522422, 7.31688687])
sf6xfgos

sf6xfgos2#

直接的解决方案是两步抽样:
对于给定行$i$,从区间ERROR_DOWN和ERROR_UP上的均匀分布中抽样得到$\sigma_i$,然后从具有平均值$m_i$和标准差$\sigma_i$的正态分布中抽样最终值。

在实践中,我们导入NumPy,定义一个定制函数$SAMPLICATION$,然后将其应用于整个表:

import numpy as np

def sampling (row) :

      sigma = np.random.uniform(row[1],      row[2])
      m = row[0]
      return (np.random.normal(m, sigma)) 

sampled_values = map(sampling, table)

相关问题