parameter_tuple:浮点数元组。
任何形状参数的估计值(如果适用),然后是位置和比例的估计值......
truncnorm 分布有两个 shape 参数,a、b。因此,您收到的元组是:(fitted_a, fitted_b, fitted_loc, fitted_scale)。这些是首先创建截断正态分布所需的值。 truncnorm 文档清楚地说明了 a 和 b 是什么。下面演示了从查看 PDF、从该分布生成随机变量、返回到估计该分布的参数的往返过程。
import numpy as np
from scipy.stats import truncnorm
import matplotlib.pyplot as plt
myclip_a = 0.5
myclip_b = 2.5
loc = 1.3
scale = 1.1
a, b = (myclip_a - loc) / scale, (myclip_b - loc) / scale
x = np.linspace(-2, 4, 100)
# create a graph of how a, b, loc, scale are used to parameterise the truncnorm PDF.
plt.plot(x, truncnorm.pdf(x, a, b, loc, scale),
'r-', lw=5, alpha=0.6, label='truncnorm pdf')
# create some random variates that obey that truncated normal distribution
noise = truncnorm.rvs(a, b, loc, scale, size=1000000)
# histogram the random variates to visualise the truncated normal distribution.
plt.hist(noise, bins=100);
# now estimate what the values of a, b, loc, scale are from the random variates
fit_a, fit_b, fit_loc, fit_scale = truncnorm.fit(noise, -1,1.2, loc=1, scale=1)
fit_myclip_a = fit_a*fit_scale + fit_loc
fit_myclip_b = fit_b*fit_scale + fit_loc
print(f"Original myclip_a: {myclip_a}, fit_myclip_a: {fit_myclip_a}")
print(f"Original myclip_b: {myclip_b}, fit_myclip_b: {fit_myclip_b}")
print(f"Original loc: {loc}, fit_loc: {fit_loc}")
print(f"Original scale: {scale}, fit_scale: {fit_scale}")
输出是:
Original myclip_a: 0.5, fit_myclip_a: 0.5000021691860824
Original myclip_b: 2.5, fit_myclip_b: 2.499998152872373
Original loc: 1.3, fit_loc: 1.243679897703037
Original scale: 1.1, fit_scale: 0.9391439098572698