... | ... | @@ -2,31 +2,47 @@ |
|
|
|
|
|
An implementation of simple linear regression and ridge regression using ordinary least squares.
|
|
|
|
|
|
```prolog
|
|
|
:- use_module('path/to/.../src/methods/linear_regression/linear_regression.pl').
|
|
|
|
|
|
%% usage example
|
|
|
TrainData = [5.1,3.5,1.4, 4.9,3.0,1.4, 4.7,3.2,1.3, 4.6,3.1,1.5],
|
|
|
TestData = [3,2,0, 5,1,4, 0,0,4, 3,3,5, 0,5,5, 2,5,5],
|
|
|
linear_regression_initModel(TrainData, 3, [0,1,0,1], 0.0, 1),
|
|
|
linear_regression_predict(TestData, 3, Responses).
|
|
|
```
|
|
|
|
|
|
# Available Predicates
|
|
|
|
|
|
* [initModel/7](/PrologMethods/Regression/linear_regression#initmodel7)
|
|
|
* [initModelWithWeights/9](/PrologMethods/Regression/linear_regression#initmodelwithweights9)
|
|
|
* [computeError/6](/PrologMethods/Regression/linear_regression#computeerror6)
|
|
|
* [parameters/2](/PrologMethods/Regression/linear_regression#parameters2)
|
|
|
* [modifyParameters/2](/PrologMethods/Regression/linear_regression#modifyparameters2)
|
|
|
* [predict/5](/PrologMethods/Regression/linear_regression#predict5)
|
|
|
* [train/7](/PrologMethods/Regression/linear_regression#train7)
|
|
|
* [trainWithWeights/9](/PrologMethods/Regression/linear_regression#trainwithweights9)
|
|
|
* [linear_regression_initModel/5](/PrologMethods/Regression/linear_regression#linear_regression_initmodel5)
|
|
|
* [linear_regression_initModelWithWeights/6](/PrologMethods/Regression/linear_regression#linear_regression_initmodelwithweights6)
|
|
|
* [linear_regression_computeError/4](/PrologMethods/Regression/linear_regression#linear_regression_computeerror4)
|
|
|
* [linear_regression_parameters/1](/PrologMethods/Regression/linear_regression#linear_regression_parameters1)
|
|
|
* [linear_regression_modifyParameters/1](/PrologMethods/Regression/linear_regression#linear_regression_modifyparameters1)
|
|
|
* [linear_regression_predict/3](/PrologMethods/Regression/linear_regression#linear_regression_predict3)
|
|
|
* [linear_regression_train/5](/PrologMethods/Regression/linear_regression#linear_regression_train5)
|
|
|
* [linear_regression_trainWithWeights/6](/PrologMethods/Regression/linear_regression#linear_regression_trainwithweights6)
|
|
|
|
|
|
---
|
|
|
|
|
|
[links/resources](/PrologMethods/Regression/linear_regression#connected-linksresources)
|
|
|
|
|
|
## **_initModel/7_**
|
|
|
## **_linear_regression_initModel/5_**
|
|
|
|
|
|
Initializes the linear_regression model and trains it but doesnt include weights.
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
initModel( +pointer(float_array), +integer, +integer,
|
|
|
%% predicate definition
|
|
|
linear_regression_initModel(DataList, DataRows, ResponsesList, Lambda, Intercept) :-
|
|
|
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
|
|
|
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
|
|
|
initModelI(X, Xsize, Xrownum, Y, Ysize, Lambda, Intercept).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(initModel, c, initModelI( +pointer(float_array), +integer, +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
+float32,
|
|
|
+integer).
|
|
|
+integer)).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -39,17 +55,24 @@ initModel( +pointer(float_array), +integer, +integer, |
|
|
|
|
|
---
|
|
|
|
|
|
## **_initModelWithWeights/9_**
|
|
|
## **_linear_regression_initModelWithWeights/6_**
|
|
|
|
|
|
Initializes the linear_regression model, trains it and adds weights to it.
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
initModelWithWeights( +pointer(float_array), +integer, +integer,
|
|
|
%% predicate definition
|
|
|
linear_regression_initModelWithWeights(DataList, DataRows, ResponsesList, WeightsList, Lambda, Intercept) :-
|
|
|
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
|
|
|
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
|
|
|
convert_list_to_float_array(WeightsList, array(Zsize, Z)),
|
|
|
initModelWithWeightsI(X, Xsize, Xrownum, Y, Ysize, Z, Zsize, Lambda, Intercept).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(initModelWithWeights, c, initModelWithWeightsI( +pointer(float_array), +integer, +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
+float32,
|
|
|
+integer).
|
|
|
+integer)).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -63,15 +86,21 @@ initModelWithWeights( +pointer(float_array), +integer, +integer, |
|
|
|
|
|
---
|
|
|
|
|
|
## **_computeError/6_**
|
|
|
## **_linear_regression_computeError/4_**
|
|
|
|
|
|
Calculate the L2 squared error on the given predictors and responses using this linear regression model.
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
computeError( +pointer(float_array), +integer, +integer,
|
|
|
%% predicate definition
|
|
|
linear_regression_computeError(DataList, DataRows, ResponsesList, Error) :-
|
|
|
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
|
|
|
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
|
|
|
computeErrorI(X, Xsize, Xrownum, Y, Ysize, Error).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(computeError, c, computeErrorI( +pointer(float_array), +integer, +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
[-float32]).
|
|
|
[-float32])).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -83,13 +112,18 @@ computeError( +pointer(float_array), +integer, +integer, |
|
|
|
|
|
---
|
|
|
|
|
|
## **_parameters/2_**
|
|
|
## **_linear_regression_parameters/1_**
|
|
|
|
|
|
Get the parameters (the b vector).
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
parameters(-pointer(float_array), -integer).
|
|
|
%% predicate definition
|
|
|
linear_regression_parameters(ParametersList) :-
|
|
|
parametersI(Y, Ysize),
|
|
|
convert_float_array_to_list(Y, Ysize, ParametersList).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(parameters, c, parametersI(-pointer(float_array), -integer)).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -99,13 +133,18 @@ parameters(-pointer(float_array), -integer). |
|
|
|
|
|
---
|
|
|
|
|
|
## **_modifyParameters/2_**
|
|
|
## **_linear_regression_modifyParameters/1_**
|
|
|
|
|
|
Modify the parameters (the b vector).
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
modifyParameters(+pointer(float_array), +integer).
|
|
|
%% predicate definition
|
|
|
linear_regression_modifyParameters(ParameterList) :-
|
|
|
convert_list_to_float_array(ParameterList, array(Ysize, Y)),
|
|
|
modifyParametersI(Y, Ysize).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(modifyParameters, c, modifyParametersI(+pointer(float_array), +integer)).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -115,14 +154,20 @@ modifyParameters(+pointer(float_array), +integer). |
|
|
|
|
|
---
|
|
|
|
|
|
## **_predict/5_**
|
|
|
## **_linear_regression_predict/3_**
|
|
|
|
|
|
Calculate y_i for each data point in points.
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
predict( +pointer(float_array), +integer, +integer,
|
|
|
-pointer(float_array), -integer).
|
|
|
%% predicate definition
|
|
|
linear_regression_predict(PointsList, PointsRows, PredicList) :-
|
|
|
convert_list_to_float_array(PointsList, PointsRows, array(Xsize, Xrownum, X)),
|
|
|
predictI(X, Xsize, Xrownum, Y, Ysize),
|
|
|
convert_float_array_to_list(Y, Ysize, PredicList).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(predict, c, predictI( +pointer(float_array), +integer, +integer,
|
|
|
-pointer(float_array), -integer)).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -133,18 +178,24 @@ predict( +pointer(float_array), +integer, +integer, |
|
|
|
|
|
---
|
|
|
|
|
|
## **_train/7_**
|
|
|
## **_linear_regression_train/5_**
|
|
|
|
|
|
Train the linear_regression model on the given data.
|
|
|
|
|
|
Careful! This will completely ignore and overwrite the existing model. This particular implementation does not have an incremental training algorithm.
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
train( +pointer(float_array), +integer, +integer,
|
|
|
%% predicate definition
|
|
|
linear_regression_train(DataList, DataRows, ResponsesList, Intercept, Error) :-
|
|
|
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
|
|
|
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
|
|
|
trainI(X, Xsize, Xrownum, Y, Ysize, Intercept, Error).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(train, c, trainI( +pointer(float_array), +integer, +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
+integer,
|
|
|
[-float32]).
|
|
|
[-float32])).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -157,19 +208,26 @@ train( +pointer(float_array), +integer, +integer, |
|
|
|
|
|
---
|
|
|
|
|
|
## **_trainWithWeights/9_**
|
|
|
## **_linear_regression_trainWithWeights/6_**
|
|
|
|
|
|
Train the linear_regression model on the given data and weights.
|
|
|
|
|
|
Careful! This will completely ignore and overwrite the existing model. This particular implementation does not have an incremental training algorithm.
|
|
|
|
|
|
```prolog
|
|
|
%% part of the predicate definition
|
|
|
trainWithWeights( +pointer(float_array), +integer, +integer,
|
|
|
%% predicate definition
|
|
|
linear_regression_trainWithWeights(DataList, DataRows, ResponsesList, WeightsList, Intercept, Error) :-
|
|
|
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
|
|
|
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
|
|
|
convert_list_to_float_array(WeightsList, array(Zsize, Z)),
|
|
|
trainWithWeightsI(X, Xsize, Xrownum, Y, Ysize, Z, Zsize, Intercept, Error).
|
|
|
|
|
|
%% foreign c++ predicate definition
|
|
|
foreign(trainWithWeights, c, trainWithWeightsI( +pointer(float_array), +integer, +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
+pointer(float_array), +integer,
|
|
|
+integer,
|
|
|
[-float32]).
|
|
|
[-float32])).
|
|
|
```
|
|
|
|
|
|
### Parameters
|
... | ... | @@ -187,8 +245,8 @@ trainWithWeights( +pointer(float_array), +integer, +integer, |
|
|
|
|
|
If you want a more detailed explanation, then go to the python documentation. There is most of the time a good explanation on how the methods work and what the parameters do.
|
|
|
|
|
|
* [**MLpack::linear_regression_C++\_documentation**](https://www.mlpack.org/doc/stable/doxygen/classmlpack_1_1regression_1_1LinearRegression.html)
|
|
|
* [**MLpack::linear_regression_Python_documentation**](https://www.mlpack.org/doc/stable/python_documentation.html#linear_regression)
|
|
|
* [**MLpack::linear_regression_C++\_documentation**](https://www.mlpack.org/doc/mlpack-3.4.2/doxygen/classmlpack_1_1regression_1_1LinearRegression.html)
|
|
|
* [**MLpack::linear_regression_Python_documentation**](https://www.mlpack.org/doc/mlpack-3.4.2/python_documentation.html#linear_regression)
|
|
|
|
|
|
added some of the links from the python documentation
|
|
|
|
... | ... | |