Capisco che la distribuzione normale non è definita se la deviazione standard è zero, ma ho bisogno di gestire il caso in cui tutti i valori sono uguali in un algoritmo informatico. Il metodo seguente deve restituire un valore valido, anche se la deviazione standard è zero. Come posso correggere questo metodo in modo che non divida per zero?
public static double NormalDist(double x, double mean, double standard_dev) { double fact = standard_dev * Math.Sqrt(2.0 * Math.PI); double expo = (x - mean) * (x - mean) / (2.0 * standard_dev * standard_dev); return Math.Exp(-expo) / fact; }
La mia idea era di inserire questo allinizio del metodo:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Sarebbe corretto?
Commenti
Risposta
Quando la deviazione standard è zero, il tuo PDF gaussiano (normale) si trasforma in funzione delta di Dirac . Non puoi semplicemente inserire la deviazione standard zero nellespressione convenzionale. Ad esempio, se il PDF è inserito in una sorta di integrazione numerica, non funzionerà. Devi modificare gli integrali. Nellesempio seguente calcoliamo il valore medio della funzione $ g (x) $ utilizzando la densità gaussiana $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
quando si inserisce varianza zero, questo diventa delta-funzionale: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Il tuo codice deve essere in grado di riconoscerlo, altrimenti fallirà.
Un modo per risolvere questo problema è sorprendentemente semplice: inserire un valore molto piccolo di $ \ sigma $ in gaussiano invece di zero. Dovrai scegliere il $ \ sigma $ giusto per la tua situazione. Se è troppo piccolo, farà saltare in aria il tuo esponente e gli integrali non funzioneranno o la precisione sarà bassa. Questo va a una approssimazione gaussiana nota della funzione delta: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Commenti
- Se " fallisce " deve dipendere dalla sua specifica funzionale. Se lintenzione è semplicemente quella di restituire una versione continua della densità di probabilità, allora la funzione che restituisce sempre zero è corretta, perché il delta di Dirac ha una densità definita ovunque tranne che alla media. Se, daltra parte, questa funzione viene chiamata come parte di un calcolo di probabilità per il calcolo di una stima ML, allora non cè alcuna implementazione che la farà avere successo: tutto ciò che può fare è sollevare una condizione di errore.
- @whuber, floating formato punti supporta linfinito positivo. Quindi, potrebbe impostare il PDF su infinito. Il problema ' è che anche in questo caso la sua routine di ottimizzazione delle probabilità non funzionerà, a causa della discontinuità. Quindi, io ' sto dicendo che deve modificare il codice che usa PDF. Non può ' cavarsela solo con il PDF da solo
- Ho pubblicato un commento aggiuntivo sopra con maggiori informazioni. ' penso che Aksakal abbia ragione. Devo modificare il codice che utilizza il metodo.
NormalDist
nel tuo algoritmo?