Накопительная функция распределения в Javascript - PullRequest
10 голосов
/ 10 марта 2011

Я ищу способ вычисления функции накопительного распределения в Javascript. Существуют ли классы, которые это реализовали? У вас есть идея, чтобы заставить это работать? Это не должно быть на 100% точным, но мне нужно хорошее представление о стоимости.

http://en.wikipedia.org/wiki/Cumulative_distribution_function

Ответы [ 5 ]

9 голосов
/ 10 марта 2011

Я смог написать свою собственную функцию с помощью Есть ли легко доступная реализация erf () для Python? и знания из википедии.

Расчет не на 100% правильный, а лишь приблизительный.

function normalcdf(mean, sigma, to) 
{
    var z = (to-mean)/Math.sqrt(2*sigma*sigma);
    var t = 1/(1+0.3275911*Math.abs(z));
    var a1 =  0.254829592;
    var a2 = -0.284496736;
    var a3 =  1.421413741;
    var a4 = -1.453152027;
    var a5 =  1.061405429;
    var erf = 1-(((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*Math.exp(-z*z);
    var sign = 1;
    if(z < 0)
    {
        sign = -1;
    }
    return (1/2)*(1+sign*erf);
}

normalcdf(30, 25, 1.4241); //-> 0.000223264606750539
//wolframalpha.com              0.000223221102572082
3 голосов
/ 13 января 2017

Библиотека math.js предоставляет функцию erf. Основываясь на определении, найденном в Wolfram Alpha , функция cdfNormal может быть реализована следующим образом в Javascript:

const mathjs = require('mathjs')

function cdfNormal (x, mean, standardDeviation) {
  return (1 - mathjs.erf((mean - x ) / (Math.sqrt(2) * standardDeviation))) / 2
}

В консоли node.js:

> console.log(cdfNormal(5, 30, 25))
> 0.15865525393145707 // Equal to Wolfram Alpha's result at: https://sandbox.open.wolframcloud.com/app/objects/4935c1cb-c245-4d8d-9668-4d353ad714ec#sidebar=compute
3 голосов
/ 13 января 2017

Это реализация грубой силы, но с точностью до цифры.Приведенное выше приближение является точным в пределах 10 ^ -7.Моя реализация работает медленнее (700 наносекунд), но с точностью до 10 ^ -14.normal (25,30,1.4241) === 0.00022322110257305683, против 0,000223221102572082 Вольфрама.

Он принимает степенной ряд стандартного нормального pdf, то есть колоколообразной кривой, а затем интегрирует ряд.

Я изначально написал это в C, поэтому я допускаю, что некоторые оптимизации могут показаться глупыми в Javascript.

function normal(x, mu, sigma) {
    return stdNormal((x-mu)/sigma);
}

function stdNormal(z) {
    var j, k, kMax, m, values, total, subtotal, item, z2, z4, a, b;

    // Power series is not stable at these extreme tail scenarios
    if (z < -6) { return 0; }
    if (z >  6) { return 1; }

    m      = 1;        // m(k) == (2**k)/factorial(k)
    b      = z;        // b(k) == z ** (2*k + 1)
    z2     = z * z;    // cache of z squared
    z4     = z2 * z2;  // cache of z to the 4th
    values = [];

    // Compute the power series in groups of two terms.
    // This reduces floating point errors because the series
    // alternates between positive and negative.
    for (k=0; k<100; k+=2) {
        a = 2*k + 1;
        item = b / (a*m);
        item *= (1 - (a*z2)/((a+1)*(a+2)));
        values.push(item);
        m *= (4*(k+1)*(k+2));
        b *= z4;
    }

    // Add the smallest terms to the total first that
    // way we minimize the floating point errors.
    total = 0;
    for (k=49; k>=0; k--) {
        total += values[k];
    }

    // Multiply total by 1/sqrt(2*PI)
    // Then add 0.5 so that stdNormal(0) === 0.5
    return 0.5 + 0.3989422804014327 * total;
}
1 голос
/ 29 мая 2017

Из-за некоторых потребностей в прошлом я собрал реализацию функции распределения в javascript.моя библиотека доступна на github.Вы можете взглянуть на https://github.com/chen0040/js-stats

, который обеспечивает реализацию CDF и обратного CDF на javascript для нормального распределения, распределения Т-студента, распределения F и распределения хи-квадрат

Для использования js libдля получения CDF и обратного CDF:

</p> <pre><code>jsstats = require('js-stats'); //====================NORMAL DISTRIBUTION====================// var mu = 0.0; // mean var sd = 1.0; // standard deviation var normal_distribution = new jsstats.NormalDistribution(mu, sd); var X = 10.0; // point estimate value var p = normal_distribution.cumulativeProbability(X); // cumulative probability var p = 0.7; // cumulative probability var X = normal_distribution.invCumulativeProbability(p); // point estimate value //====================T DISTRIBUTION====================// var df = 10; // degrees of freedom for t-distribution var t_distribution = new jsstats.TDistribution(df); var t_df = 10.0; // point estimate or test statistic var p = t_distribution.cumulativeProbability(t_df); // cumulative probability var p = 0.7; var t_df = t_distribution.invCumulativeProbability(p); // point estimate or test statistic //====================F DISTRIBUTION====================// var df1 = 10; // degrees of freedom for f-distribution var df2 = 20; // degrees of freedom for f-distribution var f_distribution = new jsstats.FDistribution(df1, df2); var F = 10.0; // point estimate or test statistic var p = f_distribution.cumulativeProbability(F); // cumulative probability //====================Chi Square DISTRIBUTION====================// var df = 10; // degrees of freedom for cs-distribution var cs_distribution = new jsstats.ChiSquareDistribution(df); var X = 10.0; // point estimate or test statistic var p = cs_distribution.cumulativeProbability(X); // cumulative probability

1 голос
/ 05 июня 2012

Вы также можете посмотреть здесь , это научный калькулятор, реализованный в javascript, он включает в себя erf, и его автор не претендует на авторское право на реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...