나는 c에서 주어진 값에 대해 INVERSE 누적 정규 분포를 반환하는 함수 나 코드를 찾고있다. 그래서 0.5를 입력하면 0을 얻습니다. 0.157은 -1을줍니다.c의 역 누적 분포 함수?
C에서 구현할 방법이 있습니까?
나는 c에서 주어진 값에 대해 INVERSE 누적 정규 분포를 반환하는 함수 나 코드를 찾고있다. 그래서 0.5를 입력하면 0을 얻습니다. 0.157은 -1을줍니다.c의 역 누적 분포 함수?
C에서 구현할 방법이 있습니까?
그 트릭을해야합니다. 이것은 객관적인 코드이지만 쉽게 c로 변환 할 수 있어야합니다. 통계 계산에 사용하고 잘 작동합니다.
- (double)getInverseCDFValue:(double)p {
double a1 = -39.69683028665376;
double a2 = 220.9460984245205;
double a3 = -275.9285104469687;
double a4 = 138.3577518672690;
double a5 =-30.66479806614716;
double a6 = 2.506628277459239;
double b1 = -54.47609879822406;
double b2 = 161.5858368580409;
double b3 = -155.6989798598866;
double b4 = 66.80131188771972;
double b5 = -13.28068155288572;
double c1 = -0.007784894002430293;
double c2 = -0.3223964580411365;
double c3 = -2.400758277161838;
double c4 = -2.549732539343734;
double c5 = 4.374664141464968;
double c6 = 2.938163982698783;
double d1 = 0.007784695709041462;
double d2 = 0.3224671290700398;
double d3 = 2.445134137142996;
double d4 = 3.754408661907416;
//Define break-points.
double p_low = 0.02425;
double p_high = 1 - p_low;
long double q, r, e, u;
long double x = 0.0;
//Rational approximation for lower region.
if (0 < p && p < p_low) {
q = sqrt(-2*log(p));
x = (((((c1*q+c2)*q+c3)*q+c4)*q+c5)*q+c6)/((((d1*q+d2)*q+d3)*q+d4)*q+1);
}
//Rational approximation for central region.
if (p_low <= p && p <= p_high) {
q = p - 0.5;
r = q*q;
x = (((((a1*r+a2)*r+a3)*r+a4)*r+a5)*r+a6)*q/(((((b1*r+b2)*r+b3)*r+b4)*r+b5)*r+1);
}
//Rational approximation for upper region.
if (p_high < p && p < 1) {
q = sqrt(-2*log(1-p));
x = -(((((c1*q+c2)*q+c3)*q+c4)*q+c5)*q+c6)/((((d1*q+d2)*q+d3)*q+d4)*q+1);
}
//Pseudo-code algorithm for refinement
if((0 < p)&&(p < 1)){
e = 0.5 * erfc(-x/sqrt(2)) - p;
u = e * sqrt(2*M_PI) * exp(x*x/2);
x = x - u/(1 + x*u/2);
}
iCFDValue = x;
return iCFDValue;
}
이 함수에 대한 참조는 Acklam 때문일 수 있다고 생각합니다. cf [Norm quantile function] (https://stackedboxes.org/2017/05/01/acklams-normal-quantile-function/). – oliversm
귀하의 질문에 이해가 안되며, 그렇습니다. 다른 언어로 그것을 수행하는 방법에 대한 아이디어는 C에서 구현할 방법이 있습니까? 번역 할 수 있도록 도울 수 있습니다. –
표준 균일 분포를 표준 정규 분포로 변환하려는 것 같습니다. 나는 닫을 까? – Jasen
Stackoverflow는 코드를 작성할 장소가 아닙니다. 아마도 유용한 링크 일 것입니다 : http://home.online.no/~pjacklam/notes/invnorm/ http://www.quantstart.com/articles/ Statistical-Distributions-in-C 직접 해보고 만나는 문제로 되돌아 가십시오. – Simon