Select Git revision
logistic_regression.pl
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
logistic_regression.pl 7.27 KiB
:- module(logistic_regression, [ logistic_regression_initModelNoOptimizer/4,
logistic_regression_initModelWithOptimizer/5,
logistic_regression_classifyPoint/3,
logistic_regression_classifyMatrix/6,
logistic_regression_computeAccuracy/5,
logistic_regression_computeError/4,
logistic_regression_train/4]).
%% requirements of library(struct)
:- load_files(library(str_decl),
[when(compile_time), if(changed)]).
%% needed for using the array type
:- use_module(library(structs)).
:- use_module('../../helper_files/helper.pl').
%% type definitions for the float array
:- foreign_type
float32 = float_32,
float_array = array(float32).
%% definitions for the connected function
%% --Input--
%% mat data,
%% vec responses,
%% float32 lambda => 0.0
%%
%% --Output--
%%
%% --Description--
%% Initialize the logistic_regression model without specifing a optimizer.
%%
logistic_regression_initModelNoOptimizer(DataList, DataRows, ResponsesList, Lambda) :-
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
initModelNoOptimizerI(X, Xsize, Xrownum, Y, Ysize, Lambda).
foreign(initModelNoOptimizer, c, initModelNoOptimizerI( +pointer(float_array), +integer, +integer,
+pointer(float_array), +integer,
+float32)).
%% --Input--
%% mat data,
%% vec responses,
%% string optimizer => "lbfgs", "psgd" => lbfgs,
%% float32 lambda => 0.0
%%
%% --Output--
%%
%% --Description--
%% Initialize the logistic_regression model and specify the optimizer.
%%
logistic_regression_initModelWithOptimizer(DataList, DataRows, ResponsesList, Responses, Lambda) :-
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
initModelWithOptimizerI(X, Xsize, Xrownum, Y, Ysize, Responses, Lambda).
foreign(initModelWithOptimizer, c, initModelWithOptimizerI( +pointer(float_array), +integer, +integer,
+pointer(float_array), +integer,
+string,
+float32)).
%% --Input--
%% vec point,
%% float32 decisionBoundary => 0.5
%%
%% --Output--
%% int predicLabel
%%
%% --Description--
%% Classify the given point.
%%
logistic_regression_classifyPoint(PointList, DecisionBoundary, PredicLabel) :-
convert_list_to_float_array(PointList, array(Xsize, X)),
classifyPointI(X, Xsize, DecisionBoundary, PredicLabel).
foreign(classifyPoint, c, classifyPointI( +pointer(float_array), +integer,
+float32,
[-integer])).
%% --Input--
%% mat data,
%% float32 decisionBoundary => 0.5
%%
%% --Output--
%% vec predicLabels
%% mat probabilities
%%
%% --Description--
%% Classify the given points, returning the predicted labels for each point.
%%
logistic_regression_classifyMatrix(DataList, DataRows, PredictionList, ProbsList, ZCols, DecisionBoundary) :-
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrows, X)),
classifyMatrixI(X, Xsize, Xrows, Y, Ysize, Z, ZCols, ZRows, DecisionBoundary),
convert_float_array_to_list(Y, Ysize, PredictionList),
convert_float_array_to_2d_list(Z, ZCols, ZRows, ProbsList).
foreign(classifyMatrix, c, classifyMatrixI( +pointer(float_array), +integer, +integer,
-pointer(float_array), -integer,
-pointer(float_array), -integer, -integer,
+float32)).
%% --Input--
%% mat data,
%% vec responses,
%% float32 decisionBoundary => 0.5
%%
%% --Output--
%% float32 accuracy
%%
%% --Description--
%% Compute the accuracy of the model on the given predictors and responses, using the given decision boundary.
%%
logistic_regression_computeAccuracy(DataList, DataRows, ResponsesList, DecisionBoundary, Accuracy) :-
convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)),
convert_list_to_float_array(ResponsesList, array(Ysize, Y)),
computeAccuracyI(X, Xsize, Xrownum, Y, Ysize, DecisionBoundary, Accuracy).
foreign(computeAccuracy, c, computeAccuracyI( +pointer(float_array), +integer, +integer,
+pointer(float_array), +integer,
+float32,
[-float32])).
%% --Input--
%% mat data,
%% vec responses,
%%
%% --Output--
%% float32 error
%%
%% --Description--
%% Compute the error of the model.
%%
logistic_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(computeError, c, computeErrorI( +pointer(float_array), +integer, +integer,
+pointer(float_array), +integer,
[-float32])).
%% --Input--
%% mat data,
%% vec responses,
%% string optimizer => "lbfgs", "psgd" => lbfgs
%%
%% --Output--
%%
%% --Description--
%% Train the logistic_regression model on the given input data.
%%
logistic_regression_train(DataList, DataRows, ResponsesList, Optimizer) :-
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, Optimizer).
foreign(train, c, trainI( +pointer(float_array), +integer, +integer,
+pointer(float_array), +integer,
+string)).
%% Defines the functions that get connected from main.cpp
foreign_resource(logistic_regression, [ initModelNoOptimizer,
initModelWithOptimizer,
classifyPoint,
classifyMatrix,
computeAccuracy,
computeError,
train]).
:- load_foreign_resource(logistic_regression).