Skip to content
Snippets Groups Projects
Commit 764a137f authored by Jakhes's avatar Jakhes
Browse files

Adding Random_Forest

parent cce258f6
Branches
No related tags found
No related merge requests found
......@@ -13,6 +13,7 @@ all:
make -C src/methods/mean_shift 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/random_forest splfr=$(SPLFR_PATH)
clean:
make -C src/methods/ada_boost clean
......@@ -26,3 +27,4 @@ clean:
make -C src/methods/mean_shift clean
make -C src/methods/naive_bayes_classifier clean
make -C src/methods/perceptron clean
make -C src/methods/random_forest clean
splfr=/usr/local/sicstus4.7.1/bin/splfr
METHOD_NAME=random_forest
$(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 "random_forest_glue.h"
#include <mlpack/methods/random_forest/random_forest.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::tree;
// Global Variable of the RandomForest object so it can be accessed from all functions
RandomForest randomForest;
// TODO:
// input:
// output:
// description:
void initModelNoTrain(SP_integer)
{
randomForest = RandomForest();
}
// TODO:
// input: const MatType & dataset,
// const arma::Row< size_t > & labels,
// const size_t numClasses,
// const size_t numTrees = 20,
// const size_t minimumLeafSize = 1,
// const double minimumGainSplit = 1e-7,
// const size_t maximumDepth = 0,
// DimensionSelectionType dimensionSelector = DimensionSelectionType()
// output:
// description:
void initModelWithTrainNoWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize,
SP_integer numClasses, SP_integer numTrees, SP_integer minimumLeafSize, double minimumGainSplit, SP_integer maximumDepth)
{
// 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);
randomForest = RandomForest(data, labelsVector, numClasses, numTrees, minimumLeafSize, minimumGainSplit, maximumDepth);
}
// TODO:
// input: onst MatType & dataset,
// const arma::Row< size_t > & labels,
// const size_t numClasses,
// const arma::rowvec & weights,
// const size_t numTrees = 20,
// const size_t minimumLeafSize = 1,
// const double minimumGainSplit = 1e-7,
// const size_t maximumDepth = 0,
// DimensionSelectionType dimensionSelector = DimensionSelectionType()
// output:
// description:
void initModelWithTrainWithWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize, SP_integer numClasses,
float *weightsArr, SP_integer weightsArrSize, SP_integer numTrees, SP_integer minimumLeafSize, double minimumGainSplit, SP_integer maximumDepth)
{
// 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);
// convert the Prolog arrays to arma::rowvec
rowvec weightsVector = convertArrayToRowvec(weightsArr, weightsArrSize);
randomForest = RandomForest(data, labelsVector, numClasses, weightsVector, numTrees, minimumLeafSize, minimumGainSplit, maximumDepth);
}
// TODO:
// input: const VecType & point,
// size_t & prediction <-,
// arma::vec & probabilities <-
// output:
// description:
void classifyPoint(float *pointArr, SP_integer pointArrSize, SP_integer *prediction, float **probsArr, SP_integer *probsArrSize)
{
// convert the Prolog arrays to arma::rowvec
rowvec pointVector = convertArrayToRowvec(pointArr, pointArrSize);
// create the ReturnVector
vec probsReturnVector;
size_t predicReturn;
randomForest.Classify(pointVector, predicReturn, probsReturnVector);
// return the predic value
*prediction = predicReturn;
// return the Vector lenght
*probsArrSize = probsReturnVector.n_elem;
// return the Vector as Array
*probsArr = convertToArray(probsReturnVector);
}
// TODO:
// input: const MatType & data,
// arma::Row< size_t > & predictions <-,
// arma::mat & probabilities <-
// output:
// description:
void classifyMatrix(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float **predicArr, SP_integer *predicArrSize, 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 > predicReturnVector;
// create the ReturnMat
mat probsReturnMat;
randomForest.Classify(data, predicReturnVector, probsReturnMat);
// return the Vector lenght
*predicArrSize = predicReturnVector.n_elem;
// return the Vector as Array
*predicArr = convertToArray(predicReturnVector);
// return the Matrix dimensions
*probsMatColNum = probsReturnMat.n_cols;
*probsMatRowNum = probsReturnMat.n_rows;
// return the Matrix as one long Array
*probsMatArr = convertToArray(probsReturnMat);
}
// TODO:
// input:
// output: const size_t number of trees
// description:
SP_integer numTrees()
{
return randomForest.NumTrees();
}
// TODO: doesnt accept warmStart parameter
//
// input: const MatType & data,
// const arma::Row< size_t > & labels,
// const size_t numClasses,
// const size_t numTrees = 20,
// const size_t minimumLeafSize = 1,
// const double minimumGainSplit = 1e-7,
// const size_t maximumDepth = 0,
// const bool warmStart = false,
// DimensionSelectionType dimensionSelector = DimensionSelectionType()
//
// output: double average entropy of all trees trained
// description:
double trainNoWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize,
SP_integer numClasses, SP_integer numTrees, SP_integer minimumLeafSize, double minimumGainSplit, SP_integer maximumDepth)
{
// 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 randomForest.Train(data, labelsVector, numClasses, numTrees, minimumLeafSize, minimumGainSplit, maximumDepth);
}
// TODO: doesnt accept warmStart parameter
//
// input: const MatType & data,
// const arma::Row< size_t > & labels,
// const size_t numClasses,
// const arma::rowvec & weights,
// const size_t numTrees = 20,
// const size_t minimumLeafSize = 1,
// const double minimumGainSplit = 1e-7,
// const size_t maximumDepth = 0,
// const bool warmStart = false,
// DimensionSelectionType dimensionSelector = DimensionSelectionType()
//
// output: double average entropy of all trees trained
// description:
double trainWithWeights(float *dataMatArr, SP_integer dataMatSize, SP_integer dataMatRowNum, float *labelsArr, SP_integer labelsArrSize, SP_integer numClasses,
float *weightsArr, SP_integer weightsArrSize, SP_integer numTrees, SP_integer minimumLeafSize, double minimumGainSplit, SP_integer maximumDepth)
{
// 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);
// convert the Prolog arrays to arma::rowvec
rowvec weightsVector = convertArrayToRowvec(weightsArr, weightsArrSize);
return randomForest.Train(data, labelsVector, numClasses, weightsVector, numTrees, minimumLeafSize, minimumGainSplit, maximumDepth);
}
:- module(random_forest, [ initModelNoTrain/1,
initModelWithTrainNoWeights/10,
initModelWithTrainWithWeights/12,
classifyPoint/5,
classifyMatrix/8,
numTrees/1,
trainNoWeights/11,
trainWithWeights/13]).
%% 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
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(initModelNoTrain, c, initModelNoTrain(+integer)).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(initModelWithTrainNoWeights, c, initModelWithTrainNoWeights(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +integer, +integer, +float32, +integer)).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(initModelWithTrainWithWeights, c, initModelWithTrainWithWeights(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer , +integer, +float32, +integer)).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(classifyPoint, c, classifyPoint(+pointer(float_array), +integer, -integer, -pointer(float_array), -integer)).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(classifyMatrix, c, classifyMatrix(+pointer(float_array), +integer, +integer, -pointer(float_array), -integer, -pointer(float_array), -integer, -integer)).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(numTrees, c, numTrees([-integer])).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(trainNoWeights, c, trainNoWeights(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +integer, +integer, +float32, +integer, [-float32])).
%% TODO:
%% --Input--
%%
%% --Output--
%%
%% --Description--
foreign(trainWithWeights, c, trainWithWeights(+pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +pointer(float_array), +integer, +integer, +integer, +float32, +integer, [-float32])).
%% Defines the functions that get connected from main.cpp
foreign_resource(random_forest, [ initModelNoTrain,
initModelWithTrainNoWeights,
initModelWithTrainWithWeights,
classifyPoint,
classifyMatrix,
numTrees,
trainNoWeights,
trainWithWeights]).
:- load_foreign_resource(random_forest).
\ No newline at end of file
:- use_module(library(plunit)).
:- use_module(random_forest).
:- 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