Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

SOLVED: Convert linear regression code from Python to JS

DARKGuy:

I'm trying to convert a code that user3658307 from the Math site kindly shared to me (in Python format) here. I'm not great at maths but I think I'm doing something wrong here as my output seems to be increasing linearly instead of doing what the original Python code should be doing. What am I doing wrong or can someone more experienced with this kind of calculus help me to convert it to Javascript? Thanks!

Python code:


import os, sys, numpy as np
from 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) for v in yRaw ])
w = [100] + ([1]*4) + [10] # Weight the various data points
print("Transformed data\n"+str(x)+"\n"+str(y))
# Fit linear function to transformed data
regr = linear_model.LinearRegression()
regr.fit(x,y,sample_weight=w)
print('Coefficient: \n', regr.coef_)
print('Intercept: \n', regr.intercept_)
# Look at function explicitly
a,b = regr.coef_[0],regr.intercept_
f = lambda x: np.exp( a*x + b )
print('Outputs of function')
for x in range(1,19): print(str(x)+": "+str(f(x)))

My code (fiddle (uses num.js) linear function from 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 the various data points
var w = [100, 1, 1, 1, 1, 10];
console.log('Transformed data', x.selection.data, y.selection.data);

var array = [];
for (var i = 0; i array.push([x.selection.data[i], y.selection.data[i]]);

var regr = weightedLinearRegression(array, w);

var a = regr.equation[0];
var b = regr.equation[1];
var f = (x) => { return a * x + b };
for (var i = 1; 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 the weighted averages
for (var i = 0; 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 the gradient and intercept
for (var i = 0; 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
for (var i = 0, len = data.length; 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. My 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 help is GREATLY appreciated. Thanks! :)



Posted in S.E.F
via StackOverflow & StackExchange Atomic Web Robots
This Question have been answered
HERE


This post first appeared on Stack Solved, please read the originial post: here

Share the post

SOLVED: Convert linear regression code from Python to JS

×

Subscribe to Stack Solved

Get updates delivered right to your inbox!

Thank you for your subscription

×