Wat is de normale verdeling als de standaarddeviatie nul is?

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

  • Je hebt ' t " fix " it. De PDF van normale distributie is niet gedefinieerd voor $ \ sigma = 0 $, het ' is niet 1 zoals in uw " fix "
  • @Aksakal wijst op een belangrijk probleem: hoe ben je precies van plan NormalDist in je algoritme te gebruiken?
  • Dit wordt gebruikt in een na ï ve bayes classifer. Het ' probeert een klasse te selecteren op basis van gegevens in een trainingsset. Het lijkt mij dat als alle waarden in een set parameters hetzelfde zijn, ze geen invloed zouden moeten hebben op de uitkomst. Dus als we bijvoorbeeld kijken hoe schoenmaat binnen een distributie valt om te bepalen of een persoon (de klas) een man of een vrouw is, maar als het nou zo is dat alle personen in de distributie precies dezelfde schoenmaat hebben, dan kan de schoenmaat niet worden gebruikt om te differentiëren en moet deze buiten beschouwing worden gelaten. Ik ben op zoek naar een oplossing voor deze zaak.
  • Misschien ligt het antwoord niet in het veranderen van de output van deze methode, maar in het weggooien van die waarde.

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *