표준 편차가 0이면 정규 분포가 정의되지 않는다는 것을 알고 있지만 컴퓨터 알고리즘에서 모든 값이 동일한 경우를 처리해야합니다. 다음 메서드는 표준 편차가 0 인 경우에도 유효한 값을 반환해야합니다. 0으로 나누지 않도록이 방법을 어떻게 고칠 수 있습니까?
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; }
내 생각은이 방법을 시작 부분에 삽입하는 것이 었습니다.
if (standard_dev == 0.0) { return x == mean ? 1.0 : 0.0; }
정확할까요?
댓글
답변
표준 편차가 0이면 가우스 (일반) PDF가 Dirac 델타 함수
로 바뀝니다. a>. 표준 편차 0을 기존 표현식에 간단히 연결할 수는 없습니다. 예를 들어 PDF가 어떤 종류의 수치 적분에 연결되어 있으면 작동하지 않습니다. 적분을 수정해야합니다. 아래 예에서 가우스 밀도 $ f (x | \ mu, \ sigma ^ 2) $를 사용하여 함수 $ g (x) $의 평균값을 계산합니다.
$$ \ int g (x ) f (x | \ mu, \ sigma ^ 2) dx $$
제로 분산을 연결하면 델타 함수가됩니다. $$ \ int g (x) f (x | \ mu, 0) dx = \ int g (x) \ delta (x- \ mu) dx = g (\ mu) $$
코드는 이것을 인식 할 수 있어야합니다. 그렇지 않으면 실패합니다.
이 문제를 해결하는 한 가지 방법은 놀랍도록 간단합니다. $ \ sigma $의 아주 작은 값을 0 대신 Gaussian에 연결합니다. 상황에 맞는 $ \ sigma $를 선택해야합니다. “너무 작 으면”지수를 날려 버리고 적분이 작동하지 않거나 정밀도가 낮아집니다. 이것은 델타 함수의 알려진 가우스 근사 로 이동합니다. $$ \ delta (x) = \ lim _ {\ sigma \ to 0} \ mathcal N (0, \ sigma) $$
댓글
- " 실패 여부 "는 기능 사양에 의존해야합니다. 의도가 단순히 확률 밀도의 연속 버전을 반환하는 것이라면 항상 0을 반환하는 함수가 정확합니다. 왜냐하면 Dirac 델타에는 평균이 아닌 모든 곳에서 밀도가 정의되어 있기 때문입니다. 반면에,이 함수가 ML 추정치를 계산하기위한 가능성 계산의 일부로 호출되는 경우 성공을 유발할 수있는 구현이 없습니다. 할 수있는 일은 오류 조건을 발생시키는 것뿐입니다.
- @whuber, 부동 포인트 형식 은 양의 무한대를 지원합니다. 따라서 그는 PDF를 무한대로 설정할 수 있습니다. 문제는 ' 그의 가능성 최적화 루틴이 불연속으로 인해 작동하지 않는 것입니다. 따라서 저는 ' PDF를 사용하는 코드를 수정해야한다고 말합니다. 그는 ' 단지 PDF 만 엉망으로 만들 수는 없습니다
- 위에 추가 정보와 함께 추가 댓글을 게시했습니다. ' Aksakal이 맞다고 생각합니다. 이 방법을 사용하는 코드를 수정해야합니다.
NormalDist
를 사용 하시겠습니까?