如何在 Javascript 中创建最佳拟合多项式曲线?
How do I create a best-fit polynomial curve in Javascript?
我正在尝试使用 3-6 阶多项式计算数据的最佳拟合曲线。我找到了这个教程:Cubic Regression (best fit line) in JavaScript
首先,我似乎无法让我的输出远程匹配曲线。 jsbin 在这里:http://jsbin.com/qukuqigobu/1/edit?html,js,console,output
var data_x = [500,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000];
var data_y = [50,80,100,160,210,265,340,390,440,470,500,500,495,460];
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]);
}
我的输出系数是:
1
-17358.001260500238
80977844.06724495
-96625621220.328
但是,在 excel 中使用 LINEST,它们是:
-4.68257E-09
4.26789E-05
-0.01
45.39760539
我根据 Excel 中的 X 计算了 Y 值,使用它来确认良好的相关性。最小化器结果不起作用。
这是第一步,但理想情况下我希望能够对 4 阶、5 阶和 6 阶多项式执行相同的操作。
如有任何帮助,我们将不胜感激。谢谢。
使用矩阵代数计算出来:
var x = [500,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000];
var y = [50,80,100,160,210,265,340,390,440,470,500,500,495,460];
order = 3;
var xMatrix = [];
var xTemp = [];
var yMatrix = numeric.transpose([y]);
for (j=0;j<x.length;j++)
{
xTemp = [];
for(i=0;i<=order;i++)
{
xTemp.push(1*Math.pow(x[j],i));
}
xMatrix.push(xTemp);
}
var xMatrixT = numeric.transpose(xMatrix);
var dot1 = numeric.dot(xMatrixT,xMatrix);
var dotInv = numeric.inv(dot1);
var dot2 = numeric.dot(xMatrixT,yMatrix);
var solution = numeric.dot(dotInv,dot2);
console.log("Coefficients a + bx^1 + cx^2...")
console.log(solution);
我正在尝试使用 3-6 阶多项式计算数据的最佳拟合曲线。我找到了这个教程:Cubic Regression (best fit line) in JavaScript
首先,我似乎无法让我的输出远程匹配曲线。 jsbin 在这里:http://jsbin.com/qukuqigobu/1/edit?html,js,console,output
var data_x = [500,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000];
var data_y = [50,80,100,160,210,265,340,390,440,470,500,500,495,460];
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]);
}
我的输出系数是:
1
-17358.001260500238
80977844.06724495
-96625621220.328
但是,在 excel 中使用 LINEST,它们是:
-4.68257E-09
4.26789E-05
-0.01
45.39760539
我根据 Excel 中的 X 计算了 Y 值,使用它来确认良好的相关性。最小化器结果不起作用。
这是第一步,但理想情况下我希望能够对 4 阶、5 阶和 6 阶多项式执行相同的操作。
如有任何帮助,我们将不胜感激。谢谢。
使用矩阵代数计算出来:
var x = [500,1000,1500,2000,2500,3000,3500,4000,4500,5000,5500,6000,6500,7000];
var y = [50,80,100,160,210,265,340,390,440,470,500,500,495,460];
order = 3;
var xMatrix = [];
var xTemp = [];
var yMatrix = numeric.transpose([y]);
for (j=0;j<x.length;j++)
{
xTemp = [];
for(i=0;i<=order;i++)
{
xTemp.push(1*Math.pow(x[j],i));
}
xMatrix.push(xTemp);
}
var xMatrixT = numeric.transpose(xMatrix);
var dot1 = numeric.dot(xMatrixT,xMatrix);
var dotInv = numeric.inv(dot1);
var dot2 = numeric.dot(xMatrixT,yMatrix);
var solution = numeric.dot(dotInv,dot2);
console.log("Coefficients a + bx^1 + cx^2...")
console.log(solution);