Rozumiem, że rozkład normalny jest niezdefiniowany, jeśli odchylenie standardowe wynosi zero, ale muszę zająć się przypadkiem, w którym wszystkie wartości są równe w algorytmie komputerowym. Poniższa metoda musi zwracać prawidłową wartość, nawet jeśli odchylenie standardowe wynosi zero. Jak mogę naprawić tę metodę, aby nie dzieliła przez zero?
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 pomysł polegał na wstawieniu tego na początku metody:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Czy to byłoby poprawne?
Komentarze
Odpowiedź
Gdy odchylenie standardowe wynosi zero, plik Gaussa (normalny) PDF zamienia się w delta Diraca . Nie można po prostu podłączyć zerowego odchylenia standardowego do konwencjonalnego wyrażenia. Na przykład, jeśli plik PDF jest podłączony do jakiejś integracji numerycznej, to nie zadziała. Musisz zmodyfikować całki. W poniższym przykładzie obliczamy średnią wartość funkcji $ g (x) $ na podstawie gęstości Gaussa $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
kiedy podłączysz zerową wariancję, stanie się to funkcjami delta: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Twój kod musi być w stanie to rozpoznać, w przeciwnym razie nie powiedzie się.
Jeden ze sposobów naprawienia tego jest zaskakująco prosty: podłącz bardzo małą wartość $ \ sigma $ do Gaussa zamiast zera. Będziesz musiał wybrać właściwą $ \ sigma $ do swojej sytuacji. Jeśli jest za mały, to wysadzi twój wykładnik, a całki nie będą działać lub precyzja będzie niska. To prowadzi do znanego przybliżenia Gaussa funkcji delta: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Komentarze
- Czy " nie powiedzie się " musi zależeć od specyfikacji funkcjonalnej. Jeśli intencją jest po prostu zwrócenie ciągłej wersji gęstości prawdopodobieństwa, to funkcja, która zawsze zwraca zero, jest poprawna, ponieważ delta Diraca ma gęstość zdefiniowaną wszędzie poza średnią. Z drugiej strony, jeśli ta funkcja jest wywoływana jako część obliczenia prawdopodobieństwa obliczania oszacowania ML, to nie ma żadnej implementacji, która spowodowałaby jej sukces: wszystko, co może zrobić, to wywołać warunek błędu.
- @whuber, zmienny format punktowy obsługuje dodatnią nieskończoność. Więc mógł ustawić plik PDF na nieskończoność. Problem ' polega na tym, że nawet wtedy jego procedura optymalizacji prawdopodobieństwa nie zadziała z powodu nieciągłości. Dlatego ' mówię, że musi zmodyfikować kod korzystający z formatu PDF. Nie może ' nie uciec od bałaganu z samym plikiem PDF
- Opublikowałem powyżej dodatkowy komentarz zawierający więcej informacji. Uważam, że ' Aksakal ma rację. Muszę zmodyfikować kod, który używa tej metody.
NormalDist
w swoim algorytmie?