Înțeleg că distribuția normală este nedefinită dacă deviația standard este zero, dar trebuie să mă ocup de cazul în care toate valorile sunt egale într-un algoritm de computer. Următoarea metodă trebuie să returneze o valoare validă, chiar dacă abaterea standard este zero. Cum pot remedia această metodă, astfel încât să nu se împartă la 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; }
Ideea mea a fost să introduc acest lucru la începutul metodei:
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
Ar fi corect?
Comentarii
Răspuns
Când deviația standard este zero, PDF-ul Gaussian (normal) se transformă în funcție Delta delac . Nu puteți conecta pur și simplu abaterea standard zero la expresia convențională. De exemplu, dacă PDF-ul este conectat la un fel de integrare numerică, acest lucru nu va funcționa. Trebuie să modificați integralele. În exemplul de mai jos calculăm valoarea medie a funcției $ g (x) $ folosind densitatea Gaussian $ f (x | \ mu, \ sigma ^ 2) $:
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
atunci când conectați varianța zero, aceasta devine funcțională delta: $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
Codul dvs. trebuie să poată recunoaște acest lucru, altfel va eșua.
O modalitate de a remedia acest lucru este surprinzător de simplă: conectați o valoare foarte mică de $ \ sigma $ la Gaussian în loc de zero. Va trebui să alegeți $ \ sigma $ potrivit pentru situația dvs. Dacă este prea mic, atunci îți va arunca exponentul, iar integralele nu vor funcționa sau precizia va fi scăzută. Aceasta merge la o aproximare gaussiană cunoscută a funcției delta: $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
Comentarii
- Fie că " eșuează " trebuie să depindă de specificațiile sale funcționale. Dacă intenția este doar de a returna o versiune continuă a densității probabilității, atunci funcția care returnează întotdeauna zero este corectă, deoarece delta Dirac are o densitate definită peste tot, dar la medie. Dacă, pe de altă parte, această funcție este apelată ca parte a calculului probabilității pentru calcularea unei estimări ML, atunci nu există nicio implementare care să o facă să aibă succes: tot ce poate face este să ridice o condiție de eroare.
- @whuber, formatul plutitor acceptă infinit pozitiv. Deci, el ar putea seta PDF-ul la infinit. Problema ' este că nici atunci rutina sa de optimizare a probabilității nu va funcționa, din cauza discontinuității. Prin urmare, ' spun că trebuie să modifice codul care folosește PDF. El nu poate ' să scape doar de a face joc doar cu PDF
- Am postat un comentariu suplimentar mai sus, cu mai multe informații. ' cred că Aksakal este corect. Trebuie să modific codul care folosește metoda.
NormalDist
în algoritmul dvs.?