Hva er normalfordelingen når standardavviket er null?

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

  • Du gjorde ikke ' t " fikse " det. PDF av normalfordeling er udefinert for $ \ sigma = 0 $, det ' er ikke 1 som i " fikser "
  • @Aksakal peker på et viktig spørsmål: nøyaktig hvordan har du tenkt å bruke NormalDist i algoritmen din?
  • Dette brukes i en na ï ve bayes classifer. Det ' prøver å velge en klasse basert på data i et treningssett. For meg, hvis synes det at hvis alle verdier i et sett med parametere er de samme, bør de ikke ha noen innflytelse på resultatet. Så for eksempel hvis vi ser på hvordan skostørrelse faller innenfor en fordeling for å avgjøre om en person (klassen) er mann eller kvinne, men hvis det bare skjer slik at alle personer i distribusjonen har nøyaktig samme skostørrelse, da kan ikke skostørrelse brukes til å differensiere og bør fjernes fra vurdering. Jeg ønsker å håndtere denne saken.
  • Kanskje svaret ikke er å endre produksjonen av denne metoden, men heller å bare kaste ut den verdien helt.

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *