diff --git a/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl b/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl index da5521a7752cec06407031697619e9527dcf14da..898624de6e4b93cecc2587118f378d89772b58e3 100644 --- a/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl +++ b/src/methods/naive_bayes_classifier/naive_bayes_classifier.pl @@ -61,6 +61,8 @@ foreign(initModelWithTrain, c, initModelWithTrainI( +pointer(float_array), + %% All of the parameters of the model will be initialized to zero. Be sure to use train before calling classify, otherwise the results may be meaningless. %% initModelNoTrain(NumClasses, IncrementalVar, Epsilon) :- + NumClasses >= 0, + Epsilon >= 0, initModelNoTrainI(NumClasses, IncrementalVar, Epsilon). foreign(initModelNoTrain, c, initModelNoTrainI( +integer, @@ -146,6 +148,7 @@ foreign(probabilities, c, probabilitiesI(-pointer(float_array), -integer, -integ %% Train the Naive Bayes classifier on the given dataset. The data must be the same dimensionality as the existing model parameters. %% trainMatrix(DataList, DataRows, LabelsList, NumClasses, IncrementalVar) :- + NumClasses >= 0, convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrownum, X)), convert_list_to_float_array(LabelsList, array(Ysize, Y)), trainMatrixI(X, Xsize, Xrownum, Y, Ysize, NumClasses, IncrementalVar). diff --git a/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl b/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl index 351e70fd02fbc08ce40d6b68a98651cfdc955152..ca08ac2f06b25802cc36ef44b02cb4083bc2517f 100644 --- a/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl +++ b/src/methods/naive_bayes_classifier/naive_bayes_classifier_test.pl @@ -6,38 +6,258 @@ :- use_module(naive_bayes_classifier). :- use_module('../../helper_files/helper.pl'). -reset_Model :- - initModel(1,0,50,0.0001). +reset_Model_NoTrain :- + initModelNoTrain(2, 0, 0.000001). + +reset_Model_WithTrain :- + initModelWithTrain([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, [0,1,0,1], 2, 0, 0.000001). %% -%% TESTING predicate predicate/10 +%% TESTING predicate initModelNoTrain/3 %% -:- begin_tests(predicate). +:- begin_tests(initModelNoTrain). %% Failure Tests -test(testDescription, [error(domain_error('expectation' , culprit), _)]) :- - reset_Model_No_Train(perceptron), - train([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, [0,0,0,0], 2, culprit, 50, 0.0001, _). +test(nbc_InitModelNoTrain_Negative_NumClasses, fail) :- + initModelNoTrain(-2, 0, 0.000001). -test(testDescription2, [error(_,system_error('The values of the Label have to start at 0 and be >= 0 and < the given numClass!'))]) :- - reset_Model_No_Train(perceptron), - train([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, [0,1,0,2], 2, perceptron, 50, 0.0001, _). +test(nbc_InitModelNoTrain_Negative_Epsilon, fail) :- + initModelNoTrain(2, 0, -0.0001). %% Successful Tests -test(testDescription3, [true(Error =:= 1)]) :- - reset_Model_No_Train(perceptron), - train([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, [0,0,0,0], 2, perceptron, 50, 0.0001, Error). +test(nbc_InitModelNoTrain_Normal_Use) :- + initModelNoTrain(2, 0, 0.000001). + +:- end_tests(initModelNoTrain). + + + +%% +%% TESTING predicate initModelWithTrain/6 +%% +:- begin_tests(initModelWithTrain). + +%% Failure Tests + +test(nbc_InitModelWithTrain_Negative_NumClasses, fail) :- + initModelWithTrain([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, [0,1,0,1], -2, 0, 0.000001). + +test(nbc_InitModelWithTrain_Negative_Epsilon, fail) :- + initModelWithTrain([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, [0,1,0,1], 2, 0, -0.000001). -test(testDescription4, [true(Error =:= 0.9797958971132711)]) :- - reset_Model_No_Train(perceptron), +test(nbc_InitModelWithTrain_Too_Short_Label, [error(_,system_error('Error'))]) :- + initModelWithTrain([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, [0,1], 2, 0, 0.000001). + +test(nbc_InitModelWithTrain_Too_Long_Label, [error(_,system_error('Error'))]) :- + initModelWithTrain([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, [0,1,0,1,0,1], 2, 0, 0.000001). + +test(nbc_InitModelWithTrain_Too_Many_Label_Classes, [error(_,system_error('Error'))]) :- + initModelWithTrain([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, [0,1,2,3], 2, 0, 0.000001). + + +%% Successful Tests + +test(nbc_InitModelWithTrain_Normal_Use) :- + initModelWithTrain([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, [0,1,0,1], 2, 0, 0.000001). + +test(nbc_InitModelWithTrain_CSV_Input) :- open('src/data_csv/iris2.csv', read, File), take_csv_row(File, skipFirstRow,10, Data), - train(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, perceptron, 50, 0.0001, Error). + initModelWithTrain(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, 1, 0.0042). + +:- end_tests(initModelWithTrain). + + + +%% +%% TESTING predicate classifyMatrix/10 +%% +:- begin_tests(classifyMatrix). + +%% Failure Tests + +test(nbc_ClassifyMatrix_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + initModelWithTrain([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, _, _, _). + +test(nbc_ClassifyMatrix_Diffrent_Dims_To_Train, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + initModelWithTrain([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 4, _, _, _). + + +%% Successful Tests + +test(nbc_ClassifyMatrix_Normal_Use) :- + reset_Model_WithTrain, + initModelWithTrain([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, PredictionList, _, ProbabilitiesList), + print('\nPredictions: '), + print(PredictionList), + print('\nProbabilities: '), + print(ProbabilitiesList). + +test(nbc_ClassifyMatrix_CSV_Input) :- + reset_Model_WithTrain, + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,10, Data), + initModelWithTrain(Data, 4, PredictionList, _, ProbabilitiesList), + print('\nPredictions: '), + print(PredictionList), + print('\nProbabilities: '), + print(ProbabilitiesList). + +:- end_tests(classifyMatrix). + + + +%% +%% TESTING predicate means/10 +%% +:- begin_tests(means). + +%% Failure Tests +test(nbc_Means_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + means(MeansList, _), + print('\nMeans: '), + print(MeansList). + + +%% Successful Tests + +test(nbc_Means_Normal_Use) :- + reset_Model_WithTrain, + means(MeansList, _), + print('\nMeans: '), + print(MeansList). + +:- end_tests(means). + + + +%% +%% TESTING predicate probabilities/10 +%% +:- begin_tests(probabilities). + +%% Failure Tests +test(nbc_Probabilities_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + probabilities(ProbabilitiesList, _), + print('\nProbabilities: '), + print(ProbabilitiesList). + + +%% Successful Tests + +test(nbc_Probabilities_Normal_Use) :- + reset_Model_WithTrain, + probabilities(ProbabilitiesList, _), + print('\nProbabilities: '), + print(ProbabilitiesList). + +:- end_tests(probabilities). + + + +%% +%% TESTING predicate trainMatrix/5 +%% +:- begin_tests(trainMatrix). + +%% Failure Tests + +test(nbc_TrainMatrix_Negative_NumClasses, fail) :- + reset_Model_NoTrain, + train([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, [0,1,0,1], -2, 0). + +test(nbc_TrainMatrix_Too_Short_Label, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + train([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, [0,1], 2, 0). + +test(nbc_TrainMatrix_Too_Long_Label, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + train([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, [0,1,0,1,0,1], 2, 0). + +test(nbc_TrainMatrix_Too_Many_Label_Classes, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + train([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, [0,1,2,3], 2, 0). + + +%% Successful Tests + +test(nbc_TrainMatrix_Normal_Use) :- + reset_Model_NoTrain, + train([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, [0,1,0,1], 2, 0). + +test(nbc_TrainMatrix_After_InitTrain) :- + reset_Model_WithTrain, + train([5.1,3.5,1.4,4.9,3.0,1.4,4.7,3.2,1.3,4.6,3.1,1.5], 4, [0,1,0], 2, 0). + +test(nbc_TrainMatrix_CSV_Input) :- + reset_Model_NoTrain, + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,10, Data), + train(Data, 4, [0,1,0,1,1,0,1,1,1,0], 2, 0). + +:- end_tests(trainMatrix). + + + +%% +%% TESTING predicate trainPoint/5 +%% +:- begin_tests(trainPoint). + +%% Failure Tests + +test(nbc_TrainPoint_Bad_Label, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + train([5.1,3.5,1.4], -5). + +test(nbc_TrainPoint_Too_Long_Point, [error(_,system_error('Error'))]) :- + reset_Model_WithTrain, + train([5.1,3.5,1.4,3.5], 0). + + +%% Successful Tests + +test(nbc_TrainPoint_Normal_Use) :- + reset_Model_NoTrain, + train([5.1,3.5,1.4], 0). + +test(nbc_TrainPoint_After_InitTrain) :- + reset_Model_WithTrain, + train([5.1,3.5,1.4], 1). + +:- end_tests(trainPoint). + + + +%% +%% TESTING predicate variances/10 +%% +:- begin_tests(variances). + +%% Failure Tests +test(nbc_Variances_Before_Train, [error(_,system_error('Error'))]) :- + reset_Model_NoTrain, + variances(VariancesList, _), + print('\nVariances: '), + print(VariancesList). + + +%% Successful Tests + +test(nbc_Variances_Normal_Use) :- + reset_Model_WithTrain, + variances(VariancesList, _), + print('\nVariances: '), + print(VariancesList). -:- end_tests(predicate). +:- end_tests(variances). run_naive_bayes_classifier_tests :- run_tests.