Jeg forstår, at normalfordelingen er udefineret, hvis standardafvigelsen er nul, men jeg skal håndtere det tilfælde, hvor alle værdier er ens i en computeralgoritme. Den følgende metode skal returnere en gyldig værdi, selvom standardafvigelsen er nul. Hvordan kan jeg rette denne metode, så den ikke divideres med nul?
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 at indsætte dette i starten af metoden:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Ville dette være korrekt?
Kommentarer
Svar
Når standardafvigelsen er nul, bliver din gaussiske (normale) PDF til Dirac delta-funktion . Du kan ikke bare tilslutte nul standardafvigelse til det konventionelle udtryk. Hvis f.eks. PDFen er tilsluttet en eller anden form for numerisk integration, vil dette ikke fungere. Du skal ændre integralerne. I eksemplet nedenfor beregner vi middelværdien af funktionen $ g (x) $ ved hjælp af den Gaussiske tæthed $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
når du tilslutter nul varians, bliver dette delta-funktionel: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Din kode skal kunne genkende dette, ellers fejler den.
En måde at løse dette på er overraskende enkel: Tilslut en meget lille værdi af $ \ sigma $ til Gaussian i stedet for nul. Du bliver nødt til at vælge den rigtige $ \ sigma $ til din situation. Hvis den er for lille, sprænger den din eksponent, og integralerne fungerer ikke, eller præcisionen er lav. Dette går til en kendt Gaussisk tilnærmelse af delta-funktion: $$ \ delta (x) = \ lim _ {\ sigma \ til 0} \ mathcal N (0, \ sigma) $$
Kommentarer
- Om det " mislykkes " skal afhænge af dens funktionelle specifikation. Hvis hensigten blot er at returnere en kontinuerlig version af sandsynlighedstætheden, er den funktion, der altid returnerer nul, korrekt, fordi Dirac-deltaet har en densitet defineret overalt, men i gennemsnit. Hvis denne funktion på den anden side kaldes som en del af en sandsynlighedsberegning til beregning af et ML-estimat, er der ingen som helst implementering, der får den til at lykkes: alt hvad den kan gøre er at rejse en fejltilstand.
- @whuber, flydende punktformat understøtter positiv uendelighed. Så han kunne indstille PDF-filen til uendelig. Problemet ' er, at selv da vil hans sandsynlighedsoptimeringsrutine ikke fungere på grund af diskontinuiteten. Derfor siger jeg ' at han skal ændre koden, der bruger PDF. Han kan ' ikke slippe af sted med bare at rode med PDF alene
- Jeg sendte en yderligere kommentar ovenfor med mere info. Jeg ' tænker, at Aksakal er korrekt. Jeg er nødt til at ændre koden, der bruger metoden.
NormalDist
i din algoritme?