Jeg forstår at normalfordelingen er udefinert hvis standardavviket er null, men jeg må håndtere saken der alle verdiene er like i en datalgoritme. Følgende metode må returnere en gyldig verdi, selv om standardavviket er null. Hvordan kan jeg fikse denne metoden slik at den ikke deler med null?
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; }
Min idé var å sette inn dette i begynnelsen av metoden:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Ville dette være riktig?
Kommentarer
Svar
Når standardavviket er null, blir din gaussiske (normale) PDF til Dirac delta-funksjon . Du kan ikke bare koble null standardavvik til det konvensjonelle uttrykket. Hvis PDF for eksempel er koblet til en slags numerisk integrasjon, vil dette ikke fungere. Du må endre integralene. I eksemplet nedenfor beregner vi gjennomsnittsverdien for funksjonen $ g (x) $ ved hjelp av den gaussiske tettheten $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
når du kobler til null varians, blir dette delta-funksjonell: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Koden din må kunne gjenkjenne dette, ellers mislykkes den.
En måte å løse dette på er overraskende enkel: Plugg en veldig liten verdi på $ \ sigma $ til Gaussian i stedet for null. Du må velge riktig $ \ sigma $ for din situasjon. Hvis den er for liten, sprenger den eksponenten din, og integralene vil ikke fungere, eller presisjonen vil være lav. Dette går til en kjent Gaussisk tilnærming av deltafunksjon: $$ \ delta (x) = \ lim _ {\ sigma \ til 0} \ mathcal N (0, \ sigma) $$
Kommentarer
- Om det " mislykkes " må avhenge av dens funksjonelle spesifikasjon. Hvis intensjonen bare er å returnere en kontinuerlig versjon av sannsynlighetstettheten, er funksjonen som alltid returnerer null riktig, fordi Dirac-deltaet har en tetthet definert overalt, men i gjennomsnittet. Hvis denne funksjonen derimot blir kalt som en del av en sannsynlighetsberegning for beregning av et ML-estimat, er det ingen implementering overhodet som vil føre til at den lykkes: alt den kan gjøre er å heve en feiltilstand.
- @whuber, flytende punktformat støtter positiv uendelig. Så han kunne sette PDF-filen til uendelig. Problemet ' er at selv da vil hans sannsynlighetsoptimaliseringsrutine ikke fungere på grunn av diskontinuiteten. Derfor sier jeg ' at han må endre koden som bruker PDF. Han kan ' ikke slippe unna med å bare rote med PDF alene
- Jeg la ut en ekstra kommentar ovenfor med mer info. Jeg ' tenker at Aksakal er riktig. Jeg må endre koden som bruker metoden.
NormalDist
i algoritmen din?