【问题标题】:Truncated normal with a given mean具有给定均值的截断正态
【发布时间】:2018-09-07 04:20:45
【问题描述】:

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

【问题讨论】:

    标签: python scipy statistics probability distribution


    【解决方案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 后,您可以将其放入采样程序中

    【讨论】:

    • 您在回复中指向的 wiki 页面给出的平均值为 mu+(pdf(alpha)-pdf(beta))*(1/Z)*sigma。因此,如果我将此与您的 get_mean 函数进行比较,在我看来您缺少 *sigma。
    猜你喜欢
    • 2021-11-21
    • 2013-12-10
    • 2021-08-21
    • 2019-04-09
    • 1970-01-01
    • 2021-10-01
    • 2015-08-07
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多