Как создать наиболее подходящую полиномиальную кривую в Javascript?

Я пытаюсь рассчитать наиболее подходящую кривую для данных, используя полином 3-6 порядка. Я нашел этот учебник: Кубическая регрессия (линия наилучшего соответствия) в 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 они таковы:

-4.68257E-09
4.26789E-05
-0.01
45.39760539

Я рассчитал значения Y из X в Excel, используя это, чтобы подтвердить хорошую корреляцию. Результаты минимизации не работают.

Это первый шаг, но в идеале я хотел бы иметь возможность делать то же самое и для многочленов 4-го, 5-го и 6-го порядка.

Любая помощь приветствуется. Спасибо.


person ProDarwin    schedule 01.02.2015    source источник


Ответы (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/

person ProDarwin    schedule 03.02.2015
comment
Эй, но что делать после получения этих чисел? Как я могу подключить их к формуле для выполнения прогноза? - person BlackMamba; 23.10.2017
comment
@hyperfkcb Я знаю, что опоздал на несколько месяцев, но, вероятно, вы лучше поймете, если прочитаете: en .wikipedia.org/wiki/Polynomial_regression его код является реализацией только одного метода вычисления лучшего бита для многочлена n-го порядка. - person theshadow124; 08.01.2018
comment
@hyperfkcb Какую библиотеку вы использовали? цифра не определена... - person Digerkam; 02.06.2020
comment
@theshadow Вы знаете, что это за библиотека? - person Digerkam; 02.06.2020
comment
@Digerkam, если вы посмотрите на связанный jsbin, они импортируют numericjs. com/lib/numeric-1.2.6.min.js в html - person theshadow124; 03.06.2020
comment
Веб-сайт numericjs.com недоступен, но вы все еще можете получить код на GitHub: github.com/sloisel/numeric - person Jacob Philpott; 27.01.2021