Hvad er normalfordelingen, når standardafvigelsen er nul?

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

  • Du gjorde ikke ' t " fix " it. PDF for normalfordeling er udefineret for $ \ sigma = 0 $, det ' er ikke 1 som i din " retter "
  • @Aksakal peger på et vigtigt spørgsmål: nøjagtigt hvordan har du til hensigt at bruge NormalDist i din algoritme?
  • Dette bruges i en na ï ve bayes klassifikator. Det ' forsøger at vælge en klasse baseret på data i et træningssæt. For mig, hvis det ser ud til, at hvis alle værdier i et sæt parametre er ens, skal de ikke have nogen indflydelse på resultatet. Så hvis vi for eksempel ser på, hvordan skostørrelse falder inden for en fordeling for at afgøre, om en person (klassen) er mand eller kvinde, men hvis det bare sker, at alle personer i distributionen har nøjagtig den samme skostørrelse, så kan sko størrelse ikke bruges til at differentiere og bør fjernes fra overvejelse. Jeg ønsker at håndtere denne sag.
  • Måske ligger svaret ikke i at ændre output fra denne metode, men snarere bare at smide den værdi helt ud.

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *