Created
January 5, 2021 19:49
-
-
Save oliverjumpertz/e97ba51a942e27531c832563c6bef95c to your computer and use it in GitHub Desktop.
Simple linear regression implemented in JavaScript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const inputArray = [ | |
{ | |
squareMeters: 200, | |
priceInDollars: 190000 | |
}, | |
{ | |
squareMeters: 100, | |
priceInDollars: 90000 | |
}, | |
{ | |
squareMeters: 115, | |
priceInDollars: 120000 | |
}, | |
{ | |
squareMeters: 150, | |
priceInDollars: 140000 | |
}, | |
{ | |
squareMeters: 140, | |
priceInDollars: 125000 | |
} | |
]; | |
function linearRegression(inputArray, xLabel, yLabel) { | |
const x = inputArray.map((element) => element[xLabel]); | |
const y = inputArray.map((element) => element[yLabel]); | |
const sumX = x.reduce((prev, curr) => prev + curr, 0); | |
const avgX = sumX / x.length; | |
const xDifferencesToAverage = x.map((value) => avgX - value); | |
const xDifferencesToAverageSquared = xDifferencesToAverage.map( | |
(value) => value ** 2 | |
); | |
const SSxx = xDifferencesToAverageSquared.reduce( | |
(prev, curr) => prev + curr, | |
0 | |
); | |
const sumY = y.reduce((prev, curr) => prev + curr, 0); | |
const avgY = sumY / y.length; | |
const yDifferencesToAverage = y.map((value) => avgY - value); | |
const xAndYDifferencesMultiplied = xDifferencesToAverage.map( | |
(curr, index) => curr * yDifferencesToAverage[index] | |
); | |
const SSxy = xAndYDifferencesMultiplied.reduce( | |
(prev, curr) => prev + curr, | |
0 | |
); | |
const slope = SSxy / SSxx; | |
const intercept = avgY - slope * avgX; | |
return (x) => intercept + slope * x; | |
} | |
const housePrice = linearRegression(inputArray, "squareMeters", "priceInDollars"); | |
console.log(housePrice(100)); | |
// => 94666.38513513515 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment