javascript - Convert weighted linear regression code from Python to JS -


i'm trying convert code user3658307 math site kindly shared me (in python format) here. i'm not great @ maths think i'm doing wrong here output seems increasing linearly instead of doing original python code should doing. doing wrong or can more experienced kind of calculus me convert javascript? thanks!

python code:

import os, sys, numpy np sklearn import linear_model x = np.array([13,14,15,16,17,18]).reshape((6,1)) yraw = [0.015,0.01,0.005,0.002,0.001,0.0005] y = np.array([ np.log(v) v in yraw ]) w = [100] + ([1]*4) + [10] # weight various data points print("transformed data\n"+str(x)+"\n"+str(y)) # fit linear function transformed data regr = linear_model.linearregression() regr.fit(x,y,sample_weight=w) print('coefficient: \n', regr.coef_) print('intercept: \n', regr.intercept_) # @ function explicitly a,b = regr.coef_[0],regr.intercept_ f = lambda x: np.exp( a*x + b )  print('outputs of function') x in range(1,19): print(str(x)+": "+str(f(x))) 

my code (fiddle (uses num.js) linear function here):

var code = function() {     var x = nj.array([13, 14, 15, 16, 17, 18]).reshape(6, 1);     var yraw = [0.015, 0.01, 0.005, 0.002, 0.001, 0.0005];     var y = nj.array(nj.log(yraw));     //var w = 100 + (1 * 4) + 10 // weight various data points             var w = [100, 1, 1, 1, 1, 10];     console.log('transformed data', x.selection.data, y.selection.data);      var array = [];     (var = 0; < 6; i++)         array.push([x.selection.data[i], y.selection.data[i]]);      var regr = weightedlinearregression(array, w);      var = regr.equation[0];     var b = regr.equation[1];     var f = (x) => { return * x + b };     (var = 1; <= 19; i++)         console.log(i, f(i)); }  var weightedlinearregression = function (data, weights) {      var sums = { xw: 0, x: 0, yw: 0, y: 0, a: 0, b: 0 };      // compute weighted averages     (var = 0; < data.length; i++) {         sums.xw += data[i][0] * weights[i];         sums.yw += data[i][1] * weights[i];         sums.x += data[i][0];         sums.y += data[i][1];     }      var weightedx = sums.xw / sums.x;     var weightedy = sums.yw / sums.y;      // compute gradient , intercept     (var = 0; < data.length; i++) {         sums.a += (data[i][1] - weightedy) * (data[i][0] - weightedx) * weights[i];         sums.b += (data[i][0] - weightedx) * (data[i][0] - weightedx) * weights[i];     }      var gradient = sums.a / sums.b;     var intercept = (weightedy - weightedx) * gradient;     var string = 'y = ' + math.round(gradient * 100) / 100 + 'x + ' + math.round(intercept * 100) / 100;     var results = [];      //interpolate result     (var = 0, len = data.length; < len; i++) {         var coordinate = [data[i][0], data[i][0] * gradient + intercept];         results.push(coordinate);     }      return { equation: [gradient, intercept], points: results, string: string };  }  code(); 

correct output vs. output:

my output (wrong)     | correct output ------------------------------------------- 1 -3.4140439207888633 | 1 51.2498600531 2 1.6212123570552457  | 2 26.0231972143 3 6.656468634899355   | 3 13.2138271705 4 11.691724912743464  | 4 6.70959940293 5 16.726981190587573  | 5 3.40694059086 6 21.76223746843168   | 6 1.72994593159 7 26.797493746275787  | 7 0.878416528378 8 31.8327500241199    | 8 0.446034516593 9 36.868006301964016  | 9 0.226483431909 10 41.903262579808114 | 10 0.115001738702 11 46.93851885765223  | 11 0.0583945580167 12 51.97377513549634  | 12 0.0296510682748 13 57.00903141334045  | 13 0.0150559552071 14 62.04428769118455  | 14 0.00764497876085 15 67.07954396902866  | 15 0.00388189918541 16 72.11480024687278  | 16 0.00197111617404 17 77.15005652471689  | 17 0.00100087580485 18 82.185312802561    | 18 0.00050821579668 

any greatly appreciated. thanks! :)

okay, after lot of research managed it! thankfully, else had same issue did , made class c# here converted js. i'll leave here future readers want weighted linear regression function in js without kind of external libraries. i'm not sure if internals right (i suck @ maths), gives me output need :)

let linearregressionweighted = (values) => {      let sumfn = (input) => {         var total = 0;         (var = 0; < input.length; i++) {             if (isnan(input[i])) {                 continue;             }             total += number(input[i]);         }         return total;     }      let sum = sumfn(values.map(x => x.weight));     let xavg = sumfn(values.map(x => x.x * x.weight)) / sum;     let yavg = sumfn(values.map(x => x.y * x.weight)) / sum;     let sumxy = sumfn(values.map(x => (x.x - xavg) * (x.y - yavg) * x.weight));     let sumxx = sumfn(values.map(x => math.pow(x.x - xavg, 2) * x.weight));      let m = sumxx == 0 ? 0 : (sumxy / sumxx);     let b = yavg - m * xavg;     return {         coefficient: m,         intercept: b     }; }  let r = linearregressionweighted(     [         { x: 13, y: math.log(0.015), weight: 100 },         { x: 14, y: math.log(0.01), weight: 1 },         { x: 15, y: math.log(0.005), weight: 1 },         { x: 16, y: math.log(0.002), weight: 1 },         { x: 17, y: math.log(0.001), weight: 1 },         { x: 18, y: math.log(0.0005), weight: 10 },     ] );  let = r.coefficient; let b = r.intercept; let f = (x) => math.exp(a * x + b);  (let = 1; < 19; i++)     console.log(i, f(i)); 

Comments

Popular posts from this blog

c# - Binding a comma separated list to a List<int> in asp.net web api -

Delphi 7 and decode UTF-8 base64 -

html - Is there any way to exclude a single element from the style? (Bootstrap) -