gpt4 book ai didi

javascript - JavaScript 中的三次回归(最佳拟合线)

转载 作者:行者123 更新时间:2023-11-30 08:03:30 26 4
gpt4 key购买 nike

我在寻找可以让我进行三次回归的 JavaScript 代码时遇到了最糟糕的情况。会自己写,但我对多项式数学的理解还不够理想。

所以,这就是我要找的东西。给定数组数组的输入,其中内部数组为 [x,y],该函数将以具有四个参数的数组形式给我一个输出 - [a,b,c,d],其中 a , b, c, d是方程y = ax^3 + bx^2 + cx + d的参数。

例子:输入是这样的数组 [[2,5],[5,10],[07,15],[12,20],[20,25],[32,30],[50,35]]。

本质上是表的表示:

|    x   |   y    ||-----------------||   02   |   05   ||   05   |   10   ||   07   |   15   ||   12   |   20   ||   20   |   25   ||   32   |   30   ||   50   |   35   |

现在,输出将是 [0.000575085,-0.058861065,2.183957502,1.127605507]。这些是三次函数的 a、b、c 和 d 参数。

(仅供引用,我使用 Excel 的 LINEST 函数并使用数组函数 {1,2,3} 在上面的一组数字上运行它得到的输出)。

这怎么可能?非常感谢任何指导。

最好的,汤姆

最佳答案

这是使用 numeric.js 求解立方体的一段真实有效的代码库的 uncmin 无约束最小化器作为最小二乘问题 ( jsbin here ):

var data_x = [2,5,7,12,20,32,50];
var data_y = [5,10,15,20,25,30,35];

var cubic = function(params,x) {
return params[0] * x*x*x +
params[1] * x*x +
params[2] * x +
params[3];
};

var objective = function(params) {
var total = 0.0;
for(var i=0; i < data_x.length; ++i) {
var resultThisDatum = cubic(params, data_x[i]);
var delta = resultThisDatum - data_y[i];
total += (delta*delta);
}
return total;
};

var initial = [1,1,1,1];
var minimiser = numeric.uncmin(objective,initial);

console.log("initial:");
for(var j=0; j<initial.length; ++j) {
console.log(initial[j]);
}

console.log("minimiser:");
for(var j=0; j<minimiser.solution.length; ++j) {
console.log(minimiser.solution[j]);
}

我得到了结果:

 0.0005750849851827991
-0.05886106462847641
2.1839575020602164
1.1276055079334206

解释一下:我们有一个函数“cubic”,它计算一组参数 params 和一个值 x 的一般三次函数。这个函数被包装以创建目标函数,它采用一组参数并通过目标函数运行我们数据集中的每个 x 值并计算平方和。这个函数从带有一组初始值的 numeric.js 传递给 uncminuncmin 完成艰苦的工作并返回一个对象,其 solution 属性包含优化的参数集。

要在没有全局变量的情况下执行此操作(调皮!),您可以拥有一个目标函数工厂:

var makeObjective = function(targetFunc,xlist,ylist) {
var objective = function(params) {
var total = 0.0;
for(var i=0; i < xlist.length; ++i) {
var resultThisDatum = targetFunc(params, xlist[i]);
var delta = resultThisDatum - ylist[i];
total += (delta*delta);
}
return total;
};
return objective;
};

您可以使用它来制造目标函数:

var objective = makeObjective(cubic, data_x, data_y); // then carry on as before

知道如何实际执行此操作会对很多人有很大帮助,所以我很高兴有人提出这个问题。

编辑:对 cubic 的说明

var cubic = function(params,x) {
return params[0] * x*x*x +
params[1] * x*x +
params[2] * x +
params[3];
};

Cubic 被定义为一个函数,它接受一个参数数组 params 和一个值 x。给定params,我们可以定义一个函数f(x)。对于立方体,即 f(x) = a x^3 + b x^2 + c x + d 所以有 4 个参数([0][ 3]),给定这 4 个参数值,我们有一个函数 f(x) 和 1 个输入 x

代码的结构允许您将 cubic 替换为具有相同结构的另一个函数;它可以是具有 2 个参数的线性:

var linear = function(params, x) {
return params[0]*x + params[1];
};

代码的其余部分将查看params 的长度,以了解有多少参数需要修改。

请注意,这整段代码试图找到生成最适合所有数据的曲线的参数值集;如果您想找到一些数据的最后 4 个点的拟合值,您将只传递 data_xdata_y 中的那些值。

关于javascript - JavaScript 中的三次回归(最佳拟合线),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com