使用 truncnorm 函数时,需要指定下限 lower 和上限 upper,以便生成符合限制的正态分布。但是,有时候 truncnorm 函数会生成低于下限的值,可能是因为指定的参数不正确。
解决这个问题,可以使用以下方法:
- 确认输入的 lower 和 upper 参数正确,需要保证 lower < upper。
- 对于下限 lower,可以使用 np.maximum(lower, mu - sigma * 5) 这样的算法,以确保生成的值不会低于 lower。其中,mu 是期望值,sigma 是标准差。
- 对于上限 upper,可以使用 np.minimum(upper, mu + sigma * 5) 这样的算法,以确保生成的值不会高于 upper。
示例代码如下:
import numpy as np
from scipy.stats import truncnorm
# 设置限制区间
lower, upper = 10, 20
mu, sigma = 15, 3
# 确认下限和上限
assert lower < upper
# 生成正态分布,保证结果不低于下限
a = (lower - mu) / sigma
X = truncnorm(a=a, b=np.inf, loc=mu, scale=sigma)
sample = X.rvs(size=1000)
sample = np.maximum(sample, lower)
# 再次检查结果不低于下限
assert np.min(sample) >= lower
# 生成正态分布,保证结果不高于上限
b = (upper - mu) / sigma
X = truncnorm(a=-np.inf, b=b, loc=mu, scale=sigma)
sample = X.rvs(size=1000)
sample = np.minimum(sample, upper)
# 再次检查结果不高于上限
assert np.max(sample) <= upper