Skip to content
Snippets Groups Projects
Commit 466fadee authored by Jakhes's avatar Jakhes
Browse files

Adding SoftmaxRegression

parent d3ec8152
No related branches found
No related tags found
No related merge requests found
...@@ -14,6 +14,7 @@ all: ...@@ -14,6 +14,7 @@ all:
make -C src/methods/naive_bayes_classifier splfr=$(SPLFR_PATH) make -C src/methods/naive_bayes_classifier splfr=$(SPLFR_PATH)
make -C src/methods/perceptron splfr=$(SPLFR_PATH) make -C src/methods/perceptron splfr=$(SPLFR_PATH)
make -C src/methods/random_forest splfr=$(SPLFR_PATH) make -C src/methods/random_forest splfr=$(SPLFR_PATH)
make -C src/methods/softmac_regression splfr=$(SPLFR_PATH)
clean: clean:
make -C src/methods/ada_boost clean make -C src/methods/ada_boost clean
...@@ -28,3 +29,4 @@ clean: ...@@ -28,3 +29,4 @@ clean:
make -C src/methods/naive_bayes_classifier clean make -C src/methods/naive_bayes_classifier clean
make -C src/methods/perceptron clean make -C src/methods/perceptron clean
make -C src/methods/random_forest clean make -C src/methods/random_forest clean
make -C src/methods/softmac_regression clean
splfr=/usr/local/sicstus4.7.1/bin/splfr
METHOD_NAME=softmax_regression
$(METHOD_NAME).so: $(METHOD_NAME).pl $(METHOD_NAME).cpp
$(splfr) -larmadillo -fopenmp -lmlpack -lstdc++ -cxx --struct $(METHOD_NAME).pl $(METHOD_NAME).cpp ../../helper_files/helper.cpp
clean:
rm $(METHOD_NAME).so
#include <sicstus/sicstus.h>
/* ex_glue.h is generated by splfr from the foreign/[2,3] facts.
Always include the glue header in your foreign resource code.
*/
#include "softmax_regression_glue.h"
#include <mlpack/methods/softmax_regression/softmax_regression.hpp>
#include <mlpack/core.hpp>
// including helper functions for converting between arma structures and arrays
#include "../../helper_files/helper.hpp"
// some of the most used namespaces
using namespace arma;
using namespace mlpack;
using namespace std;
using namespace mlpack::regression;
// Global Variable of the SoftmaxRegression object so it can be accessed from all functions
SoftmaxRegression softmaxRegression;
// TODO:
// input: const size_t inputSize = 0,
// const size_t numClasses = 0,
// const bool fitIntercept = false//
// output:
// description:
void initModelNoTrain(SP_integer inputSize, SP_integer numClasses, SP_integer fitIntercept)
{
softmaxRegression = SoftmaxRegression(inputSize, numClasses, (fitIntercept == 1));
}
// TODO:
// input: const arma::mat & data,
// const arma::Row< size_t > & labels,
// const size_t numClasses,
// const double lambda = 0.0001,
// const bool fitIntercept = false,
// OptimizerType optimizer = OptimizerType()
// output:
// description:
void initModelWithTrain(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize, SP_integer numClasses, double lambda, SP_integer fitIntercept)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
// convert the Prolog arrays to arma::rowvec
Row< size_t > labelsVector = convertArrayToVec(labelsArr, labelsArrSize);
softmaxRegression = SoftmaxRegression(data, labelsVector, numClasses, lambda, (fitIntercept == 1));
}
// TODO:
// input: const VecType & point
//
// output: size_t predicted label of point
// description:
SP_integer classifyPoint(float *pointArr, SP_integer pointArrSize)
{
// convert the Prolog arrays to arma::rowvec
rowvec pointVector = convertArrayToRowvec(pointArr, pointArrSize);
return softmaxRegression.Classify(pointVector);
}
// TODO:
// input: const arma::mat & dataset,
// arma::Row< size_t > & labels <-,
// arma::mat & probabilities <-
// output:
// description:
void classifyMatrix(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float **labelsArr, SP_integer *labelsArrSize, float **probsMatArr, SP_integer *probsMatColNum, SP_integer *probsMatRowNum)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
// create the ReturnVector
Row< size_t > labelsReturnVector;
// create the ReturnMat
mat probsReturnMat;
softmaxRegression.Classify(data, labelsReturnVector, probsReturnMat);
// return the Vector lenght
*labelsArrSize = labelsReturnVector.n_elem;
// return the Vector as Array
*labelsArr = convertToArray(labelsReturnVector);
// return the Matrix dimensions
*probsMatColNum = probsReturnMat.n_cols;
*probsMatRowNum = probsReturnMat.n_rows;
// return the Matrix as one long Array
*probsMatArr = convertToArray(probsReturnMat);
}
// TODO:
// input: const arma::mat & testData,
// const arma::Row< size_t > & labels
//
// output: double accuracy
// description:
double computeAccuracy(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
// convert the Prolog arrays to arma::rowvec
Row< size_t > labelsVector = convertArrayToVec(labelsArr, labelsArrSize);
return softmaxRegression.ComputeAccuracy(data, labelsVector);
}
// TODO:
// input:
// output: size_t
// description:
SP_integer featureSize()
{
return softmaxRegression.FeatureSize();
}
// TODO:
// input:
// output: arma::mat&
// description:
void parameters(float **parametersMatArr, SP_integer *parametersMatColNum, SP_integer *parametersMatRowNum)
{
// create the ReturnMat
mat parametersReturnMat = softmaxRegression.Parameters();
// return the Matrix dimensions
*parametersMatColNum = parametersReturnMat.n_cols;
*parametersMatRowNum = parametersReturnMat.n_rows;
// return the Matrix as one long Array
*parametersMatArr = convertToArray(parametersReturnMat);
}
// TODO:
// input: const arma::mat & data,
// const arma::Row< size_t > & labels,
// const size_t numClasses,
// OptimizerType optimizer = OptimizerType()
//
// output: double objective value of final point
// description:
double train(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize, SP_integer numClasses)
{
// convert the Prolog arrays to arma::mat
mat data = convertArrayToMat(dataMatArr, dataMatSize, dataMatRowNum);
// convert the Prolog arrays to arma::rowvec
Row< size_t > labelsVector = convertArrayToVec(labelsArr, labelsArrSize);
return softmaxRegression.Train(data, labelsVector, numClasses);
}
:- module(softmax_regression, [ initModelNoTrain/3,
initModelWithTrain/8,
classifyPoint/3,
classifyMatrix/8,
computeAccuracy/6,
featureSize/1,
parameters/3,
train/7]).
%% 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--
%% int inputSize => 0,
%% int numClasses => 0,
%% bool fitIntercept => (1)true / (0)false
%%
%% --Output--
%%
%% --Description--
foreign(initModelNoTrain, c, initModelNoTrain(+integer, +integer, +integer)).
%% --Input--
%% mat data,
%% vec labels,
%% int numClasses,
%% float32 lambda => 0.0001,
%% bool fitIntercept => (1)true / (0)false
%%
%% --Output--
%%
%% --Description--
foreign(initModelWithTrain, c, initModelWithTrain(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +float32, +integer)).
%% --Input--
%% vec point
%%
%% --Output--
%% int predicted label
%%
%% --Description--
foreign(classifyPoint, c, classifyPoint(+pointer(float_array), +integer, [-integer])).
%% --Input--
%% mat data
%%
%% --Output--
%% vec predicted labels,
%% mat probabilities
%%
%% --Description--
foreign(classifyMatrix, c, classifyMatrix(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, -pointer(float_array), -integer, -integer)).
%% --Input--
%% mat data,
%% vec labels
%%
%% --Output--
%% float32 accuracy
%%
%% --Description--
foreign(computeAccuracy, c, computeAccuracy(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, [-float32])).
%% --Input--
%%
%% --Output--
%% int size of the features
%%
%% --Description--
foreign(featureSize, c, featureSize([-integer])).
%% --Input--
%%
%% --Output--
%% mat parameters
%%
%% --Description--
foreign(parameters, c, parameters(-pointer(float_array), -integer, -integer)).
%% --Input--
%% mat data,
%% vec labels,
%% int numClasses
%%
%% --Output--
%% float32 objective value of final point
%%
%% --Description--
foreign(train, c, train(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, [-float32])).
%% Defines the functions that get connected from main.cpp
foreign_resource(softmax_regression, [ initModelNoTrain,
initModelWithTrain,
classifyPoint,
classifyMatrix,
computeAccuracy,
featureSize,
parameters,
train]).
:- load_foreign_resource(softmax_regression).
\ No newline at end of file
:- use_module(library(plunit)).
:- use_module(softmax_regression).
:- use_module('../../helper_files/helper.pl').
reset_Model :-
initModel(1,0,50,0.0001).
:- begin_tests(lists).
%% alpha tests
test(alpha_std_init) :-
reset_Model,
alpha(0).
test(alpha_wrong_input, fail) :-
reset_Model,
alpha(1).
test(alpha_after_train, A =:= 9223372036854775808) :-
reset_Model,
convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize),
alpha(A).
%% train tests
test(correct_train) :-
reset_Model,
convert_list_to_float_array([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train, fail) :-
reset_Model,
convert_list_to_float_array([],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train2, fail) :-
reset_Model,
convert_list_to_float_array([],0, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train3, fail) :-
reset_Model,
convert_list_to_float_array([1,2],0, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train3, fail) :-
reset_Model,
convert_list_to_float_array([1,2,44,3],3, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
test(false_train4) :-
reset_Model,
convert_list_to_float_array([1,2,44,3],2, array(Xsize, Xrownum, X)),
convert_list_to_float_array([0.2,0.2,0.2,0.2], array(Ysize, Y)),
train(X,Xsize, Xrownum,Y, Ysize).
:- end_tests(lists).
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment