Ik begrijp dat de normale verdeling ongedefinieerd is als de standaarddeviatie nul is, maar ik moet het geval afhandelen waarin alle waarden gelijk zijn in een computeralgoritme. De volgende methode moet een geldige waarde retourneren, zelfs als de standaarddeviatie nul is. Hoe kan ik deze methode repareren zodat deze niet door nul deelt?
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; }
Mijn idee was om dit aan het begin van de methode in te voegen:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Zou dit correct zijn?
Reacties
Antwoord
Wanneer de standaarddeviatie nul is, verandert uw Gaussiaanse (normale) PDF in Dirac-deltafunctie . U kunt de standaarddeviatie van nul niet simpelweg in de conventionele uitdrukking stoppen. Als de PDF bijvoorbeeld is aangesloten op een soort numerieke integratie, werkt dit niet. Je moet de integralen aanpassen. In het onderstaande voorbeeld berekenen we de gemiddelde waarde van functie $ g (x) $ met behulp van de Gaussiaanse dichtheid $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
als je nul variantie plugt, wordt dit delta-functioneel: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Je code moet dit kunnen herkennen, anders mislukt het.
Een manier om dit op te lossen is verrassend eenvoudig: plug een zeer kleine waarde van $ \ sigma $ in Gaussiaans in plaats van nul. U zult de juiste $ \ sigma $ voor uw situatie moeten kiezen. Als het te klein is, zal het je exponent opblazen, en de integralen zullen niet werken of de precisie zal laag zijn. Dit gaat naar een bekende Gaussiaanse benadering van de deltafunctie: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Reacties
- Of het " mislukt " moet afhangen van zijn functionele specificatie. Als het alleen de bedoeling is om een continue versie van de kansdichtheid te retourneren, dan is de functie die altijd nul retourneert correct, omdat de Dirac-delta een dichtheid heeft die overal is gedefinieerd behalve in het gemiddelde. Als deze functie daarentegen wordt aangeroepen als onderdeel van een waarschijnlijkheidsberekening voor het berekenen van een ML-schatting, dan is er geen enkele implementatie die ervoor zorgt dat het lukt: het enige wat het kan doen is een foutconditie verhogen.
- @whuber, zwevend puntformaat ondersteunt positieve oneindigheid. Dus hij kon de pdf op oneindig instellen. Het probleem ' is dat zelfs dan zijn waarschijnlijkheidsoptimalisatieroutine niet zal werken vanwege de discontinuïteit. Daarom zeg ik ' dat hij de code moet wijzigen die gebruikmaakt van PDF. Hij kan ' niet wegkomen door alleen met PDF te knoeien
- Ik heb hierboven een aanvullende opmerking geplaatst met meer informatie. Ik ' m denk dat Aksakal correct is. Ik moet de code wijzigen die de methode gebruikt.
NormalDist
in je algoritme te gebruiken?