【问题标题】:How do I create a best-fit polynomial curve in Javascript?如何在 Javascript 中创建最佳拟合多项式曲线?
【发布时间】:2016-01-21 15:55:36
【问题描述】:

我正在尝试使用 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 阶多项式执行相同的操作。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: javascript best-fit-curve


    【解决方案1】:

    使用矩阵代数计算出来:

    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);
    

    jsbin:http://jsbin.com/yoqiqanofo/1/

    【讨论】:

    • 嘿,但是得到这些数字后该怎么办?如何将它们插入公式以执行预测?
    • @hyperfkcb 我知道我迟到了几个月,但如果您阅读以下内容可能会让您更好地理解:en.wikipedia.org/wiki/Polynomial_regression 他的代码只是一种计算“最佳位”的方法的实现对于 n 阶多项式。
    • @hyperfkcb 你用的是哪个库? “未定义数字”...
    • @theshadow 你知道它是哪个库吗?
    • @Digerkam 如果您查看他们链接的 jsbin,他们正在 html 中导入 numericjs.com/lib/numeric-1.2.6.min.js
    猜你喜欢
    • 2012-08-05
    • 2018-02-16
    • 1970-01-01
    • 2021-10-29
    • 2017-03-31
    • 2019-09-05
    • 2011-01-31
    • 2011-07-18
    相关资源
    最近更新 更多