Как рассчитать сумму двух нормальных распределений - PullRequest
1 голос
/ 08 января 2009

У меня есть тип значения, представляющий распределение по Гауссу:

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);
}

Может ли кто-нибудь помочь определить статистически правильную или хотя бы «разумную» версию оператора +?

Полагаю, я мог бы вместо этого переключить код на использование интервальной арифметики, но я надеялся остаться в мире вероятностей и статистики.

Ответы [ 7 ]

7 голосов
/ 08 января 2009

Сумма двух нормальных распределений сама является нормальным распределением:

N (среднее1, дисперсия1) + N (среднее2, дисперсия2) ~ N (среднее1 + среднее2, дисперсия1 + дисперсия2)

Это все на странице википедии .

Будьте осторожны, это действительно отклонения, а не стандартные отклонения.

// 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);
}
3 голосов
/ 19 января 2009

Чтобы быть более точным:

Если случайная величина Z определяется как линейная комбинация двух некоррелированных гауссовских случайных величин X и Y, то Z сама является гауссовой случайной величиной, например ::1003 *

если Z = aX + bY, тогда среднее (Z) = a * среднее (X) + b * среднее (Y) и дисперсия (Z) = a 2 * дисперсия (X) + b 2 * дисперсия (У).

Если случайные величины коррелируют , то вы должны это учитывать. Дисперсия (X) определяется ожидаемым значением E ([X-mean (X)] 2 ). Работая с Z = aX + bY, получим:

дисперсия (Z) = a 2 * дисперсия (X) + b 2 * дисперсия (Y) + 2ab * ковариация (X, Y)

Если вы суммируете две некоррелированные случайные величины, которые не имеют гауссовых распределений, то распределение суммы будет сверткой двухкомпонентных распределений.

Если вы суммируете две коррелированные негауссовские случайные величины, вы должны самостоятельно обработать соответствующие интегралы.

2 голосов
/ 19 января 2009

Может ли кто-нибудь помочь определить статистически правильную или хотя бы "разумную" версию оператора +?

Возможно, нет, поскольку добавление двух дистрибутивов означает разные вещи - работая с надежностью и ремонтопригодностью, моей первой реакцией из заголовка будет распределение mtbf системы, если mtbf каждой части нормально распределен и система не имеет избыточности , Вы говорите о распределении суммы двух нормально распределенных независимых переменных, а не о (логической) сумме эффекта двух нормальных распределений. Очень часто перегрузка операторов имеет удивительную семантику. Я бы оставил его как функцию и назвал бы его «normalSumDistribution», если ваш код не имеет очень конкретной целевой аудитории.

2 голосов
/ 08 января 2009

Что ж, ваше умножение на скаляр неправильное - вы должны умножить дисперсию на квадрат d. Если вы добавляете константу, то просто добавьте ее к среднему значению, дисперсия останется прежней. Если вы добавляете два распределения, то добавьте средства и добавьте отклонения.

2 голосов
/ 08 января 2009

Ха, я думал, что вы не можете добавить гауссовские распределения вместе, но вы можете!

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

На самом деле среднее значение является суммой отдельных распределений, а дисперсия - суммой отдельных распределений.

1 голос
/ 19 января 2009

Я бы подумал, что это зависит от того, какой тип дополнения вы делаете. Если вы просто хотите получить нормальное распределение со свойствами (среднее значение, стандартное отклонение и т. Д.), Равными сумме двух распределений, тогда добавление свойств, как указано в других ответах, подойдет. Это предположение используется в чем-то вроде PERT, где, если сложено большое количество нормальных распределений вероятности, то получающееся в результате распределение вероятностей является другим нормальным распределением вероятности.

Проблема возникает, когда два добавляемых дистрибутива не похожи. Возьмем, к примеру, добавление распределения вероятностей со средним значением 2 и стандартным отклонением 1 и распределением вероятностей 10 со стандартным отклонением 2. Если вы добавите эти два распределения вверх, вы получите распределение вероятностей с двумя пиками, один на 2ish. и один на 10ish. Поэтому результат не является нормальным распределением. Предположение о добавлении дистрибутивов действительно действительно только в том случае, если исходные дистрибутивы либо очень похожи, либо у вас много оригинальных дистрибутивов, так что пики и впадины можно выровнять.

1 голос
/ 08 января 2009

Я не уверен, что мне нравится то, что вы называете "интеграцией" для ряда значений. Вы имеете в виду это слово в смысле исчисления? Вы пытаетесь сделать числовую интеграцию? Есть и другие, лучшие способы сделать это. Ваш не выглядит правильным для меня, не говоря уже об оптимальном.

Гауссово распределение - хорошая, гладкая функция. Я думаю, что хороший квадратурный подход или Рунге-Кутта был бы намного лучшей идеей.

...