我正在寻找一种在Javascript中计算累积分布函数的方法.有没有实现过这个的课程?你有想法让这个工作吗?它不需要100%准确,但我需要对价值有所了解.
http://en.wikipedia.org/wiki/Cumulative_distribution_function
我能够在帮助下编写自己的函数吗?是否有一个容易实现的erf()for 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
Run Code Online (Sandbox Code Playgroud)
该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
}
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
与当前接受的答案不同,此公式将给出正确的正常 CDF
function ncdf(x, mean, std) {
var x = (x - mean) / std
var t = 1 / (1 + .2315419 * Math.abs(x))
var d =.3989423 * Math.exp( -x * x / 2)
var prob = d * t * (.3193815 + t * ( -.3565638 + t * (1.781478 + t * (-1.821256 + t * 1.330274))))
if( x > 0 ) prob = 1 - prob
return prob
}
Run Code Online (Sandbox Code Playgroud)
这个答案来自 math.ucla.edu