Chr*_* W. 28 javascript statistics jquery flot linear-regression
我想在网络浏览器中使用Javascript进行最小二乘拟合.
目前,用户使用HTML文本输入输入数据点信息,然后我使用jQuery获取数据并使用Flot绘制图形.
在用户输入他们的数据点后,我想向他们展示一条"最合适的线".我想我会计算线性,多项式,指数和对数方程,然后选择具有最高R^2
值的方程.
我似乎无法找到任何可以帮助我做到这一点的库.我偶然发现了jStat,但它完全缺少文档(据我所知)并且在挖掘源代码之后它似乎没有内置任何线性回归功能 - 我纯粹基于函数然而,名字.
有谁知道任何提供简单回归分析的Javascript库?
希望是我可以像这样使用图书馆......
如果我在数组中有一些散点var points = [[3,4],[15,45],...[23,78]]
,我可以将它交给某个函数lin_reg(points)
,它会返回类似于[7.12,3]
线性方程的东西y = 7.12 x + 3
.
Mil*_*ric 21
什么样的线性回归?对于像最小二乘这样简单的东西,我只是自己编程:
http://mathworld.wolfram.com/LeastSquaresFitting.html
数学并不太难以跟随那里,给它一个小时左右的时间,让我知道如果它太难了,我可以尝试一下.
编辑:
找到了这样做的人:
http://dracoblue.net/dev/linear-least-squares-in-javascript/159/
o_c*_*o_c 11
我找到的最简单的解决方案可以在以下帖子中找到:http: //trentrichardson.com/2010/04/06/compute-linear-regressions-in-javascript/
请注意,除线性方程外,它还返回R2分数,这可能很有用.
**编辑**
这是实际的代码片段:
function linearRegression(y,x){
var lr = {};
var n = y.length;
var sum_x = 0;
var sum_y = 0;
var sum_xy = 0;
var sum_xx = 0;
var sum_yy = 0;
for (var i = 0; i < y.length; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += (x[i]*y[i]);
sum_xx += (x[i]*x[i]);
sum_yy += (y[i]*y[i]);
}
lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x);
lr['intercept'] = (sum_y - lr.slope * sum_x)/n;
lr['r2'] = Math.pow((n*sum_xy - sum_x*sum_y)/Math.sqrt((n*sum_xx-sum_x*sum_x)*(n*sum_yy-sum_y*sum_y)),2);
return lr;
}
Run Code Online (Sandbox Code Playgroud)
要使用它,你只需要传递两个数组,known_y和known_x,所以这是你可能传递的:
var known_y = [1, 2, 3, 4];
var known_x = [5.2, 5.7, 5.0, 4.2];
var lr = linearRregression(known_y, known_x);
// now you have:
// lr.slope
// lr.intercept
// lr.r2
Run Code Online (Sandbox Code Playgroud)
带有变异度量的简单线性回归(总平方和 = 回归平方和 + 误差平方和)、估计的标准误差 SEE(残差标准误差)以及确定系数 R2 和相关系数 R。
const regress = (x, y) => {
const n = y.length;
let sx = 0;
let sy = 0;
let sxy = 0;
let sxx = 0;
let syy = 0;
for (let i = 0; i < n; i++) {
sx += x[i];
sy += y[i];
sxy += x[i] * y[i];
sxx += x[i] * x[i];
syy += y[i] * y[i];
}
const mx = sx / n;
const my = sy / n;
const yy = n * syy - sy * sy;
const xx = n * sxx - sx * sx;
const xy = n * sxy - sx * sy;
const slope = xy / xx;
const intercept = my - slope * mx;
const r = xy / Math.sqrt(xx * yy);
const r2 = Math.pow(r,2);
let sst = 0;
for (let i = 0; i < n; i++) {
sst += Math.pow((y[i] - my), 2);
}
const sse = sst - r2 * sst;
const see = Math.sqrt(sse / (n - 2));
const ssr = sst - sse;
return {slope, intercept, r, r2, sse, ssr, sst, sy, sx, see};
}
regress([1, 2, 3, 4, 5], [1, 2, 3, 4, 3]);
Run Code Online (Sandbox Code Playgroud)
小智 7
查看 https://web.archive.org/web/20150523035452/https://cgwb.nci.nih.gov/cgwbreg.html(javascript回归计算器) - 纯JavaScript,而不是对服务器的CGI调用.数据和处理仍保留在您的计算机上.完成R样式结果和R代码以检查工作和结果的可视化.
请参阅OLS的嵌入式JavaScript实现的源代码以及与结果相关的统计信息.
代码是我努力将GSL库函数移植到JavaScript.
这些代码在GPL下发布,因为它基本上用于GPL许可的Gnu Scientific Library(GSL)代码的线路移植.
编辑:Paul Lutus还提供了一些用于回归的GPL代码:http://arachnoid.com/polysolve/index.html
这是一个片段,它将采用三元组 (x, y, r) 数组,其中 r 是 (x, y) 数据点的权重并返回 [a, b] 使得 Y = a*X + b 近似于数据。
// return (a, b) that minimize
// sum_i r_i * (a*x_i+b - y_i)^2
function linear_regression( xyr )
{
var i,
x, y, r,
sumx=0, sumy=0, sumx2=0, sumy2=0, sumxy=0, sumr=0,
a, b;
for(i=0;i<xyr.length;i++)
{
// this is our data pair
x = xyr[i][0]; y = xyr[i][1];
// this is the weight for that pair
// set to 1 (and simplify code accordingly, ie, sumr becomes xy.length) if weighting is not needed
r = xyr[i][2];
// consider checking for NaN in the x, y and r variables here
// (add a continue statement in that case)
sumr += r;
sumx += r*x;
sumx2 += r*(x*x);
sumy += r*y;
sumy2 += r*(y*y);
sumxy += r*(x*y);
}
// note: the denominator is the variance of the random variable X
// the only case when it is 0 is the degenerate case X==constant
b = (sumy*sumx2 - sumx*sumxy)/(sumr*sumx2-sumx*sumx);
a = (sumr*sumxy - sumx*sumy)/(sumr*sumx2-sumx*sumx);
return [a, b];
}
Run Code Online (Sandbox Code Playgroud)