Home Reference Source Repository

lib/linearRegression/batch_linear_regression/batch_linear_regression.js

import { avgPoints } from '../../utils';
import { evalError } from '../../utils';
import { gradientStep } from '../../utils';




export function batch_linear_regression(inputArr,
								  initialWeights, 
								  iterations = 100,
								  adjustmentFunc = (val) => val * 0.1, 
								  adjustmentStart = 1) {
	//State
	let weights = initialWeights || Array(inputArr[0].length).fill(0);
	let n = 0;
	let avg = avgPoints(inputArr);
	let adjustmentArr = Array(inputArr[0].length).fill(adjustmentStart);
	let errorHistory = [];

	//Regression
	for(var i = 0; i < iterations; i++) {
		let errorVal = evalError(inputArr, weights);
		let newWeights = gradientStep(weights, avg, errorVal, adjustmentArr);

		let newErrorVal = evalError(inputArr, newWeights);

		if(Math.abs(newErrorVal) > Math.abs(errorVal)) {
			//console.log("Adjusting learning rate down at " + i);
			adjustmentArr = adjustmentArr.map(val => adjustmentFunc(val));
			errorHistory.push(errorVal);
		} else {
			weights = newWeights;
			errorHistory.push(newErrorVal);
		}
	}

	return {
		weights,
		errorHistory,
		error: evalError(inputArr, weights),
	}
}