Domanda

Ho un tipo di valore che rappresenta una distribuzione gaussiana:

struct Gauss {
    double mean;
    double variance;
}

Vorrei eseguire un integrale su una serie di questi valori:

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

La mia domanda è come implementare l'addizione per queste normali distribuzioni.

La moltiplicazione per uno scalare ( dt ) sembrava abbastanza semplice. Ma non è stato semplice! Grazie FOOSHNICK per l'aiuto:

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

Tuttavia, l'aggiunta mi sfugge. Presumo di poter semplicemente aggiungere i mezzi; è la varianza che mi sta causando problemi. Ognuna di queste definizioni sembra "logica" per me.

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

Qualcuno può aiutare a definire un statisticamente corretto - o almeno " ragionevole " - versione dell'operatore + ?

Suppongo che potrei cambiare il codice per usare l'aritmetica dell'intervallo, ma speravo di rimanere nel mondo di prob e stats.

È stato utile?

Soluzione

La somma di due distribuzioni normali è essa stessa una distribuzione normale:

N (media1, varianza1) + N (media2, varianza2) ~ N (media1 + media2, varianza1 + varianza2)

Questo è tutto nella pagina wikipedia .

Fai attenzione che queste sono davvero variazioni e non deviazioni standard.

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

Altri suggerimenti

Per essere più precisi:

Se una variabile casuale Z è definita come la combinazione lineare di due variabili casuali gaussiane non correlate X e Y, allora Z è essa stessa una variabile casuale gaussiana, ad es .:

se Z = aX + bY,   quindi mean (Z) = a * mean (X) + b * mean (Y) e varianza (Z) = a 2 * varianza (X) + b 2 * varianza (Y).

Se le variabili casuali sono correlate , allora devi tenerne conto. La varianza (X) è definita dal valore atteso E ([X-mean (X)] 2 ). In questo modo per Z = aX + bY, otteniamo:

varianza (Z) = a 2 * varianza (X) + b 2 * varianza (Y) + 2ab * covarianza (X, Y)

Se stai sommando due variabili casuali non correlate che non hanno distribuzioni gaussiane, la distribuzione della somma è convoluzione delle distribuzioni a due componenti.

Se si sommano due variabili casuali non gaussiane correlate, è necessario elaborare autonomamente gli integrali appropriati.

Bene, la tua moltiplicazione per scalare è sbagliata - dovresti moltiplicare la varianza per il quadrato di d. Se stai aggiungendo una costante, quindi aggiungila alla media, la varianza rimane la stessa. Se stai aggiungendo due distribuzioni, aggiungi i mezzi e aggiungi le varianze.

  

Qualcuno può aiutare a definire un statisticamente corretto - o almeno " ragionevole " - versione dell'operatore +?

Probabilmente no, poiché l'aggiunta di due distribuzioni significa cose diverse - avendo lavorato in termini di affidabilità e manutenibilità la mia prima reazione dal titolo sarebbe la distribuzione del mtbf di un sistema, se il mtbf di ciascuna parte fosse normalmente distribuito e il sistema non avesse ridondanza . Stai parlando della distribuzione della somma di due variate indipendenti normalmente distribuite, non della somma (logica) dell'effetto di due distribuzioni normali. Molto spesso, il sovraccarico dell'operatore ha una semantica sorprendente. Lo lascerei come una funzione e lo chiamerei "normalSumDistribution" a meno che il tuo codice non abbia un pubblico di destinazione molto specifico.

Ah, pensavo non potessi aggiungere insieme le distribuzioni gaussiane, ma puoi!

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

In effetti, la media è la somma delle singole distribuzioni e la varianza è la somma delle singole distribuzioni.

Non sono sicuro che mi piace ciò che stai chiamando " integrazione " su una serie di valori. Intendi quella parola in un senso di calcolo? Stai cercando di fare l'integrazione numerica? Ci sono altri modi migliori per farlo. Il tuo non mi sembra giusto, figuriamoci ottimale.

La distribuzione gaussiana è una funzione piacevole e regolare. Penso che un buon approccio in quadratura o Runge-Kutta sarebbe un'idea molto migliore.

Avrei pensato che dipendesse dal tipo di aggiunta che stai facendo. Se vuoi solo ottenere una distribuzione normale con proprietà (media, deviazione standard ecc.) Pari alla somma di due distribuzioni, allora l'aggiunta delle proprietà come indicato nelle altre risposte va bene. Questo è il presupposto usato in qualcosa come PERT in cui se si aggiunge un gran numero di distribuzioni di probabilità normali, la distribuzione di probabilità risultante è un'altra distribuzione di probabilità normale.

Il problema si presenta quando le due distribuzioni aggiunte non sono simili. Prendiamo ad esempio l'aggiunta di una distribuzione di probabilità con una media di 2 e una deviazione standard di 1 e una distribuzione di probabilità di 10 con una deviazione standard di 2. Se si sommano queste due distribuzioni, si ottiene una distribuzione di probabilità con due picchi, uno a 2ish e uno a 10ish. Il risultato non è quindi una distribuzione normale. L'ipotesi sull'aggiunta di distribuzioni è davvero valida solo se le distribuzioni originali sono molto simili o se si hanno molte distribuzioni originali in modo che i picchi e le depressioni possano essere uniformati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top