Vad är normalfördelningen när standardavvikelsen är noll?

Jag förstår att normalfördelningen är odefinierad om standardavvikelsen är noll, men jag måste hantera fallet där alla värden är lika i en datoralgoritm. Följande metod måste returnera ett giltigt värde, även om standardavvikelsen är noll. Hur kan jag fixa den här metoden så att den inte delar med noll?

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 att infoga detta i början av metoden:

 if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; } 

Skulle detta vara korrekt?

Kommentarer

  • Du gjorde inte ' t " fix " it. PDF för normal distribution är odefinierad för $ \ sigma = 0 $, det ' är inte 1 som i din " fixar "
  • @Aksakal pekar på en viktig fråga: exakt hur tänker du använda NormalDist i din algoritm?
  • Detta används i en na ï ve bayes classifer. Det ' försöker välja en klass baserat på data i en träningsuppsättning. För mig, om det verkar som om alla värden i en uppsättning parametrar är desamma, borde de inte ha något inflytande på resultatet. Så om vi till exempel tittar på hur skostorlek faller inom en distribution för att avgöra om en person (klassen) är man eller kvinna, men om det bara händer att alla personer i distributionen har exakt samma skostorlek, då kan skostorlek inte användas för att differentiera och bör tas bort från övervägande. Jag vill hantera det här fallet.
  • Kanske är svaret inte att ändra produktionen av den här metoden, utan snarare att bara slänga det värdet helt.

Svar

När standardavvikelsen är noll blir din Gaussiska (normala) PDF till Dirac delta-funktion . Du kan inte helt enkelt ansluta noll standardavvikelse till det konventionella uttrycket. Till exempel, om PDF: n är ansluten till någon form av numerisk integration, kommer det inte att fungera. Du måste ändra integralerna. I exemplet nedan beräknar vi medelvärdet för funktionen $ g (x) $ med den Gaussiska densiteten $ f (x | \ mu, \ sigma ^ 2) $:

$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$

när du ansluter nollvarians blir detta delta-funktionellt: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$

Din kod måste kunna känna igen detta, annars misslyckas den.

Ett sätt att åtgärda detta är förvånansvärt enkelt: anslut ett mycket litet värde av $ \ sigma $ till Gaussian istället för noll. Du måste välja rätt $ \ sigma $ för din situation. Om den är för liten spränger den din exponent och integralerna fungerar inte eller precisionen blir låg. Detta går till en känd Gaussisk approximation av delta-funktionen: $$ \ delta (x) = \ lim _ {\ sigma \ till 0} \ mathcal N (0, \ sigma) $$

Kommentarer

  • Huruvida det " misslyckas " måste bero på dess funktionella specifikation. Om avsikten bara är att returnera en kontinuerlig version av sannolikhetstätheten är funktionen som alltid returnerar noll korrekt, eftersom Dirac-deltaet har en densitet definierad överallt utom vid medelvärdet. Om å andra sidan den här funktionen kallas som en del av en sannolikhetsberäkning för beräkning av en ML-uppskattning, finns det ingen som helst implementering som får den att lyckas: allt det kan göra är att höja ett felvillkor.
  • @whuber, flytande punktformat stöder positiv oändlighet. Så han kunde ställa in PDF till oändlighet. Problemet ' är att även då kommer hans sannolikhetsoptimeringsrutin inte att fungera på grund av diskontinuiteten. Därför säger jag ' att han måste ändra koden som använder PDF. Han kan ' inte komma undan med att bara röra med PDF ensam
  • Jag har lagt upp en ytterligare kommentar ovan med mer info. Jag ' tänker att Aksakal är korrekt. Jag måste ändra koden som använder metoden.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *