protected virtual double CalculateWeightUpdate( Matrix <double> matrixX, ILinearRegressionParams regressionParams, double diffSums, double currentWeightValue) { return(currentWeightValue - (((regressionParams.LearningRate * 1) / matrixX.RowCount) * diffSums)); }
public ILinearRegressionModel BuildModel(Matrix<double> matrixX, Vector<double> vectorY, ILinearRegressionParams linearRegressionParams) { var normalizationMatrix = Matrix<double>.Build.DenseIdentity(matrixX.ColumnCount, matrixX.ColumnCount) * regularizationConst; var xT = matrixX.Transpose(); var xTx = xT.Multiply(matrixX) + normalizationMatrix; var inversedXTX = xTx.Inverse(); var xTy = xT.Multiply(vectorY); return new LinearRegressionModel(inversedXTX.Multiply(xTy)); }
protected override double CalculateWeightUpdate( Matrix<double> matrixX, ILinearRegressionParams regressionParams, double diffSums, double currentWeightValue) { var update = base.CalculateWeightUpdate(matrixX, regressionParams, diffSums, currentWeightValue); var regularizationTerm = (regularizationConst / matrixX.RowCount) * currentWeightValue; return update - regularizationTerm; }
protected override double CalculateWeightUpdate( Matrix <double> matrixX, ILinearRegressionParams regressionParams, double diffSums, double currentWeightValue) { var update = base.CalculateWeightUpdate(matrixX, regressionParams, diffSums, currentWeightValue); var regularizationTerm = (regularizationConst / matrixX.RowCount) * currentWeightValue; return(update - regularizationTerm); }
public ILinearRegressionModel BuildModel(Matrix<double> matrixX, Vector<double> vectorY, ILinearRegressionParams regressionParams) { var weightsVector = Vector<double>.Build.DenseOfArray( Enumerable.Range(0, matrixX.ColumnCount) .Select(fIdx => randomizer.NextDoubleInRange(weightsMin, weightsMax)) .ToArray()); double previousIterError = double.PositiveInfinity; for (int iterNo = 0; iterNo < iterations; iterNo++) { var vectorYHat = matrixX.Multiply(weightsVector); var diffVector = vectorYHat.Subtract(vectorY); var currentIterError = diffVector.Select(Math.Abs).Sum(); if ((currentIterError <= stopLerningError) || currentIterError.AlmostEqual(previousIterError, 5)) { break; } for (int weightIdx = 0; weightIdx < weightsVector.Count; weightIdx++) { var diffSums = 0.0; for (int rowIdx = 0; rowIdx < matrixX.RowCount; rowIdx++) { diffSums += diffVector[rowIdx] * matrixX.Row(rowIdx)[weightIdx]; } var newWeightValue = CalculateWeightUpdate( matrixX, regressionParams, diffSums, weightsVector[weightIdx]); weightsVector[weightIdx] = newWeightValue; } previousIterError = currentIterError; } return new LinearRegressionModel(weightsVector); }
public RegressionAndModelDecisionTreeLeafBuilder(ILinearRegressionModelBuilder modelBuilder, double learningRate = 0.05) { regressionModelBuilder = modelBuilder; regressionParams = new LinearRegressionParams(learningRate); }
public ILinearRegressionModel BuildModel(Matrix <double> matrixX, Vector <double> vectorY, ILinearRegressionParams regressionParams) { var weightsVector = Vector <double> .Build.DenseOfArray( Enumerable.Range(0, matrixX.ColumnCount) .Select(fIdx => randomizer.NextDoubleInRange(weightsMin, weightsMax)) .ToArray()); double previousIterError = double.PositiveInfinity; for (int iterNo = 0; iterNo < iterations; iterNo++) { var vectorYHat = matrixX.Multiply(weightsVector); var diffVector = vectorYHat.Subtract(vectorY); var currentIterError = diffVector.Select(Math.Abs).Sum(); if ((currentIterError <= stopLerningError) || currentIterError.AlmostEqual(previousIterError, 5)) { break; } for (int weightIdx = 0; weightIdx < weightsVector.Count; weightIdx++) { var diffSums = 0.0; for (int rowIdx = 0; rowIdx < matrixX.RowCount; rowIdx++) { diffSums += diffVector[rowIdx] * matrixX.Row(rowIdx)[weightIdx]; } var newWeightValue = CalculateWeightUpdate( matrixX, regressionParams, diffSums, weightsVector[weightIdx]); weightsVector[weightIdx] = newWeightValue; } previousIterError = currentIterError; } return(new LinearRegressionModel(weightsVector)); }
protected virtual double CalculateWeightUpdate( Matrix<double> matrixX, ILinearRegressionParams regressionParams, double diffSums, double currentWeightValue) { return currentWeightValue - (((regressionParams.LearningRate * 1) / matrixX.RowCount) * diffSums); }
public ILinearRegressionModel BuildModel(Matrix <double> matrixX, Vector <double> vectorY, ILinearRegressionParams linearRegressionParams) { var normalizationMatrix = Matrix <double> .Build.DenseIdentity(matrixX.ColumnCount, matrixX.ColumnCount) * regularizationConst; var xT = matrixX.Transpose(); var xTx = xT.Multiply(matrixX) + normalizationMatrix; var inversedXTX = xTx.Inverse(); var xTy = xT.Multiply(vectorY); return(new LinearRegressionModel(inversedXTX.Multiply(xTy))); }