【问题标题】:How to calculate the sum of two normal distributions如何计算两个正态分布的总和
【发布时间】:2010-09-30 03:32:36
【问题描述】:

我有一个表示高斯分布的值类型:

struct Gauss {
    double mean;
    double variance;
}

我想对一系列这些值进行积分:

Gauss eulerIntegrate(double dt, Gauss iv, Gauss[] values) {
    Gauss r = iv;
    foreach (Gauss v in values) {
        r += v*dt;
    }
    return r;
}

我的问题是如何为这些正态分布实现加法。

标量 (dt) 的乘法看起来很简单。但这并不简单!感谢FOOSHNICK 的帮助:

public static Gauss operator * (Gauss g, double d) {
    return new Gauss(g.mean * d, g.variance * d * d);
}

但是,我不知道加法。我想我可以添加手段;这是给我带来麻烦的差异。这些定义中的任何一个对我来说都是“合乎逻辑的”。

public static Gauss operator + (Gauss a, Gauss b) {
    double mean = a.mean + b.mean;
    // Is it this? (Yes, it is!)
    return new Gauss(mean, a.variance + b.variance);        
    // Or this? (nope)
    //return new Gauss(mean, Math.Max(a.variance, b.variance));
    // Or how about this? (nope)
    //return new Gauss(mean, (a.variance + b.variance)/2);
}

谁能帮助定义+ 运算符的统计上正确或至少“合理”的版本?

我想我可以将代码切换为使用区间算术,但我希望留在概率和统计的世界中。

【问题讨论】:

    标签: algorithm language-agnostic statistics algebra


    【解决方案1】:

    哈,我以为你不能把高斯分布加在一起,但你可以!

    http://mathworld.wolfram.com/NormalSumDistribution.html

    其实均值是各个分布之和,方差是各个分布之和。

    【讨论】:

      【解决方案2】:

      我原以为这取决于您正在执行的添加类型。如果您只想获得属性(均值、标准差等)等于两个分布之和的正态分布,那么添加其他答案中给出的属性就可以了。这是PERT之类的假设,如果将大量正态概率分布相加,则得到的概率分布是另一个正态概率分布。

      当添加的两个发行版不相似时,问题就出现了。例如,添加一个平均值为 2、标准差为 1 的概率分布和一个标准差为 2 的概率分布 10。如果将这两个分布相加,您将得到一个具有两个峰值的概率分布,一个峰值为 2ish一个在 10 点左右。因此,结果不是正态分布。仅当原始分布非常相似或您有很多原始分布以使波峰和波谷可以平衡时,添加分布的假设才真正有效。

      【讨论】:

        【解决方案3】:

        更准确地说:

        如果一个随机变量Z被定义为两个不相关的高斯随机变量X和Y的线性组合,那么Z本身就是一个高斯随机变量,例如:

        如果 Z = aX + bY, 那么均值(Z) = a * 均值(X) + b * 均值(Y),方差(Z) = a2 * 方差(X) + b2 * 方差(Y)。

        如果随机变量是相关的,那么你必须考虑到这一点。 Variance(X) 由期望值 E([X-mean(X)]2) 定义。对 Z = aX + bY 进行处理,我们得到:

        方差(Z) = a2 * 方差(X) + b2 * 方差(Y) + 2ab * 协方差(X,Y)

        如果您将两个不相关且不具有高斯分布的随机变量相加,则和的分布是两个分量分布的convolution

        如果您要对两个相关的非高斯随机变量求和,您必须自己完成适当的积分。

        【讨论】:

          【解决方案4】:

          谁能帮助定义一个统计上正确的 - 或者至少是“合理的” - 版本的 + 运算符?

          可以说不是,因为添加两个分布意味着不同的东西——在可靠性和可维护性方面工作后,我对标题的第一反应是系统的 mtbf 的分布,如果每个部分的 mtbf 是正态分布的并且系统没有冗余.您说的是两个正态分布的独立变量之和的分布,而不是两个正态分布效应的(逻辑)和。很多时候,运算符重载具有令人惊讶的语义。除非您的代码具有非常特定的目标受众,否则我会将其保留为函数并将其称为“normalSumDistribution”。

          【讨论】:

            【解决方案5】:

            两个正态分布之和本身就是一个正态分布:

            N(mean1, variance1) + N(mean2, variance2) ~ N(mean1 + mean2, variance1 + variance2)

            这一切都在wikipedia page上。

            请注意,这些确实是方差,而不是标准差。

            // X + Y
            public static Gauss operator + (Gauss a, Gauss b) {
                //NOTE: this is valid if X,Y are independent normal random variables
                return new Gauss(a.mean + b.mean, a.variance + b.variance);
            }
            
            // X*b
            public static Gauss operator * (Gauss a, double b) {
                return new Gauss(a.mean*b, a.variance*b*b);
            }
            

            【讨论】:

            【解决方案6】:

            我不确定我是否喜欢你所说的对一系列价值观的“整合”。你是指微积分意义上的那个词吗?您是否正在尝试进行数值积分?还有其他更好的方法可以做到这一点。你的在我看来并不合适,更不用说最佳了。

            高斯分布是一个很好的平滑函数。我认为一个不错的正交方法或 Runge-Kutta 会是一个更好的主意。

            【讨论】:

            • 当然,我会选择 Runge-Kutta,但我不想在 Stack Overflow 编辑器中输入它:-)
            • 同意,但我的透视界面已关闭。我无法知道您是否输入了一个东西并想了另一个。不要误导——像“// 5th order R-K going here”这样的伪代码注释会告诉我更多信息。
            • 不管怎样,我的数据很枯燥,上面的欧拉积分已经足够了。它没有任何问题。我什至将其命名为“euler”以尽量避免这些类型的 cmets。 ;-)
            【解决方案7】:

            好吧,你乘以标量是错误的——你应该乘方差乘以 d 的平方。如果您要添加一个常数,则只需将其添加到均值中,方差保持不变。如果要添加两个分布,则添加均值并添加方差。

            【讨论】:

            • 反之:当你将一个变量乘以 d 时,你将方差乘以 d 的平方。
            猜你喜欢
            • 1970-01-01
            • 2010-10-23
            • 2016-06-11
            • 1970-01-01
            • 2013-03-21
            • 2019-12-27
            • 1970-01-01
            • 2015-03-24
            • 2016-03-14
            相关资源
            最近更新 更多