16 #include "itkArray2D.h" 22 #include <itkCSVArray2DFileReader.h> 23 #include <itkCSVArray2DDataObject.h> 24 #include <itkCSVNumericObjectFileWriter.h> 30 CPPUNIT_TEST_SUITE(mitkLibSVMClassifierTestSuite);
31 MITK_TEST(TrainSVMClassifier_MatlabDataSet_shouldReturnTrue);
32 MITK_TEST(TrainSVMClassifier_BreastCancerDataSet_shouldReturnTrue);
33 CPPUNIT_TEST_SUITE_END();
37 typedef Eigen::Matrix<double ,Eigen::Dynamic,Eigen::Dynamic> MatrixDoubleType;
38 typedef Eigen::Matrix<int, Eigen::Dynamic,Eigen::Dynamic> MatrixIntType;
40 Eigen::MatrixXd m_TrainingMatrixX;
41 Eigen::MatrixXi m_TrainingLabelMatrixY;
42 Eigen::MatrixXd m_TestXPredict;
43 Eigen::MatrixXi m_TestYPredict;
53 std::pair<Eigen::Matrix<T ,Eigen::Dynamic,Eigen::Dynamic>,Eigen::Matrix<T ,Eigen::Dynamic,Eigen::Dynamic> >convertCSVToMatrix(
const std::string &path,
char delimiter,
double range,
bool isXMatrix)
55 typename itk::CSVArray2DFileReader<T>::Pointer fr = itk::CSVArray2DFileReader<T>::New();
56 fr->SetFileName(path);
57 fr->SetFieldDelimiterCharacter(delimiter);
58 fr->HasColumnHeadersOff();
59 fr->HasRowHeadersOff();
63 }
catch(itk::ExceptionObject& ex){
64 cout <<
"Exception caught!" << std::endl;
65 cout << ex << std::endl;
68 typename itk::CSVArray2DDataObject<T>::Pointer p = fr->GetOutput();
69 unsigned int maxrowrange = p->GetMatrix().rows();
70 unsigned int c = p->GetMatrix().cols();
71 auto percentRange = (
unsigned int)(maxrowrange*range);
75 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> trainMatrixX(percentRange,c);
76 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> testMatrixXPredict(maxrowrange-percentRange,c);
78 for(
unsigned int row = 0; row < percentRange; row++){
79 for(
unsigned int col = 0; col < c; col++){
80 trainMatrixX(row,col) = p->GetData(row,col);
84 for(
unsigned int row = percentRange; row < maxrowrange; row++){
85 for(
unsigned int col = 0; col < c; col++){
86 testMatrixXPredict(row-percentRange,col) = p->GetData(row,col);
90 return std::make_pair(trainMatrixX,testMatrixXPredict);
94 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> trainLabelMatrixY(percentRange,c);
95 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> testMatrixYPredict(maxrowrange-percentRange,c);
97 for(
unsigned int row = 0; row < percentRange; row++){
98 for(
unsigned int col = 0; col < c; col++){
99 trainLabelMatrixY(row,col) = p->GetData(row,col);
103 for(
unsigned int row = percentRange; row < maxrowrange; row++){
104 for(
unsigned int col = 0; col < c; col++){
105 testMatrixYPredict(row-percentRange,col) = p->GetData(row,col);
109 return std::make_pair(trainLabelMatrixY,testMatrixYPredict);
117 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> readCsvData(
const std::string &path,
char delimiter)
119 typename itk::CSVArray2DFileReader<T>::Pointer fr = itk::CSVArray2DFileReader<T>::New();
120 fr->SetFileName(path);
121 fr->SetFieldDelimiterCharacter(delimiter);
122 fr->HasColumnHeadersOff();
123 fr->HasRowHeadersOff();
127 }
catch(itk::ExceptionObject& ex){
128 cout <<
"Exception caught!" << std::endl;
129 cout << ex << std::endl;
132 typename itk::CSVArray2DDataObject<T>::Pointer p = fr->GetOutput();
133 unsigned int maxrowrange = p->GetMatrix().rows();
134 unsigned int maxcols = p->GetMatrix().cols();
135 Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> matrix(maxrowrange,maxcols);
137 for(
unsigned int rows = 0; rows < maxrowrange; rows++){
138 for(
unsigned int cols = 0; cols < maxcols; cols++ ){
139 matrix(rows,cols) = p->GetData(rows,cols);
152 void writeMatrixToCsv(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> paramMatrix,
const std::string &path)
154 std::ofstream outputstream (path,std::ofstream::out);
156 if(outputstream.is_open()){
157 for(
int i = 0; i < paramMatrix.rows(); i++){
158 outputstream << paramMatrix(i,0);
159 for(
int j = 1; j < 11; j++){
160 outputstream <<
" " << j <<
":" << paramMatrix(i,j);
162 outputstream << endl;
164 outputstream.close();
167 cout <<
"Unable to write into CSV" << endl;
175 void TrainSVMClassifier_MatlabDataSet_shouldReturnTrue()
179 std::pair<MatrixDoubleType,MatrixDoubleType> matrixDouble;
180 matrixDouble = convertCSVToMatrix<double>(
GetTestDataFilePath(
"Classification/FeaturematrixMatlab.csv"),
';',0.5,
true);
181 m_TrainingMatrixX = matrixDouble.first;
182 m_TestXPredict = matrixDouble.second;
186 std::pair<MatrixIntType,MatrixIntType> matrixInt;
187 matrixInt = convertCSVToMatrix<int>(
GetTestDataFilePath(
"Classification/LabelmatrixMatlab.csv"),
';',0.5,
false);
188 m_TrainingLabelMatrixY = matrixInt.first;
189 m_TestYPredict = matrixInt.second;
193 classifier->SetGamma(1/(
double)(m_TrainingMatrixX.cols()));
194 classifier->SetSvmType(0);
195 classifier->SetKernelType(0);
199 classifier->Train(m_TrainingMatrixX,m_TrainingLabelMatrixY);
200 Eigen::MatrixXi classes = classifier->Predict(m_TestXPredict);
204 unsigned int maxrows = classes.rows();
208 for (
unsigned int i = 0; i < maxrows; i++)
210 if(classes(i, 0) == m_TestYPredict(i, 0))
214 MITK_INFO << 100*count/(double)(maxrows) <<
"%";
215 MITK_TEST_CONDITION(isEqual<int>(m_TestYPredict,classes),
"Expected vector and occured vector match.");
220 bool isEqual(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> expected, Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> actual)
222 bool isSimilar =
true;
223 unsigned int mrow = expected.rows();
224 unsigned int mcol = expected.cols();
225 for(
unsigned int i = 0; i < mrow; i++){
226 for(
unsigned int j = 0; j < mcol; j++){
227 if(expected(i,j) != actual(i,j)){
237 bool isIntervall(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> expected, Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> actual,
double lowrange,
double toprange)
239 bool isInIntervall =
false;
241 unsigned int rowRange = expected.rows();
242 unsigned int colRange = expected.cols();
243 for(
unsigned int i = 0; i < rowRange; i++){
244 for(
unsigned int j = 0; j < colRange; j++){
245 if(expected(i,j) == actual(i,j)){
250 double valueOfMatch = 100*count/(double)(rowRange);
251 if((lowrange <= valueOfMatch) && (toprange >= valueOfMatch)){
252 isInIntervall =
true;
255 return isInIntervall;
262 void TrainSVMClassifier_BreastCancerDataSet_shouldReturnTrue()
266 std::pair<MatrixDoubleType,MatrixDoubleType> matrixDouble;
267 matrixDouble = convertCSVToMatrix<double>(
GetTestDataFilePath(
"Classification/FeaturematrixBreastcancer.csv"),
';',0.5,
true);
268 m_TrainingMatrixX = matrixDouble.first;
269 m_TestXPredict = matrixDouble.second;
273 std::pair<MatrixIntType,MatrixIntType> matrixInt;
274 matrixInt = convertCSVToMatrix<int>(
GetTestDataFilePath(
"Classification/LabelmatrixBreastcancer.csv"),
';',0.5,
false);
275 m_TrainingLabelMatrixY = matrixInt.first;
276 m_TestYPredict = matrixInt.second;
280 classifier->SetGamma(1/(
double)(m_TrainingMatrixX.cols()));
281 classifier->SetSvmType(0);
282 classifier->SetKernelType(2);
286 classifier->Train(m_TrainingMatrixX,m_TrainingLabelMatrixY);
287 Eigen::MatrixXi classes = classifier->Predict(m_TestXPredict);
291 unsigned int maxrows = classes.rows();
295 for (
unsigned int i = 0; i < maxrows; i++)
297 if (classes(i, 0) == m_TestYPredict(i, 0))
301 MITK_INFO << 100*count/(double)(maxrows) <<
"%";
302 MITK_TEST_CONDITION(isIntervall<int>(m_TestYPredict,classes,75,100),
"Testvalue is in range.");
305 void TestThreadedDecisionForest()
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
static std::string GetTestDataFilePath(const std::string &testData)
Get the absolute path for test data.
#define MITK_TEST_CONDITION(COND, MSG)
Test fixture for parameterized tests.