diff --git a/src/methods/pca/pca.cpp b/src/methods/pca/pca.cpp index cc7068d9785ba0003315e20d4e1d197c923e0780..57d66dd60b3f2e3bb04a4effdb9007e196dde1aa 100644 --- a/src/methods/pca/pca.cpp +++ b/src/methods/pca/pca.cpp @@ -58,7 +58,7 @@ void pca(SP_integer scaleData, char const *decompositionPolicy, { PCA<RandomizedSVDPolicy>((scaleData == 1)).Apply(data, transformedReturnMat, eigValReturnVector, eigVecReturnMat); } - else if (strcmp(decompositionPolicy, "randomized-block-krylov") == 0) + else if (strcmp(decompositionPolicy, "randomized_block_krylov") == 0) { PCA<RandomizedBlockKrylovSVDPolicy>((scaleData == 1)).Apply(data, transformedReturnMat, eigValReturnVector, eigVecReturnMat); } @@ -203,4 +203,4 @@ double pcaVarianceDimReduction(SP_integer scaleData, char const *decompositionPo returnMatrixInformation(data, transformedMatArr, transformedMatColNum, transformedMatRowNum); return returnValue; -} \ No newline at end of file +} diff --git a/src/methods/pca/pca.pl b/src/methods/pca/pca.pl index 05ec3dfdd1c8b1f235e4ea72dd2ea9e592d6cd07..7d15876c4ffc0254666e9f714099cf3213d33fa8 100644 --- a/src/methods/pca/pca.pl +++ b/src/methods/pca/pca.pl @@ -39,7 +39,8 @@ pca(ScaleData, DecompositionPolicy, DataList, DataRows, TransformedList, TDataCo convert_float_array_to_list(Y, Ysize, EigValList), convert_float_array_to_2d_list(Z, ZCols, ZRows, EigVecList). -foreign(pca, c, pcaI( +integer, +string, +foreign(pca, c, pcaI( +integer, + +string, +pointer(float_array), +integer, +integer, -pointer(float_array), -integer, -integer, -pointer(float_array), -integer, @@ -61,11 +62,13 @@ foreign(pca, c, pcaI( +integer, +string, %% Define the new dimensionality of the data with newDimension. %% pcaDimReduction(ScaleData, DecompositionPolicy, DataList, DataRows, NewDim, TransformedList, TDataCols, Variance) :- + NewDim > 0, convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrows, X)), pcaDimReductionI(ScaleData, DecompositionPolicy, X, Xsize, Xrows, NewDim, TData, TDataCols, TDataRows, Variance), convert_float_array_to_2d_list(TData, TDataCols, TDataRows, TransformedList). -foreign(pcaDimReduction, c, pcaDimReductionI( +integer, +string, +foreign(pcaDimReduction, c, pcaDimReductionI( +integer, + +string, +pointer(float_array), +integer, +integer, +integer, -pointer(float_array), -integer, -integer, @@ -87,11 +90,14 @@ foreign(pcaDimReduction, c, pcaDimReductionI( +integer, +string, %% Define to which variance the data should be reduced to. %% pcaVarianceDimReduction(ScaleData, DecompositionPolicy, DataList, DataRows, VarRetained, TransformedList, TDataCols, Variance) :- + VarRetained >= 0.0, + VarRetained =< 1.0, convert_list_to_float_array(DataList, DataRows, array(Xsize, Xrows, X)), pcaVarianceDimReductionI(ScaleData, DecompositionPolicy, X, Xsize, Xrows, VarRetained, TData, TDataCols, TDataRows, Variance), convert_float_array_to_2d_list(TData, TDataCols, TDataRows, TransformedList). -foreign(pcaVarianceDimReduction, c, pcaVarianceDimReductionI( +integer, +string, +foreign(pcaVarianceDimReduction, c, pcaVarianceDimReductionI( +integer, + +string, +pointer(float_array), +integer, +integer, +float32, -pointer(float_array), -integer, -integer, diff --git a/src/methods/pca/pca_test.pl b/src/methods/pca/pca_test.pl index c9ec81f80f63c065f08e3099950964c54e3bff52..045b4b9d46a2329b10a0389191897b603964ee28 100644 --- a/src/methods/pca/pca_test.pl +++ b/src/methods/pca/pca_test.pl @@ -7,49 +7,184 @@ :- use_module('../../helper_files/helper.pl'). -:- begin_tests(lists). -test(alpha_after_train) :- - open('/home/afkjakhes/eclipse-workspace/prolog-mlpack-libary/src/data_csv/iris.csv', read, A), - take_csv_row(A, 10, B), - convert_list_to_float_array(B , 10, array(Xsize, Xrownum, X)), - pca(0, randomized, X, Xsize, Xrownum, Tansfomed, TCols, TRows, EigVal, EigValSize, EigVec, EigVecCols, EigVecRows), - convert_float_array_to_2d_list(Tansfomed, TCols, TRows, TOut), - convert_float_array_to_list(EigVal, EigValSize, EigValOut), - convert_float_array_to_2d_list(EigVec, EigVecCols, EigVecRows, EigVecOut), - print(TOut). +%% +%% TESTING predicate pca/9 +%% +:- begin_tests(pca). + +%% Failure Tests + +test(pca_Wrong_DecompositionPolicy_Input, [error(domain_error('The given DecompositionPolicy is unkown!' , wrongInput), _)]) :- + pca(0, wrongInput, [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, _, _, _, _, _). + + +%% Successful Tests + +test(pca_Normal_Use_Exact) :- + pca(0, exact, [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, TDataList, _, EigValList, EigVecList, _), + print('\nTransformed Data: '), + print(TDataList), + print('\nEigenValues: '), + print(EigValList), + print('\nEigenVectors: '), + print(EigVecList). + +test(pca_Normal_Use_Randomized) :- + pca(0, randomized, [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, TDataList, _, EigValList, EigVecList, _), + print('\nTransformed Data: '), + print(TDataList), + print('\nEigenValues: '), + print(EigValList), + print('\nEigenVectors: '), + print(EigVecList). + +test(pca_Normal_Use_Randomized_Block_Krylov) :- + pca(0, randomized_block_krylov, [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, TDataList, _, EigValList, EigVecList, _), + print('\nTransformed Data: '), + print(TDataList), + print('\nEigenValues: '), + print(EigValList), + print('\nEigenVectors: '), + print(EigVecList). + +test(pca_Normal_Use_Quic) :- + pca(0, quic, [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, TDataList, _, EigValList, EigVecList, _), + print('\nTransformed Data: '), + print(TDataList), + print('\nEigenValues: '), + print(EigValList), + print('\nEigenVectors: '), + print(EigVecList). + +test(pca_CSV_Input) :- + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,10, Data), + pca(1, exact, Data, 4, TDataList, _, EigValList, EigVecList, _), + print('\nTransformed Data: '), + print(TDataList), + print('\nEigenValues: '), + print(EigValList), + print('\nEigenVectors: '), + print(EigVecList). + +:- end_tests(pca). + -:- end_tests(lists). %% -%% TESTING predicate predicate/10 +%% TESTING predicate pcaDimReduction/8 %% -:- begin_tests(predicate). +:- begin_tests(pcaDimReduction). %% 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(pcaDimReduction_Wrong_DecompositionPolicy_Input, [error(domain_error('The given DecompositionPolicy is unkown!' , wrongInput), _)]) :- + pcaDimReduction(0, wrongInput, [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, 2, _, _, _). -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(pcaDimReduction_Negative_NewDimension, fail) :- + pcaDimReduction(0, randomized, [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, -2, _, _, _). + +test(pcaDimReduction_Too_Big_NewDimension, fail) :- + pcaDimReduction(0, randomized, [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, 5, _, _, _). %% 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(pcaDimReduction_Normal_Use_Exact) :- + pcaDimReduction(0, exact, [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, 2, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaDimReduction_Normal_Use_Randomized) :- + pcaDimReduction(0, randomized, [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, 2, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaDimReduction_Normal_Use_Randomized_Block_Krylov) :- + pcaDimReduction(0, randomized_block_krylov, [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, 2, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaDimReduction_Normal_Use_Quic) :- + pcaDimReduction(0, quic, [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, 2, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaDimReduction_CSV_Input) :- + open('src/data_csv/iris2.csv', read, File), + take_csv_row(File, skipFirstRow,10, Data), + pcaDimReduction(1, exact, Data, 4, 2, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +:- end_tests(pcaDimReduction). + + + +%% +%% TESTING predicate pcaVarianceDimReduction/8 +%% +:- begin_tests(pcaVarianceDimReduction). + +%% Failure Tests + +test(pcaVarianceDimReduction_Wrong_DecompositionPolicy_Input, [error(domain_error('The given DecompositionPolicy is unkown!' , wrongInput), _)]) :- + pcaVarianceDimReduction(0, wrongInput, [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.5, _, _, _). + +test(pcaVarianceDimReduction_Bad_ToRetainVar_Input, fail) :- + pcaVarianceDimReduction(0, randomized, [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, -1.0, _, _, _), + pcaVarianceDimReduction(0, randomized, [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, 1.1, _, _, _). + +%% Successful Tests + +test(pcaVarianceDimReduction_Normal_Use_Exact) :- + pcaVarianceDimReduction(0, exact, [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.5, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaVarianceDimReduction_Normal_Use_Randomized) :- + pcaVarianceDimReduction(0, randomized, [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.5, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaVarianceDimReduction_Normal_Use_Randomized_Block_Krylov) :- + pcaVarianceDimReduction(0, randomized_block_krylov, [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.5, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). + +test(pcaVarianceDimReduction_Normal_Use_Quic) :- + pcaVarianceDimReduction(0, quic, [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.5, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). -test(testDescription4, [true(Error =:= 0.9797958971132711)]) :- - reset_Model_No_Train(perceptron), +test(pcaVarianceDimReduction_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). + pcaVarianceDimReduction(1, exact, Data, 4, 0.2, TDataList, _, RetainedVar), + print('\nTransformed Data: '), + print(TDataList), + print('\nRetained Variance: '), + print(RetainedVar). -:- end_tests(predicate). +:- end_tests(pcaVarianceDimReduction). run_pca_tests :- run_tests.