Страницы

Поиск по вопросам

пятница, 30 ноября 2018 г.

Преобразование случайной величины с равномерным распределением в величину с нормальным распределением

У меня есть некое кол-во случайных величин float в диапазоне [0;1] и эти величины имеют равномерное распределение.
Если такая величина X имеет нормальное распределение, то, величина K = m + a * tan(PI*(X-0.5)) имеет распределение коши.
Возможно ли по аналогии преобразовать такую величину X, в величину имеющую нормальное распределение?


Ответ

Написал грубо и точно ;) функцию InverseErf. Она очень сложна для вычислений.
// g++ inverf.cpp -o inverf # include # include // -1 => -Inf ; 0 => 0 ; +1 => Inf // -0.85 .. +0.85 => кубически // 0.85 .. 0.99 => сложно double InverseErf(double x){ bool flagneg = (x < 0.0); x=fabs(x); double result; if(x<0.85) result =(0.886+(-0.315+0.773*x)*x)*x; else { x=log(1.0-x); double const HalfPi = 1.57 ; result = sqrt(-x-log(-HalfPi*(log(HalfPi)+2.0*x))/2.0);} return flagneg ? -result : result ; }
double SimpleToNormal(double x , double med , double sigma){ return med + sqrt(2.0)*sigma*InverseErf(2.0*x-1.0);}
int main() { std::cout<<"inverf(0.999)="<Метод Мюллера спровоцировал на ещё один красивый вариант формулы InverseErf
double InverseErf2(double x){ double result = sqrt(-log(1.0-x*x))*0.9; return (x < 0.0) ? -result : result ; }

Комментариев нет:

Отправить комментарий