Skip to content
Snippets Groups Projects
Select Git revision
  • 194e8e1c693e2a82497e54c250ebc446239a022f
  • main default protected
2 results

logistic_regression.pl

Blame
  • user avatar
    Jakhes authored
    194e8e1c
    History
    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).