2014-11-24 11 views
1

정규 분포의 곡선 아래 영역을 계산하려고합니다. 일반적으로 계산기 나 z 테이블을 참조 할 수 있습니다. 하지만 어떻게 코드를 작성할 수 있습니까? 저는 z, mu, 시그마와 경계 값을 가지고 있습니다. 온라인에서 여러 코드를 보았지만 그 중 아무 것도 그 뒤에있는 논리를 설명하지 못했습니다. 외부 메서드를 사용하는 대신이 메서드가 어떻게 작동하는지 배우고 코드를 작성하고 싶습니다.Java의 정규 분포에서 면적을 계산하는 방법은 무엇입니까?

누군가 복잡한 정보없이 z, mu, sigma 및 경계를 사용하여 곡선 아래의 영역을 계산하는 방법에 알고리즘을 제공 할 수 있다면 큰 도움이 될 것입니다.

감사합니다.

+2

이 논리는 프로그래밍 관련 문제가 아니라 수학 영역에 있으며 Google, Wikipedia 등과 같은 일반적인 온라인 소스에서 찾을 수 있습니다. –

+5

이 질문은 주제가 아닌 것 같습니다. 특정 프로그램 문제가 아니라 수학 알고리즘의 논리에 관한 것입니다. –

+1

수학 책을 열고 "미적분"을 찾아야 할까 봐 걱정됩니다. 정규 분포는 e^(- x^2) 맞습니까? –

답변

3

다른 언어와 같은 방식으로 사용하십시오. 다음과 같이

정규 분포는 확률을 가지고 정의 :

enter image description here

은 무엇 당신이해야 할 것은 그 통합이다. 먼저 확률 분포를 방법으로 만드십시오. mu = 0 및 sigma = 1을 사용하여 간단하게 할 수 있습니다.

/** 
* Returns the height of the normal distribution at the specified z-score 
*/ 
double getNormalProbabilityAtZ(double z) { 
    return Math.exp(-Math.pow(z, 2)/2)/Math.sqrt(2 * Math.PI); 
} 

다음으로 통합 할 방법이 필요합니다. 아이디어는 그것을 작은 부분들로 나눠서 각 부분에 y 값을 얻은 다음 사각형의 너비를 곱하는 것입니다. Here's more reading on Riemann Sums에 익숙하지 않은 경우를 대비하여

/** 
    * Returns the area under the normal curve between the z-scores z1 and z2 
    */ 
double getAreaUnderNormalCurve(double z1, double z2) { 
    double area = 0.0; 
    final int rectangles = 100000; // more rectangles = more precise, less rectangles = quicker execution 
    final double width = (z2 - z1)/rectangles; 
    for(int i = 0; i < rectangles; i++) 
     area += width * getNormalProbabilityAtZ(width * i + z1); 
    return area; 
} 

여기 있습니다!

일반 분포에서 면적을 찾아야하는 경우 z- 점수가 무한대라고 가정하고 getAreaUnderNormalCurve(1, 5)처럼 1에서 5와 같이하십시오. 왜? z=3 이후 벨 곡선 아래 영역이 매우 작습니다. z=5 이후에는 통합 할 가치가 없다는 점에서 무시할 수 있습니다.

면책 조항 : 가장 빠른 속도와 정밀성이 필요한 경우 직접 구현해서는 안됩니다. Apache Commons Error Function과 같이 이미있는 라이브러리를 사용하십시오. 다음 함수로 오류 누적 분포를 구할 수 있습니다. normalCdf(x) = 1/2 + 1/2 * erf(x/sqrt(2))

해설 코딩 OP가 여전히 만족스럽지 않으면 의견을 보내 주시면 답변을 편집 해 드리겠습니다.

+0

이것은 정말로 나쁜 생각입니다. 쉽게 발견 할 수있는 라이브러리에는 잘 알려진 많은 알고리즘과 간단한 시리즈 확장, 연속 분수 등이 있습니다. 수치 적 통합은보다 효율적인 것을 생각해 낼 수 없을 때 사용할 마지막 방법입니다. – rvl

+1

나는이 일을 스스로하는 것이 현실적으로 어렵다고 생각하지 않는다. 확실히 라이브러리가 있으면 사용할 수 있습니다. 나는 OP가 수학을 이해하고 실제적인 목적보다 학문적 목적으로 사용하는 것에 관심이 있지만 꽤 분명하다고 생각합니다. –

+0

설명 답을 해줘서 고맙지 만 리만 합계의 문제는 높이/y가 필요하다는 것입니다. 그럴 필요 없어. 방금 x, 시그마와 평균을 가졌어요. 다른 방법이 있습니까, 나는 y없이 그것을 해결할 수 있습니다 – Ambidextrous

관련 문제