截断正与给定的平均值(Truncated normal with a given mean)

2019-09-28 16:33发布

是否有可能在python生成与给定的期望值截断正态分布? 我知道scipy.stats.truncnorm可以给截断正态分布,是以原来的正态分布作为参数的平均值,但我想创建一个截断正态分布使得截尾分布的预期值是一个特定值。 这可能吗?

Answer 1:

你可以相互转换mu ,平均,见https://en.wikipedia.org/wiki/Truncated_normal_distribution的细节,平均有简单的表达,让mu你必须解决非线性方程

import scipy
from scipy.stats import norm

def get_mean(mu, sigma, a, b):
    alpha = (a - mu)/sigma
    beta  = (b - mu)/sigma
    Z     = norm.cdf(beta) - norm.cdf(alpha)
    return mu + (norm.pdf(alpha) - norm.pdf(beta)) / Z

def f(x, mean, sigma, a, b):
    return mean - get_mean(x, sigma, a, b)

def get_mu(mean, sigma, a, b):
    mu = scipy.optimize.brentq(f, a, b, args=(mean, sigma, a, b))
    return mu

a  = -2.0
b  = 3.0
sigma = 1.0
mu    = 0.0

mean = get_mean(mu, sigma, a, b)
print(mean)

mu = get_mu(mean, sigma, a, b)
print(mu)

越来越之后mu的所需平均,你可以把它变成日常采样



文章来源: Truncated normal with a given mean