Chápu, že normální rozdělení není definováno, pokud je směrodatná odchylka nulová, ale musím se vypořádat s případem, kdy jsou všechny hodnoty v počítačovém algoritmu stejné. Následující metoda musí vrátit platnou hodnotu, i když je standardní odchylka nula. Jak mohu opravit tuto metodu tak, aby se nerozdělovala nulou?
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; }
Můj nápad byl vložit tuto metodu na začátek metody:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Bylo by to správné?
Komentáře
Odpověď
Když je směrodatná odchylka nula, promění se váš gaussovský (normální) PDF na delta funkce Dirac . Nemůžete jednoduše zapojit nulovou směrodatnou odchylku do konvenčního výrazu. Pokud je například PDF zapojeno do nějaké numerické integrace, nebude to fungovat. Musíte upravit integrály. V níže uvedeném příkladu vypočítáme střední hodnotu funkce $ g (x) $ pomocí Gaussovské hustoty $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
když připojíte nulovou odchylku, stane se to deltafunkční: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Váš kód to musí být schopen rozpoznat, jinak selže.
Jeden způsob, jak to napravit, je překvapivě jednoduchý: připojte velmi malou hodnotu $ \ sigma $ do Gaussian namísto nuly. Budete muset vybrat správný $ \ sigma $ pro vaši situaci. Pokud je to „příliš malé“, vyhodí to vašeho exponenta do vzduchu a integrály nebudou fungovat nebo bude přesnost nízká. Jedná se o známou Gaussovu aproximaci funkce delta: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Komentáře
- Zda " selže " musí záviset na jeho funkční specifikaci. Pokud je záměrem pouze vrátit spojitou verzi hustoty pravděpodobnosti, pak je funkce, která vždy vrátí nulu, správná, protože delta Dirac má hustotu definovanou všude kromě střední hodnoty. Pokud je naopak tato funkce volána jako součást výpočtu pravděpodobnosti pro výpočet odhadu ML, pak neexistuje žádná implementace, která by způsobila její úspěch: vše, co může udělat, je vyvolat chybový stav.
- @whuber, plovoucí formát bodů podporuje kladné nekonečno. Takže mohl nastavit PDF na nekonečno. Problém ' spočívá v tom, že ani poté nebude jeho rutina optimalizace pravděpodobnosti fungovat kvůli diskontinuitě. Proto ' říkám, že musí upravit kód, který používá PDF. Nemůže ' se dostat pryč jen z toho, že si hraje jen se samotným PDF
- výše jsem zveřejnil další komentář s dalšími informacemi. ' Myslím si, že Aksakal má pravdu. Musím upravit kód, který tuto metodu používá.
NormalDist
ve svém algoritmu?