使用 Arena 软件输出绘制对数正态分布

plot lognormal distribution with Arena Software Output

这可能是一个非常小众的问题。我有一个修改后的数据集——基于第 4 个 downloadlink 和 105572 个元素——我想知道如何以最佳方式对其建模。我不得不使用 Rockwell Software 的 Arena Software。作为分配的结果,我得到了以下结果:“816 + LOGN(198, 439)” 在左侧的下图中,您可以看到匹配项。从文档中输出应该是:“Lognormal (\mu, \sigma): LOGN (LogMean, LogStd) or LOGNORMAL (LogMean, LogStd)”。但是,我想在 Python.

中重建它
import matplotlib.pyplot as plt 
import scipy.stats as stats
import numpy as np

plt.hist(dataset, bins=bins, density=True, color='c', alpha=0.75, label="original Data")
xmin = dataset.min() #816
xmax = dataset.max() #1672
x = np.linspace(xmin, xmax, 100)
pdf = stats.lognorm.pdf(x, s=439, scale=np.exp(198), loc=816)#816 + LOGN(198, 439)
plt.plot(x, pdf, 'r', label="Lognormal")
plt.legend()
plt.show()

我不知道如何才能使它们大小相同或看起来不错。我无法真正使用 Arena Software 中的图片,因为我想将多个分布绘制到一张图片中。 使用 scipy.stats.fit 我得到了更好的结果。就像在这个 post 中一样,我尝试了以下代码:

s, loc, scale = stats.lognorm.fit(system20, floc=0)
#-> 0.19860417      0.0     967.8363

解法:

Arena 软件中对数正态分布的输出格式为 (LogMean LogStd)。在文档中实际上有一个转换以获得正常的均值和标准差,以便于复制分布。

#Input: LogMean, LogStd from Arena Software
#Output: Mean, Std
def logNReal (mean, sigma):
    return np.log( mean**2 / np.sqrt(sigma**2 + mean**2) ), np.sqrt( np.log( (sigma**2 + mean**2) / mean**2) )

如果你想用scipy.stats.lognorm绘制它:

stats.lognorm.pdf(x, s=std, scale=np.exp(mean), loc=a)
#you can find a in the output of Arena: a + LOGN(LogMean, LogStd)