Qual è la distribuzione normale quando la deviazione standard è zero?

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

  • Non ' t " fix " it. Il PDF di distribuzione normale non è definito per $ \ sigma = 0 $, ' non è uguale a 1 nella tua " fix "
  • @Aksakal indica una questione importante: esattamente come intendi utilizzare NormalDist nel tuo algoritmo?
  • Viene utilizzato in un na ï ve bayes classifer. ' sta tentando di selezionare una classe in base ai dati in un training set. A me sembra che se tutti i valori in un set di parametri sono gli stessi, non dovrebbero avere alcuna influenza sul risultato. Quindi, ad esempio, se stiamo osservando come la misura delle scarpe rientra in una distribuzione per determinare se una persona (la classe) è maschio o femmina, ma se accade che tutte le persone nella distribuzione abbiano esattamente la stessa misura di scarpe, quindi la misura della scarpa non può essere utilizzata per differenziare e dovrebbe essere rimossa dalla considerazione. Sto cercando di gestire questo caso.
  • Forse la risposta non sta nel modificare loutput di questo metodo, ma piuttosto eliminare completamente quel valore.

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *