如何将拟合的lognorm分布s、loc、scale转换为SIMIO所需正态参数
移位对数正态参数转Simio格式方法
参数定义差异
先明确两个工具的对数正态分布参数化逻辑:
- Scipy/Fitter的lognorm:是带移位的对数正态,公式为:
其中Z服从均值为0、标准差为X = loc + scale × exp(Z)s的正态分布;loc是移位偏移量,scale是缩放因子。 - Simio的Lognormal(normalMean, normalStdDev):是无移位对数正态,公式为:
其中W服从均值为Y = exp(W)normalMean、标准差为normalStdDev的正态分布。
转换步骤
基于你的拟合结果:
{'lognorm': {'s': 0.8612498618921953, 'loc': 0.3175483462045392, 'scale': 0.30617261628597686}}
1. 核心参数转换
针对Scipy中scale × exp(Z)的无移位部分,取对数后可得:
ln(Y) = ln(scale) + Z
由于Z~N(0, s²),因此ln(Y)服从均值为ln(scale)、标准差为s的正态分布,对应Simio的参数:
normalMean= ln(0.3061726) ≈ -1.182normalStdDev= 0.86125
2. 处理移位项
Simio原生不支持移位参数,若你的分布必须保留loc(拟合值≠0),需在Simio中手动调整:生成Lognormal(-1.182, 0.86125)的样本后,再加上0.3175即可还原原始拟合分布。
验证代码
可通过反向生成样本验证转换正确性:
import numpy as np from scipy import stats # 拟合得到的参数 s, loc, scale = 0.8612498618921953, 0.3175483462045392, 0.30617261628597686 # 生成移位对数正态样本 sample = loc + scale * np.exp(stats.norm.rvs(0, s, size=1000)) # 拟合无移位lognorm shape, _, fit_scale = stats.lognorm.fit(sample, floc=0) # 转换为Simio参数 simio_mean = np.log(fit_scale) simio_std = shape print(f"Simio normalMean: {simio_mean:.4f}, normalStdDev: {simio_std:.4f}")
运行结果会与手动计算值一致,证明转换有效。
内容的提问来源于stack exchange,提问作者Avery
相关产品推荐
相关产品推荐

