19 using namespace KKMLL;
32 bucketSize (_bucketSize),
41 numInvalidClassesPredicted (0.0),
42 numOfBuckets (_numOfBuckets),
43 numOfProbBuckets (_numOfProbBuckets),
45 probBucketSize (_probBucketSize),
68 numInvalidClassesPredicted (0.0),
70 numOfProbBuckets (20),
86 bucketSize (cm.bucketSize),
87 classCount (cm.classCount),
90 correctCount (cm.correctCount),
95 numInvalidClassesPredicted (cm.numInvalidClassesPredicted),
96 numOfBuckets (cm.numOfBuckets),
97 numOfProbBuckets (cm.numOfProbBuckets),
99 probBucketSize (cm.probBucketSize),
100 totalCount (cm.totalCount),
101 totalPredProb (cm.totalPredProb),
106 CopyVector (cm.countsByKnownClass, countsByKnownClass);
107 CopyVector (cm.totalPredProbsByKnownClass, totalPredProbsByKnownClass);
108 CopyVector (cm.totalSizesByKnownClass, totalSizesByKnownClass);
110 CopyVectorDoublePtr (cm.predictedCountsCM, predictedCountsCM, classCount);
111 CopyVectorDoublePtr (cm.totPredProbCM, totPredProbCM, classCount);
113 CopyVectorDoublePtr (cm.countByKnownClassBySize, countByKnownClassBySize, numOfBuckets);
114 CopyVectorDoublePtr (cm.correctByKnownClassBySize, correctByKnownClassBySize, numOfBuckets);
115 CopyVectorDoublePtr (cm.countByKnownClassByProb, countByKnownClassByProb, numOfProbBuckets);
116 CopyVectorDoublePtr (cm.correctByKnownClassByProb, correctByKnownClassByProb, numOfProbBuckets);
124 DeleteVectorDoublePtr (countByKnownClassBySize);
125 DeleteVectorDoublePtr (correctByKnownClassBySize);
126 DeleteVectorDoublePtr (countByKnownClassByProb);
127 DeleteVectorDoublePtr (correctByKnownClassByProb);
128 DeleteVectorDoublePtr (predictedCountsCM);
129 DeleteVectorDoublePtr (totPredProbCM);
137 classes.SortByName ();
139 classCount = classes.QueueSize ();
142 InitializeVector (countsByKnownClass, classCount);
143 InitializeVector (totalSizesByKnownClass, classCount);
144 InitializeVector (totalPredProbsByKnownClass, classCount);
146 InitializeVectorDoublePtr (predictedCountsCM, classCount, classCount);
147 InitializeVectorDoublePtr (totPredProbCM, classCount, classCount);
149 InitializeVectorDoublePtr (countByKnownClassBySize, classCount, numOfBuckets);
150 InitializeVectorDoublePtr (correctByKnownClassBySize, classCount, numOfBuckets);
152 InitializeVectorDoublePtr (countByKnownClassByProb, classCount, numOfProbBuckets);
153 InitializeVectorDoublePtr (correctByKnownClassByProb, classCount, numOfProbBuckets);
163 for (kkint32 y = 0; y < x; ++y)
175 vector<
double>::const_iterator idx;
176 for (idx = src.begin (); idx != src.end (); ++idx)
177 dest.push_back (*idx);
187 for (
kkuint32 x = 0; x < v.size (); ++x)
194 while (v.size () < (kkuint32)numClasses)
196 double* d =
new double[numBuckets];
198 for (kkint32 y = 0; y < numBuckets; ++y)
210 if (numBucketsOld != numBucketsNew)
212 vector<
double*>::iterator idx;
213 for (idx = v.begin (); idx != v.end (); ++idx)
215 double* oldArray = *idx;
216 double* newArray =
new double[numBucketsNew];
217 for (
kkint32 x = 0; x < numBucketsOld; ++x)
218 newArray[x]= oldArray[x];
220 for (
kkint32 x = numBucketsOld; x < numBucketsNew; ++x)
229 double* d =
new double[numBucketsNew];
231 for (
kkint32 x = 0; x < numBucketsNew; ++x)
239 vector<
double*>& dest,
243 for (
kkuint32 x = 0; x < dest.size (); ++x)
251 while (dest.size () < src.size ())
253 double* s = src[classIdx];
254 double* d =
new double[numBuckets];
256 for (kkint32 y = 0; y < numBuckets; ++y)
267 for (
kkuint32 x = 0; x < v.size (); ++x)
282 kkint32 existingClassIdx = classes.PtrToIdx (newClass);
283 if (existingClassIdx >= 0)
285 log.Level (-1) << endl
286 <<
"ConfusionMatrix2::AddClassToConfusionMatrix ***ERROR*** Class[" << newClass->Name () <<
"] already in class list." << endl
288 return existingClassIdx;
291 classes.PushOnBack (newClass);
294 IncreaseVectorDoublePtr (correctByKnownClassByProb, numOfProbBuckets, numOfProbBuckets);
295 IncreaseVectorDoublePtr (countByKnownClassByProb, numOfProbBuckets, numOfProbBuckets);
297 IncreaseVectorDoublePtr (correctByKnownClassBySize, numOfBuckets, numOfBuckets);
298 IncreaseVectorDoublePtr (countByKnownClassBySize, numOfBuckets, numOfBuckets);
300 IncreaseVectorDoublePtr (predictedCountsCM, classCount - 1, classCount);
301 IncreaseVectorDoublePtr (totPredProbCM, classCount - 1, classCount);
303 countsByKnownClass.push_back (0.0);
304 totalPredProbsByKnownClass.push_back (0.0);
305 totalSizesByKnownClass.push_back (0.0);
307 return classes.PtrToIdx (newClass);
317 if ((knownClassIdx < 0) || (knownClassIdx >= classCount))
320 if ((predClassIdx < 0) || (predClassIdx >= classCount))
323 return predictedCountsCM [knownClassIdx][predClassIdx];
330 kkint32 knownClassIdx, predClassIdx;
333 for (predClassIdx = 0; predClassIdx < classCount; predClassIdx++)
335 double predCount = 0.0;
336 for (knownClassIdx = 0; knownClassIdx < classCount; knownClassIdx++)
337 predCount += predictedCountsCM[knownClassIdx][predClassIdx];
338 pc.push_back (predCount);
349 if ((knownClassIdx < 0) || (knownClassIdx >= classCount))
352 return countsByKnownClass [knownClassIdx];
359 return countsByKnownClass;
375 if (_probability < 0)
380 numInvalidClassesPredicted += 1.0;
381 _log.Level (-1) << endl
382 <<
"ConfusionMatrix2::Increment **** _knownClass = NULL ****" 390 numInvalidClassesPredicted += 1.0;
391 _log.Level (-1) << endl
392 <<
"ConfusionMatrix2::Increment **** _predClass = NULL ****" 398 knownClassNum = classes.PtrToIdx (_knownClass);
399 if (knownClassNum < 0)
400 knownClassNum = AddClassToConfusionMatrix (_knownClass, _log);
402 predClassNum = classes.PtrToIdx (_predClass);
403 if (predClassNum < 0)
404 predClassNum = AddClassToConfusionMatrix (_predClass, _log);
406 if ((knownClassNum < 0) || (knownClassNum >= classCount))
408 numInvalidClassesPredicted += 1.0;
409 _log.Level (-1) <<
"ConfusionMatrix2::IncrementPredHits knownClassNum[" << knownClassNum <<
"] out of bounds." << endl;
413 if ((predClassNum < 0) || (predClassNum >= classCount))
415 numInvalidClassesPredicted += 1.0;
416 _log.Level (-1) <<
"ConfusionMatrix2::IncrementPredHits predClassNum[" << predClassNum <<
"] out of bounds." << endl;
420 if (knownClassNum == predClassNum)
425 totalSizesByKnownClass[knownClassNum] += _size;
427 totalPredProbsByKnownClass [knownClassNum] += _probability;
428 totalPredProb += _probability;
430 countsByKnownClass [knownClassNum]++;
432 (predictedCountsCM [knownClassNum] [predClassNum])++;
433 totPredProbCM [knownClassNum] [predClassNum] += _probability;
438 kkint32 bucket = (_size - 1) / bucketSize;
439 if (bucket >= numOfBuckets)
440 bucket = numOfBuckets - 1;
442 countByKnownClassBySize[knownClassNum][bucket]++;
443 if (knownClassNum == predClassNum)
444 correctByKnownClassBySize [knownClassNum][bucket]++;
455 if ((_probability >= 0.0) && (_probability <= 1.0))
456 bucket = ((
kkint32)(_probability * 100) / probBucketSize);
460 if (bucket >= numOfProbBuckets)
461 bucket = numOfProbBuckets - 1;
463 countByKnownClassByProb [knownClassNum][bucket]++;
464 if (knownClassNum == predClassNum)
465 correctByKnownClassByProb [knownClassNum][bucket]++;
485 case '#': result <<
"\\#";
488 case '$': result <<
"\\$";
491 case '&': result <<
"\\&";
494 case '_': result <<
"\\_";
497 case '%': result <<
"\\%";
500 case '{': result <<
"\\{";
503 case '}': result <<
"\\}";
531 _outFile << setw (25) << _name
532 << setw (16) << _lineTotal;
534 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
536 _outFile << setw (16) << _splits [predClassNum];
556 name <<
"(" << _lineTotal <<
")";
558 _outFile << _name <<
"\t" << _lineTotal;
560 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
562 _outFile <<
"\t" << _splits [predClassNum];
580 o <<
" <tr><td style=\"text-align:left; font-family:Arial\">" << _name <<
"</td>" <<
"<td>" << _lineTotal <<
"</td>";
582 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
584 if (predClassNum == _knownClassNum)
586 o <<
"<td style=\"font-weight:bold\">" 587 << _splits [predClassNum]
593 if (_splits [predClassNum] != 0.0)
594 o << _splits [predClassNum];
598 o <<
"</tr>" << endl;
617 name <<
"(" << _lineTotal <<
")";
619 _outFile << StripOutInvalidLatexCaracters (_name) <<
" & " << _lineTotal;
621 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
624 if (_knownClassNum == predClassNum)
625 _outFile <<
"\\textbf{";
627 _outFile << _splits [predClassNum];
629 if (_knownClassNum == predClassNum)
633 _outFile <<
"\\\\" << endl;
649 name <<
"(" << _lineTotal <<
")";
651 _outFile << setw (25) << name;
653 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
655 _outFile << setw (6) << _splits [predClassNum];
675 if (totalCount == 0.0)
678 perc = (
double)_lineTotal / totalCount;
681 # ifdef USE_SECURE_FUNCS
682 sprintf_s (buff,
sizeof (buff),
"%.1f%%", (100.0 * perc));
684 sprintf (buff,
"%.1f%%", (100.0 * perc));
690 _outFile << setw (25) << _name
691 << setw (16) << buff;
693 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
698 perc = 100.0 * (
double)_splits[predClassNum] / (
double)_lineTotal;
701 # ifdef USE_SECURE_FUNCS
702 sprintf_s (buff,
sizeof (buff),
"%.3f%%", perc);
704 sprintf (buff,
"%.3f%%", perc);
707 _outFile << setw (16) << buff;
727 if (totalCount <= 0.0)
730 perc = (
double)_lineTotal / totalCount;
732 _outFile << _name <<
"\t" 733 << StrFormatDouble ((100.0 * perc),
"zz0.00") <<
"%";
736 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
741 perc = 100.0 * (
double)_splits[predClassNum] / (
double)_lineTotal;
743 _outFile <<
"\t" << StrFormatDouble (perc,
"ZZ0.000") <<
"%";
754 double _totalAvgPredProbThisLine,
755 double _totalCountThisLine,
757 double _avgPredProbs[],
758 double _numPredByClass[]
764 if (_totalCountThisLine <= 0.0)
767 avgPredProb = _totalAvgPredProbThisLine / _totalCountThisLine;
770 o <<
" <tr>" <<
"<td style=\"text-align:left; font-family:Arial\">" << _name <<
"</td>" <<
"<td>" << avgPredProbStr <<
"</td>";
772 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
774 if (_numPredByClass[predClassNum] <= 0.0)
777 avgPredProb = 100.0 * _avgPredProbs[predClassNum] / _numPredByClass[predClassNum];
779 if (predClassNum == _knownClassNum)
780 o <<
"<td style=\"font-weight:bold\">";
784 o << StrFormatDouble (avgPredProb,
"ZZ0.000") <<
"%" <<
"</td>";
787 o <<
"</tr>" << endl;
804 if (totalCount <= 0.0)
807 perc = (
double)_lineTotal / totalCount;
810 o <<
" <tr>" <<
"<td style=\"text-align:left; font-family:Arial\">" << _name <<
"</td>" <<
"<td>" << percentStr <<
"</td>";
812 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
817 perc = 100.0 * (
double)_splits[predClassNum] / (
double)_lineTotal;
819 if (predClassNum == _knownClassNum)
821 o <<
"<td style=\"font-weight:bold\">" 822 << StrFormatDouble (perc,
"ZZ0.000") <<
"%" 829 o << StrFormatDouble (perc,
"ZZ0.000") <<
"%";
833 o <<
"</tr>" << endl;
850 if (totalCount == 0.0)
853 perc = 100.0 * (
double)_lineTotal / totalCount;
858 _outFile << setw (25) << name;
860 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
865 perc = 100.0 * (
double)_splits[predClassNum] / (
double)_lineTotal;
867 _outFile << setw (6) << StrFormatDouble (perc,
"zz0.0");
887 if (totalCount <= 0.0)
890 perc = (
double)_lineTotal / totalCount;
892 _outFile << StripOutInvalidLatexCaracters (_name) <<
" & " 893 << StrFormatDouble ((100.0 * perc),
"zz0.0") <<
"\\%";
895 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
900 perc = 100.0 * (
double)_splits[predClassNum] / (
double)_lineTotal;
903 if (_rowNum == predClassNum)
904 _outFile <<
"\\textbf{";
906 _outFile << StrFormatDouble (perc,
"ZZ0.00") <<
"\\%";
907 if (_rowNum == predClassNum)
911 _outFile <<
"\\\\" << endl;
930 if (totalCount > 0.0)
931 perc = correctCount / totalCount;
933 outFile <<
"Overall Accuracy is " 935 << (100.0 * perc) <<
"%" 942 KKStr titleLine1, titleLine2, titleLine3;
943 classes.ExtractThreeTitleLines (titleLine1, titleLine2, titleLine3, 16);
946 outFile << setw (25) <<
"" << setw(16) <<
"" << setw (0) << titleLine1 << endl;
947 outFile << setw (25) <<
"" << setw(16) <<
"" << setw (0) << titleLine2 << endl;
948 outFile << setw (25) <<
"ClassName" << setw(16) <<
"Count" << setw (0) << titleLine3 << endl;
950 outFile << setw (25) <<
"===========" << setw(16) <<
"====";
951 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
953 outFile << setw (16) <<
"============";
957 double* totals =
new double[classCount];
958 for (x = 0; x < classCount; x++)
962 double totalNonNoise = 0;
963 double totalNonNoiseRight = 0;
965 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
967 bool noiseClass = classes[knownClassNum].UnDefined ();
969 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
971 totals[predClassNum] += predictedCountsCM[knownClassNum] [predClassNum];
974 PrintSingleLine (outFile,
975 classes [knownClassNum].Name (),
976 countsByKnownClass [knownClassNum],
977 predictedCountsCM [knownClassNum]
982 totalNonNoise = totalNonNoise + countsByKnownClass [knownClassNum];
983 totalNonNoiseRight += predictedCountsCM [knownClassNum] [knownClassNum];
987 PrintSingleLine (outFile,
993 outFile << endl << endl;
995 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
997 PrintPercentLine (outFile,
998 classes [knownClassNum].Name (),
999 countsByKnownClass [knownClassNum],
1000 predictedCountsCM [knownClassNum]
1008 if (totalNonNoise != 0)
1009 perc = (
double)totalNonNoiseRight / (
double)totalNonNoise;
1011 outFile <<
"Accuracy for Non Noise " 1018 outFile << endl << endl;
1032 double overallAccuracy = 0.0;
1033 if (totalCount != 0.0)
1034 overallAccuracy = 100.0 * correctCount / totalCount;
1036 if (numInvalidClassesPredicted > 0.0)
1038 o <<
"<p style=\"font-weight:bold\">" << endl
1039 <<
"*********************************************************************************************<br />" << endl
1040 <<
"******************* WARNING WARNING WARNING WARNING *********************<br />" << endl
1041 <<
"******************* *********************<br />" << endl
1042 <<
"******************* There were invalid classes specified that were *********************<br />" << endl
1043 <<
"******************* not counted. numInvalidClassesPredicted[" << numInvalidClassesPredicted <<
"] *********************<br />" << endl
1044 <<
"*********************************************************************************************<br />" << endl
1046 <<
"<br />" << endl;
1050 o <<
"Overall Accuracy: " 1051 << StrFormatDouble (overallAccuracy,
"ZZZ0.000") <<
"%" 1055 o <<
"<table align=\"center\" border=\"2\" cellpadding=\"3\" cellspacing=\"0\" frame=\"box\" summary=\"Confusion \" >" << endl
1056 <<
" <thead style=\"font-weight:bold; text-align:center; vertical-align:bottom\">" << endl
1058 <<
" <th>Class<br />Names</th><th>Count</th>" << classes.ExtractHTMLTableHeader () << endl
1060 <<
" </thead>" << endl
1061 <<
" <tbody style=\"font-weight:normal; text-align:right; font-family:Courier\">" << endl;
1063 double* totals =
new double[classCount];
1064 for (x = 0; x < classCount; x++)
1067 double totalNonNoise = 0;
1068 double totalNonNoiseRight = 0;
1070 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1072 bool noiseClass = classes[knownClassNum].UnDefined ();
1074 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
1076 totals[predClassNum] += predictedCountsCM [knownClassNum] [predClassNum];
1079 PrintSingleLineHTML (o,
1080 classes [knownClassNum].Name (),
1081 countsByKnownClass [knownClassNum],
1083 predictedCountsCM [knownClassNum]
1087 totalNonNoise = totalNonNoise + countsByKnownClass [knownClassNum];
1088 totalNonNoiseRight = totalNonNoiseRight + predictedCountsCM [knownClassNum] [knownClassNum];
1093 PrintSingleLineHTML (o,
1100 o <<
"<tr><td colspan=\"" << (classCount + 2) <<
"\"> </td></tr>" << endl;
1102 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1104 PrintPercentLineHTML (o,
1105 classes [knownClassNum].Name (),
1106 countsByKnownClass [knownClassNum],
1108 predictedCountsCM [knownClassNum]
1112 o <<
"</tbody>" << endl
1113 <<
"</table>" << endl;
1115 double nonNoiseAccuracy = 0.0;
1116 if (totalNonNoise != 0)
1117 nonNoiseAccuracy = 100.0 * (
double)totalNonNoiseRight / (
double)totalNonNoise;
1119 o <<
"Non Noise Accuracy: " << StrFormatDouble (nonNoiseAccuracy,
"ZZ0.000") <<
"%" <<
"<br />" << endl;
1135 double overallAvgPredProb = 0.0;
1136 if (totalCount != 0.0)
1137 overallAvgPredProb = 100.0 * totalPredProb / totalCount;
1139 if (numInvalidClassesPredicted > 0.0)
1141 o <<
"<p style=\"font-weight:bold\">" << endl
1142 <<
"*********************************************************************************************<br />" << endl
1143 <<
"******************* WARNING WARNING WARNING WARNING *********************<br />" << endl
1144 <<
"******************* *********************<br />" << endl
1145 <<
"******************* There were invalid classes specified that were *********************<br />" << endl
1146 <<
"******************* not counted. numInvalidClassesPredicted[" << numInvalidClassesPredicted <<
"] *********************<br />" << endl
1147 <<
"*********************************************************************************************<br />" << endl
1149 <<
"<br />" << endl;
1153 o <<
"Overall AvgPredProb: " 1154 << StrFormatDouble (overallAvgPredProb,
"ZZZ0.000") <<
"%" 1158 o <<
"<table align=\"center\" border=\"2\" cellpadding=\"3\" cellspacing=\"0\" frame=\"box\" summary=\"Confusion \" >" << endl
1159 <<
" <thead style=\"font-weight:bold; text-align:center; vertical-align:bottom\">" << endl
1161 <<
" <th>Class<br />Names</th><th>Count</th>" << classes.ExtractHTMLTableHeader () << endl
1163 <<
" </thead>" << endl
1164 <<
" <tbody style=\"font-weight:normal; text-align:right; font-family:Courier\">" << endl;
1166 double* totalPredProbByPredClass =
new double[classCount];
1167 double* totalCountsByPredClass =
new double[classCount];
1168 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
1170 totalPredProbByPredClass [predClassNum] = 0.0;
1171 totalCountsByPredClass [predClassNum] = 0.0;
1174 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1176 PrintAvgPredProbLineHTML (o,
1177 classes [knownClassNum].Name (),
1178 totalPredProbsByKnownClass [knownClassNum],
1179 countsByKnownClass [knownClassNum],
1181 totPredProbCM [knownClassNum],
1182 predictedCountsCM [knownClassNum]
1184 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
1186 totalPredProbByPredClass [predClassNum] += totPredProbCM [knownClassNum][predClassNum];
1187 totalCountsByPredClass [predClassNum] += predictedCountsCM [knownClassNum][predClassNum];
1191 o <<
"<tr><td colspan=\"" << (classCount + 2) <<
"\"> </td></tr>" << endl;
1193 PrintAvgPredProbLineHTML (o,
1198 totalPredProbByPredClass,
1199 totalCountsByPredClass
1202 o <<
"</tbody>" << endl
1203 <<
"</table>" << endl;
1205 delete[] totalCountsByPredClass;
1206 delete[] totalPredProbByPredClass;
1225 double totalCount = 0.0;
1226 double totalCorrect = 0.0;
1230 o <<
"<table align=\"center\" border=\"2\" cellpadding=\"3\" cellspacing=\"0\" frame=\"box\" summary=\"Confusion \" >" << endl
1231 <<
" <thead style=\"font-weight:bold; text-align:center; vertical-align:bottom\">" << endl
1233 <<
" <th>Class<br />Names</th><th>All<br />Classes</th>";
1235 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
1237 o <<
"<th>" << ((bucket + 1) * probBucketSize) <<
"</th>";
1239 o <<
" </tr>" << endl
1240 <<
" </thead>" << endl
1241 <<
" <tbody style=\"font-weight:normal; text-align:right; font-family:Courier\">" << endl;
1246 for (classNum = 0; classNum < classCount; classNum++)
1248 double countThisClass = 0.0;
1249 double correctThisClass = 0.0;
1253 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
1255 double count = countByKnownClassByProb [classNum][bucket];
1256 double correct = correctByKnownClassByProb [classNum][bucket];
1258 countThisClass += count;
1259 correctThisClass += correct;
1261 countByProb [bucket] += countByKnownClassByProb [classNum][bucket];
1262 correctByProb [bucket] += correctByKnownClassByProb [classNum][bucket];
1268 acc = 100.0 * correct / count;
1272 ln <<
"<td>" << accStr <<
"</td>";
1275 totalCount += countThisClass;
1276 totalCorrect += correctThisClass;
1280 if (countThisClass != 0.0)
1282 acc = 100.0 * correctThisClass / countThisClass;
1287 <<
"<td style=\"text-align:left; font-family:Arial\">" + classes[classNum].Name () +
"</td>" 1288 <<
"<td>" << accStr <<
"</td>" 1296 if (totalCount != 0.0)
1297 acc = 100.0 * totalCorrect / totalCount;
1300 <<
"<td style=\"text-align:left; font-family:Arial\">" <<
"Total<br />All Classes" <<
"</td>" 1301 <<
"<td>" << StrFormatDouble (acc,
"ZZ0.000") <<
"%" <<
"</td>";
1303 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
1307 if (countByProb [bucket] != 0.0)
1309 acc = 100.0 * correctByProb [bucket] / countByProb [bucket];
1310 accStr = StrFormatDouble (acc,
"ZZ0.000") +
"%";
1313 o <<
"<td>" << accStr <<
"</td>";
1315 o <<
"</tr>" << endl;
1318 o <<
"</tbody>" << endl
1319 <<
"</table>" << endl;
1337 double overallAccuracy = 0.0;
1338 if (totalCount != 0.0)
1339 overallAccuracy = 100.0 * correctCount / totalCount;
1341 if (numInvalidClassesPredicted > 0.0)
1344 <<
"*********************************************************************************************" << endl
1345 <<
"******************* WARNING WARNING WARNING WARNING *********************" << endl
1346 <<
"******************* *********************" << endl
1347 <<
"******************* There were invalid classes specified that were *********************" << endl
1348 <<
"******************* not counted. numInvalidClassesPredicted[" << numInvalidClassesPredicted <<
"] *********************" << endl
1349 <<
"*********************************************************************************************" << endl
1354 outFile <<
"Overall Accuracy:\t" 1355 << StrFormatDouble (overallAccuracy,
"ZZZ0.000") <<
"%" 1362 KKStr titleLine1, titleLine2, titleLine3;
1363 classes.ExtractThreeTitleLines (titleLine1, titleLine2, titleLine3);
1365 outFile <<
"" <<
"\t" <<
"" <<
"\t" << titleLine1 << endl;
1366 outFile <<
"" <<
"\t" <<
"" <<
"\t" << titleLine2 << endl;
1367 outFile <<
"Class_Names" <<
"\t" <<
"Count" <<
"\t" << titleLine3 << endl;
1369 double* totals =
new double[classCount];
1370 for (x = 0; x < classCount; x++)
1373 double totalNonNoise = 0;
1374 double totalNonNoiseRight = 0;
1376 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1378 bool noiseClass = classes[knownClassNum].UnDefined ();
1380 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
1382 totals[predClassNum] += predictedCountsCM[knownClassNum] [predClassNum];
1385 PrintSingleLineTabDelimited (outFile,
1386 classes [knownClassNum].Name (),
1387 countsByKnownClass [knownClassNum],
1388 predictedCountsCM [knownClassNum]
1392 totalNonNoise = totalNonNoise + countsByKnownClass [knownClassNum];
1393 totalNonNoiseRight = totalNonNoiseRight + predictedCountsCM [knownClassNum] [knownClassNum];
1397 PrintSingleLineTabDelimited (outFile,
1403 outFile << endl << endl;
1405 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1407 PrintPercentLineTabDelimited (outFile,
1408 classes [knownClassNum].Name (),
1409 countsByKnownClass [knownClassNum],
1410 predictedCountsCM [knownClassNum]
1415 double nonNoiseAccuracy = 0.0;
1416 if (totalNonNoise != 0)
1417 nonNoiseAccuracy = 100.0 * (
double)totalNonNoiseRight / (
double)totalNonNoise;
1422 outFile <<
"Non Noise Accuracy:" <<
"\t" << StrFormatDouble (nonNoiseAccuracy,
"ZZ0.000") <<
"%" << endl;
1425 outFile << endl << endl;
1440 outFile <<
"\\begin{tabular}{|";
1441 for (x = 0; x < (classCount + 2); x++)
1443 outFile <<
"}" << endl;
1445 outFile <<
"\\hline" << endl;
1447 outFile <<
"Class Names" <<
" & " <<
"Count";
1449 for (x = 0; x < classCount; x++)
1451 outFile <<
" & " << StripOutInvalidLatexCaracters (classes[x].Name ());
1453 outFile <<
"\\\\" << endl;
1456 outFile <<
"\\hline" << endl;
1470 double overallAccuracy = 0.0;
1471 if (totalCount != 0.0)
1472 overallAccuracy = 100.0 * correctCount / totalCount;
1474 outFile <<
"Overall Accuracy:\t" 1475 << StrFormatDouble (overallAccuracy,
"ZZZ0.000") <<
"\\%\\\\" 1478 PrintLatexTableColumnHeaders (outFile);
1481 double* totals =
new double[classCount];
1482 for (x = 0; x < classCount; x++)
1486 double totalNonNoise = 0;
1487 double totalNonNoiseRight = 0;
1489 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1491 bool noiseClass = classes[knownClassNum].UnDefined ();
1493 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
1495 totals[predClassNum] += predictedCountsCM[knownClassNum] [predClassNum];
1498 PrintSingleLineLatexTable (outFile,
1500 classes [knownClassNum].Name (),
1501 countsByKnownClass [knownClassNum],
1502 predictedCountsCM [knownClassNum]
1505 outFile <<
"\\hline" << endl;
1509 totalNonNoise = totalNonNoise + countsByKnownClass [knownClassNum];
1510 totalNonNoiseRight = totalNonNoiseRight + predictedCountsCM [knownClassNum] [knownClassNum];
1515 outFile <<
"\\hline" << endl;
1517 PrintSingleLineLatexTable (outFile,
1524 outFile <<
"\\hline" << endl;
1526 outFile <<
"\\end{tabular}" << endl;
1530 <<
"\\vspace{16pt}" << endl
1534 PrintLatexTableColumnHeaders (outFile);
1536 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1538 PrintPercentLineLatexTable (outFile,
1540 classes [knownClassNum].Name (),
1541 countsByKnownClass [knownClassNum],
1542 predictedCountsCM [knownClassNum]
1544 outFile <<
"\\hline" << endl;
1547 outFile <<
"\\end{tabular}" << endl;
1571 if (totalCount != 0)
1572 perc = correctCount / totalCount;
1574 outFile <<
"Overall Accuracy is " 1576 << (100.0 * perc) <<
"%" 1582 outFile << setw (25) <<
"Class Names";
1584 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1587 colDesc << (knownClassNum + 1);
1595 outFile << setw (25) <<
"===========";
1596 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1598 outFile << setw (6) <<
"====";
1602 double* totals =
new double[classCount];
1603 for (x = 0; x < classCount; x++)
1607 double totalNonNoise = 0;
1608 double totalNonNoiseRight = 0;
1610 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1612 bool noiseClass = classes[knownClassNum].UnDefined ();
1614 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
1616 totals[predClassNum] += predictedCountsCM [knownClassNum] [predClassNum];
1619 PrintSingleLineShort (outFile,
1620 classes [knownClassNum].Name (),
1621 countsByKnownClass [knownClassNum],
1622 predictedCountsCM [knownClassNum]
1626 totalNonNoise += countsByKnownClass [knownClassNum];
1627 totalNonNoiseRight += predictedCountsCM [knownClassNum] [knownClassNum];
1632 PrintSingleLineShort (outFile,
1638 outFile << endl << endl;
1640 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
1642 PrintPercentLineShort (outFile,
1643 classes [knownClassNum].Name (),
1644 countsByKnownClass [knownClassNum],
1645 predictedCountsCM [knownClassNum]
1654 if (totalNonNoise != 0)
1655 perc = (
double)totalNonNoiseRight / (
double)totalNonNoise;
1657 outFile <<
"Accuracy for Non Noise " 1663 outFile << endl << endl;
1672 double total = x + y;
1676 return 100.0 * x / total;
1684 kkint32 numOfClasses = classes.QueueSize ();
1690 double* falsePositives =
new double[numOfClasses];
1691 double* falseNegatives =
new double[numOfClasses];
1692 double* truePositives =
new double[numOfClasses];
1693 double* trueNegatives =
new double[numOfClasses];
1695 double totalTP = 0.0;
1696 double totalFP = 0.0;
1697 double totalTN = 0.0;
1698 double totalFN = 0.0;
1701 for (x = 0; x < numOfClasses; x++)
1703 truePositives [x] = predictedCountsCM [x][x];
1704 totalTP += predictedCountsCM[x][x];
1706 trueNegatives [x] = 0.0;
1707 falsePositives[x] = 0.0;
1708 falseNegatives[x] = 0.0;
1710 for (y = 0; y < numOfClasses; y++)
1714 falsePositives[x] += predictedCountsCM [y][x];
1715 totalFP += predictedCountsCM [y][x];
1717 falseNegatives[x] += predictedCountsCM [x][y];
1718 totalFN += predictedCountsCM [x][y];
1720 trueNegatives [x] += (countsByKnownClass [y] - predictedCountsCM [y][x]);
1721 totalTN += (countsByKnownClass [y] - predictedCountsCM [y][x]);
1727 KKStr titleLine1, titleLine2;
1728 classes.ExtractTwoTitleLines (titleLine1, titleLine2);
1730 r <<
"\t" <<
"" "\t" << titleLine1 << endl;
1731 r <<
"\t" <<
"Total" <<
"\t" << titleLine2 << endl;
1733 r <<
"TruePositives" <<
"\t" << totalTP;
1734 for (x = 0; x < numOfClasses; x++)
1736 r <<
"\t" << truePositives[x];
1740 r <<
"FalsePositives" <<
"\t" << totalFP;
1741 for (x = 0; x < numOfClasses; x++)
1743 r <<
"\t" << falsePositives[x];
1747 r <<
"TrueNegatives" <<
"\t" << totalTN;
1748 for (x = 0; x < numOfClasses; x++)
1750 r <<
"\t" << trueNegatives[x];
1754 r <<
"FalseNegatives" <<
"\t" << totalFN;
1755 for (x = 0; x < numOfClasses; x++)
1757 r <<
"\t" << falseNegatives[x];
1762 r <<
"Sensitivity(TP/(TP+FN))" <<
"\t" << StrFormatDouble(PercentOf (totalTP, totalFN),
"zzz,zz0.00") <<
"%";
1763 for (x = 0; x < numOfClasses; x++)
1765 r <<
"\t" << StrFormatDouble(PercentOf (truePositives[x], falseNegatives[x]),
"zzz,zz0.00") <<
"%";
1769 r <<
"Specificity(TN/(TN+FP))" <<
"\t" << StrFormatDouble(PercentOf (totalTN, totalFP),
"zzz,zz0.00") <<
"%";
1770 for (x = 0; x < numOfClasses; x++)
1772 r <<
"\t" << StrFormatDouble(PercentOf (trueNegatives[x], falsePositives[x]),
"zzz,zz0.00") <<
"%";
1776 r <<
"PositivePredictiveValue(TP/(TP+FP))" <<
"\t" << StrFormatDouble(PercentOf (totalTP, totalFP),
"zzz,zz0.00") <<
"%";
1777 for (x = 0; x < numOfClasses; x++)
1779 r <<
"\t" << StrFormatDouble(PercentOf (truePositives[x], falsePositives[x]),
"zzz,zz0.00") <<
"%";
1784 double fMeasure = 0.0;
1785 double divisor = 2.0 * (
double)totalTP + (
double)totalFP + (
double)totalFN;
1787 fMeasure = 100.0 * (2.0 * (
double)totalTP / divisor);
1789 r <<
"F-Measure(2*TP/(2*TP + FP + FN))" <<
"\t" << StrFormatDouble(fMeasure,
"zzz,zz0.00") <<
"%";
1790 for (x = 0; x < numOfClasses; x++)
1793 divisor = 2.0 * (
double)truePositives[x] + (
double)falsePositives[x] + (
double)falseNegatives[x];
1795 fMeasure = 100.0 * (2.0 * (
double)truePositives[x] / divisor);
1797 r <<
"\t" << StrFormatDouble(fMeasure,
"zzz,zz0.00") <<
"%";
1802 delete[] falseNegatives;
1803 delete[] falsePositives;
1804 delete[] trueNegatives;
1805 delete[] truePositives;
1811 double& truePositives,
1812 double& trueNegatives,
1813 double& falsePositives,
1814 double& falseNegatives
1818 truePositives = 0.0;
1819 trueNegatives = 0.0;
1820 falsePositives = 0.0;
1821 falseNegatives = 0.0;
1823 kkint32 x = classes.PtrToIdx (ic);
1827 kkint32 numOfClasses = classes.QueueSize ();
1829 truePositives = predictedCountsCM [x][x];
1831 for (
kkint32 y = 0; y < numOfClasses; y++)
1835 falsePositives += predictedCountsCM [y][x];
1836 falseNegatives += predictedCountsCM [x][y];
1837 trueNegatives += (countsByKnownClass [y] - predictedCountsCM [y][x]);
1850 kkint32 positiveIDX = classes.PtrToIdx (positiveClass);
1851 if (positiveIDX < 0)
1853 KKStr invalidClassName =
"";
1855 invalidClassName
= positiveClass
->Name ();
1857 log.Level (-1) <<
"ConfusionMatrix2::FMeasure ***ERROR*** Invalid Positive Class Specified[" << invalidClassName <<
"]" << endl;
1861 kkint32 numOfClasses = classes.QueueSize ();
1865 double totalTP = 0.0;
1866 double totalFP = 0.0;
1867 double totalTN = 0.0;
1868 double totalFN = 0.0;
1870 totalTP = predictedCountsCM[positiveIDX][positiveIDX];
1872 for (y = 0; y < numOfClasses; y++)
1874 if (y != positiveIDX)
1876 totalFP += predictedCountsCM[y][positiveIDX];
1877 totalTN += predictedCountsCM[y][y];
1878 totalFN += predictedCountsCM[positiveIDX][y];
1882 double fMeasure = 0.0;
1883 double divisor = 2.0 * (
double)totalTP + (
double)totalFP + (
double)totalFN;
1885 fMeasure = 100.0 * (2.0 * (
double)totalTP / divisor);
1887 return (
float)fMeasure;
1901 outFile <<
"Size" <<
"\t";
1904 for (classNum = 0; classNum < classCount; classNum++)
1907 outFile << classes[classNum].Name ();
1913 for (bucket = 0; bucket < numOfBuckets; bucket++)
1915 outFile << ((bucket + 1) * bucketSize) <<
"\t";
1919 for (classNum = 0; classNum < classCount; classNum++)
1921 outFile << countByKnownClassBySize [classNum][bucket] <<
"\t" 1922 << correctByKnownClassBySize [classNum][bucket] <<
"\t";
1941 outFile <<
"Prob" <<
"\t";
1944 for (classNum = 0; classNum < classCount; classNum++)
1947 outFile << classes[classNum].Name ();
1953 outFile << setiosflags (ios::fixed);
1955 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
1957 outFile << ((bucket + 1) * probBucketSize) <<
"%\t";
1961 for (classNum = 0; classNum < classCount; classNum++)
1965 double count = countByKnownClassByProb [classNum][bucket];
1966 double correct = correctByKnownClassByProb [classNum][bucket];
1969 perc = 100.0 * (
double)correct / (
double)count;
1973 outFile << count <<
"\t" << correct <<
"\t" << setprecision (1) << perc <<
"% \t";
1993 <<
"Error by size" << endl
1996 outFile <<
"ClassName\tAvg Size\t";
1997 for (bucket = 0; bucket < numOfBuckets; bucket++)
1999 outFile << ((bucket + 1) * bucketSize) <<
"\t";
2005 for (classNum = 0; classNum < classCount; classNum++)
2008 if (countsByKnownClass [classNum] != 0)
2009 avg = totalSizesByKnownClass[classNum] / countsByKnownClass [classNum];
2013 outFile << classes[classNum].Name ()
2018 for (bucket = 0; bucket < numOfBuckets; bucket++)
2020 outFile <<
"\t" << countByKnownClassBySize[classNum][bucket];
2025 outFile << classes[classNum].Name () <<
" Correct" <<
"\t";
2026 for (bucket = 0; bucket < numOfBuckets; bucket++)
2028 outFile <<
"\t" << correctByKnownClassBySize [classNum][bucket];
2040 outFile <<
"ClassName\tAvg Size\t";
2041 for (bucket = 0; bucket < numOfBuckets; bucket++)
2043 outFile << ((bucket + 1) * bucketSize) <<
"\t";
2049 for (classNum = 0; classNum < classCount; classNum++)
2052 if (countsByKnownClass [classNum] != 0)
2053 avg = totalSizesByKnownClass[classNum] / countsByKnownClass [classNum];
2057 outFile << classes[classNum].Name ()
2062 for (bucket = 0; bucket < numOfBuckets; bucket++)
2065 if (countByKnownClassBySize[classNum][bucket] != 0)
2066 a = (
float)(correctByKnownClassBySize [classNum][bucket]) / (
float)(countByKnownClassBySize[classNum][bucket]);
2068 outFile <<
"\t" << a;
2090 double* totalCount =
new double[numOfProbBuckets];
2091 double* totalCorrect =
new double[numOfProbBuckets];
2093 for (x = 0; x < numOfProbBuckets; x++)
2096 totalCorrect [x] = 0;
2099 outFile <<
"ClassName\tAvg Prob\t";
2100 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2102 outFile << ((bucket + 1) * probBucketSize) <<
"%\t";
2108 for (classNum = 0; classNum < classCount; classNum++)
2111 if (countsByKnownClass [classNum] != 0)
2112 avg = 100.0 * totalPredProbsByKnownClass [classNum] / countsByKnownClass [classNum];
2116 outFile << classes[classNum].Name ()
2121 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2123 outFile <<
"\t" << countByKnownClassByProb [classNum][bucket];
2124 totalCount[bucket] = totalCount[bucket] + countByKnownClassByProb [classNum][bucket];
2130 outFile << classes[classNum].Name () <<
" Correct" <<
"\t";
2131 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2133 outFile <<
"\t" << correctByKnownClassByProb [classNum][bucket];
2134 totalCorrect [bucket] = totalCorrect [bucket] + correctByKnownClassByProb [classNum][bucket];
2139 outFile <<
"Accuracy" <<
"\t";
2140 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2144 if (countByKnownClassByProb [classNum][bucket] <= 0.0)
2147 perc = 100.0 * correctByKnownClassByProb [classNum][bucket] / countByKnownClassByProb [classNum][bucket];
2149 outFile <<
"\t" << perc <<
"%";
2158 outFile <<
"Total" <<
"\t";
2159 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2161 outFile <<
"\t" << totalCount[bucket];
2166 outFile <<
"Correct" <<
"\t";
2167 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2169 outFile <<
"\t" << totalCorrect[bucket];
2173 outFile <<
"Accuracy" <<
"\t";
2174 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2178 if (totalCount[bucket] <= 0)
2181 perc = 100.0 * totalCorrect[bucket] / totalCount[bucket];
2183 outFile <<
"\t" << perc <<
"%";
2186 delete[] totalCount; totalCount = NULL;
2187 delete[] totalCorrect; totalCorrect = NULL;
2203 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2205 outFile <<
"\t" << ((bucket + 1) * probBucketSize) <<
"%";
2221 double* count =
new double[numOfProbBuckets];
2223 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2231 for (classNum = 0; classNum < classCount; classNum++)
2233 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2235 count[bucket] = count[bucket] + countByKnownClassByProb [classNum][bucket];
2240 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2242 total = total + count[bucket];
2247 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2249 outFile <<
"\t" << count[bucket];
2268 double* count =
new double[numOfProbBuckets];
2269 double* correct =
new double[numOfProbBuckets];
2271 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2274 correct [bucket] = 0;
2278 for (classNum = 0; classNum < classCount; classNum++)
2280 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2282 count [bucket] = count [bucket] + countByKnownClassByProb [classNum][bucket];
2283 correct[bucket] = correct[bucket] + correctByKnownClassByProb [classNum][bucket];
2288 double overallAccuracy = 0.0;
2291 double totalCount = 0;
2292 double totalCorrect = 0;
2294 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2296 totalCount = totalCount + count[bucket];
2297 totalCorrect = totalCorrect + correct[bucket];
2300 if (totalCount == 0)
2302 overallAccuracy = 0.0;
2306 overallAccuracy = 100.0 * (
double)totalCorrect / (
double)totalCount;
2310 outFile << setprecision (2);
2312 outFile << overallAccuracy <<
"%";
2314 for (bucket = 0; bucket < numOfProbBuckets; bucket++)
2316 double accuracy = 0.0;
2318 if (count[bucket] > 0)
2319 accuracy = 100.0 * (
double)correct[bucket] / (
double)count[bucket];
2321 outFile <<
"\t" << accuracy <<
"%";
2326 delete[] count; count = NULL;
2327 delete[] correct; correct = NULL;
2343 for (classNum = 0; classNum < classCount; classNum++)
2344 PrintErrorBySizeRowReduced (outFile, classNum);
2358 double* bucketCount =
new double[numOfBuckets];
2359 double* bucketCorrect =
new double[numOfBuckets];
2365 while (bucket < numOfBuckets)
2367 double countInCol = 0.0;
2368 double countCorrectInCol = 0.0;
2370 while ((bucket < numOfBuckets) && (countInCol < 20))
2372 countInCol = countInCol + countByKnownClassBySize [classNum][bucket];
2373 countCorrectInCol = countCorrectInCol + correctByKnownClassBySize [classNum][bucket];
2377 bucketHeadings[numNewBuckets] = bucket * bucketSize;
2378 bucketCount[numNewBuckets] = countInCol;
2379 bucketCorrect[numNewBuckets] = countCorrectInCol;
2384 outFile <<
"Class_Name\tAvg_Size";
2385 for (bucket = 0; bucket < numNewBuckets; bucket++)
2387 outFile <<
"\t" << bucketHeadings[bucket];
2393 if (countsByKnownClass [classNum] != 0)
2394 avg = totalSizesByKnownClass [classNum] / countsByKnownClass [classNum];
2399 outFile << classes[classNum].Name () <<
"\t" << avg;
2401 for (bucket = 0; bucket < numNewBuckets; bucket++)
2403 outFile <<
"\t" << bucketCount[bucket];
2408 for (bucket = 0; bucket < numNewBuckets; bucket++)
2410 outFile <<
"\t" << bucketCorrect[bucket];
2416 for (bucket = 0; bucket < numNewBuckets; bucket++)
2418 double accuracy = 0;
2419 if (bucketCount[bucket] <= 0)
2425 accuracy = 100.0 * (
double)bucketCorrect[bucket] / (
double)bucketCount[bucket];
2428 outFile <<
"\t" << accuracy <<
"%";
2435 delete[] bucketHeadings;
2436 delete[] bucketCount;
2437 delete[] bucketCorrect;
2448 double* accuracys =
new double[classCount];
2450 for (x = 0; x < classCount; x++)
2452 if (countsByKnownClass [x] == 0)
2455 accuracys[x] = (100.0 * (
double) predictedCountsCM [x] [x]) / ((
double) (countsByKnownClass [x]));
2461 for (x = 0; x < classCount; x++)
2471 className
= "***UnDefined***";
2476 delete[] accuracys; accuracys = NULL;
2487 if (totalCount == 0)
2490 return 100.0 * correctCount / totalCount;
2498 if (totalCount == 0)
2501 return totalPredProb / (
double)totalCount;
2512 classNum = classes.PtrToIdx (mlClass);
2516 if (countsByKnownClass [classNum] == 0)
2519 float accuracy = (
float)(100.0 * (predictedCountsCM[classNum] [classNum]) / (countsByKnownClass [classNum]));
2530 for (
kkint32 classNum = 0; classNum < classCount; classNum++)
2532 if (countsByKnownClass [classNum] == 0)
2534 accuracies.push_back (0.0f);
2538 float classAccuracy = (
float)(100.0f * (predictedCountsCM[classNum] [classNum]) / (countsByKnownClass [classNum]));
2539 accuracies.push_back (classAccuracy);
2550 kkint32 classCount = classes.QueueSize ();
2551 float totalAccuracy = 0.0f;
2553 for (
kkint32 classNum = 0; classNum < classCount; classNum++)
2555 if (countsByKnownClass [classNum] != 0)
2557 float classAccuracy = (
float)(100.0f * (predictedCountsCM[classNum] [classNum]) / (countsByKnownClass [classNum]));
2558 totalAccuracy += classAccuracy;
2562 float weightedAccuracy = (
float)(totalAccuracy / classCount);
2564 return weightedAccuracy;
2575 kkint32 numClasses = classes.QueueSize ();
2577 while ((classNum < numClasses) && (!found))
2579 if (classes[classNum].UpperName () == mlClass->UpperName ())
2588 return countsByKnownClass [classNum];
2601 correctCount *= factor;
2602 totalCount *= factor;
2603 totalPredProb *= factor;
2604 numInvalidClassesPredicted *= factor;
2606 for (x = 0; x < classCount; x++)
2608 countsByKnownClass [x] = countsByKnownClass [x] * factor;
2609 totalSizesByKnownClass [x] = totalSizesByKnownClass [x] * factor;
2610 totalPredProbsByKnownClass [x] = totalPredProbsByKnownClass [x] * factor;
2614 for (y = 0; y < classCount; y++)
2616 predictedCountsCM[x][y] = predictedCountsCM[x][y] * factor;
2617 totPredProbCM [x][y] = totPredProbCM [x][y] * factor;
2620 for (y = 0; y < numOfBuckets; y++)
2622 countByKnownClassBySize [x][y] = countByKnownClassBySize [x][y] * factor;
2623 correctByKnownClassBySize [x][y] = correctByKnownClassBySize [x][y] * factor;
2626 for (y = 0; y < numOfProbBuckets; y++)
2628 countByKnownClassByProb [x][y] = countByKnownClassByProb [x][y] * factor;
2629 correctByKnownClassByProb [x][y] = correctByKnownClassByProb [x][y] * factor;
2650 file <<
"<html>" << endl;
2651 file <<
"<head>" << endl;
2652 file <<
"<title>" << title <<
"</title>" << endl;
2653 file <<
"<body bgcolor=\"white\">" << endl;
2656 file <<
"<h1>" << title <<
"</h1>" << endl;
2659 file <<
"<p><b>Overall Accuracy</b> is " 2661 << (100.0 * correctCount / totalCount) <<
"%" 2667 file <<
"<table cellpadding=\"2\" cellspacing=\"0\" border=\"2\">" << endl;
2668 file <<
"<tr>" << endl;
2671 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>Class Names</b></th>" << endl;
2672 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>Totals</b></th>" << endl;
2673 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
2675 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>" << classes[knownClassNum].Name() <<
"</b></th>" << endl;
2677 file <<
"</tr>" << endl;
2679 double *totals =
new double[classCount];
2680 for (x = 0; x < classCount; x++)
2685 double totalNonNoise = 0;
2686 double totalNonNoiseRight = 0;
2689 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
2691 bool noiseClass = classes[knownClassNum].UnDefined();
2692 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
2694 totals[predClassNum] += predictedCountsCM[knownClassNum] [predClassNum];
2697 file <<
"<tr>" << endl;
2698 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>" << classes [knownClassNum].Name() <<
"</b></th>" << endl;
2699 file <<
"<td align=\"center\" bgcolor=\"#EFEFEF\">" << countsByKnownClass [knownClassNum] <<
"</td>" << endl;
2701 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
2703 if (predClassNum == knownClassNum)
2704 file <<
"<td align=\"center\" bgcolor=\"#EEEEEE\">";
2706 file <<
"<td align=\"center\">";
2707 file << predictedCountsCM[knownClassNum][predClassNum];
2708 file <<
"</td>" << endl;
2710 file <<
"</tr>" << endl;
2713 totalNonNoise = totalNonNoise + countsByKnownClass [knownClassNum];
2714 totalNonNoiseRight += predictedCountsCM [knownClassNum] [knownClassNum];
2719 file <<
"<tr>" << endl;
2720 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>Totals</b></th>" << endl;
2721 file <<
"<td align=\"center\" bgcolor=\"#EEEEEE\">" << totalCount <<
"</b></th>" << endl;
2723 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
2725 file <<
"<td align=\"center\">";
2726 file << totals[predClassNum];
2727 file <<
"</td>" << endl;
2729 file <<
"</tr>" << endl;
2730 file <<
"</table>" << endl;
2735 file <<
"<br/>" << endl;
2736 file <<
"<p><b>Accuracy for Non Noise</b> " 2738 << (((
double)totalNonNoiseRight / (
double)totalNonNoise) * 100.0)
2741 file <<
"<table cellpadding=\"2\" cellspacing=\"0\" border=\"2\">" << endl;
2742 file <<
"<tr>" << endl;
2745 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>Class Names</b></th>" << endl;
2746 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>Totals</b></th>" << endl;
2747 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
2749 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>" << classes[knownClassNum].Name() <<
"</b></th>" << endl;
2751 file <<
"</tr>" << endl;
2755 for (knownClassNum = 0; knownClassNum < classCount; knownClassNum++)
2757 file <<
"<tr>" << endl;
2758 file <<
"<th align=\"center\" bgcolor=\"#CCCCCC\"><b>" << classes[knownClassNum].Name() <<
"</b></th>" << endl;
2759 file <<
"<td align=\"center\" bgcolor=\"#EFEFEF\">" << setprecision (4) << (countsByKnownClass [knownClassNum]/totalCount*100) <<
"</td>" << endl;
2761 for (predClassNum = 0; predClassNum < classCount; predClassNum++)
2763 if (predClassNum == knownClassNum)
2764 file <<
"<td align=\"center\" bgcolor=\"#EEEEEE\">";
2766 file <<
"<td align=\"center\">";
2767 if (countsByKnownClass [knownClassNum] <= 0)
2770 perc = predictedCountsCM [knownClassNum][predClassNum] / countsByKnownClass [knownClassNum] * 100.0;
2772 file << setprecision (4) << perc;
2773 file <<
"</td>" << endl;
2775 file <<
"</tr>" << endl;
2777 file <<
"</table>" << endl;
2779 file <<
"</body>" << endl;
2780 file <<
"</html>" << endl;
2791 MLClassList::const_iterator idx;
2792 for (idx = classList.begin (); idx != classList.end (); ++idx)
2795 if (classes.PtrToIdx (ic) < 0)
2796 AddClassToConfusionMatrix (ic, log);
2806 MakeSureWeHaveTheseClasses (cm.classes, log);
2808 kkint32 numOfClasses = classes.QueueSize ();
2815 vector<kkint32> ind (numOfClasses, 0);
2816 for (classIDX = 0; classIDX < numOfClasses; classIDX++)
2818 MLClassPtr mlClass = classes.IdxToPtr (classIDX);
2819 kkint32 cmsIDX = cm.classes.PtrToIdx (mlClass);
2820 ind[classIDX] = cmsIDX;
2823 for (classIDX = 0; classIDX < numOfClasses; classIDX++)
2825 kkint32 cmsIDX = ind[classIDX];
2832 countsByKnownClass [classIDX] += cm.countsByKnownClass [cmsIDX];
2833 totalSizesByKnownClass [classIDX] += cm.totalSizesByKnownClass [cmsIDX];
2834 totalPredProbsByKnownClass [classIDX] += cm.totalPredProbsByKnownClass [cmsIDX];
2836 kkint32 predictedClassIDX = 0;
2837 for (predictedClassIDX = 0; predictedClassIDX < numOfClasses; predictedClassIDX++)
2839 kkint32 cmsPredictedClassIDX = ind[predictedClassIDX];
2840 if (cmsPredictedClassIDX >= 0)
2842 predictedCountsCM[classIDX][predictedClassIDX] += cm.predictedCountsCM[cmsIDX][cmsPredictedClassIDX];
2843 totPredProbCM [classIDX][predictedClassIDX] += cm.totPredProbCM [cmsIDX][cmsPredictedClassIDX];
2848 for (bucketIDX = 0; bucketIDX < numOfBuckets; bucketIDX++)
2850 countByKnownClassBySize [classIDX][bucketIDX] += cm.countByKnownClassBySize [cmsIDX][bucketIDX];
2851 correctByKnownClassBySize [classIDX][bucketIDX] += cm.correctByKnownClassBySize [cmsIDX][bucketIDX];
2855 for (probIDX = 0; probIDX < numOfProbBuckets; probIDX++)
2857 countByKnownClassByProb [classIDX][probIDX] += cm.countByKnownClassByProb [cmsIDX][probIDX];
2858 correctByKnownClassByProb [classIDX][probIDX] += cm.correctByKnownClassByProb [cmsIDX][probIDX];
2863 correctCount += cm.correctCount;
2864 totalCount += cm.totalCount;
2865 totalPredProb += cm.totalPredProb;
2870 template<
typename T>
2876 kkint32 x = _count * 10;
2879 for (kkint32 x = 0; x < _count; x++)
2882 s.Append (_delimiter);
2890 template<
typename T>
2895 KKStr s (v.size () * 10);
2897 for (kkuint32 x = 0; x < v.size (); x++)
2899 if (x > 0) s.Append (delimiter);
2917 kkint32 lastField = (kkint32)fields.size ();
2918 for (kkint32 idx = 0; idx < lastField; ++idx)
2919 v.push_back (fields[idx].ToInt32 ());
2920 while (v.size () < (kkuint32)minSize)
2921 v.push_back ((kkint32)0);
2934 kkint32 lastField = (kkint32)fields.size ();
2935 for (kkint32 idx = 0; idx < lastField; idx++)
2936 v.push_back (fields[idx].ToDouble ());
2937 while (v.size () < (kkuint32)minSize)
2938 v.push_back ((
double)0);
2952 kkint32 lastField = Min ((kkint32)fields.size (), _count);
2953 for (kkint32 idx = 0; idx < lastField; idx++)
2954 _array[idx] = fields[idx].ToInt ();
2967 kkint32 lastField = Min ((kkint32)fields.size (), _count);
2968 for (kkint32 idx = 0; idx < lastField; idx++)
2969 _array[idx] = fields[idx].ToDouble ();
2978 f <<
"<ConfusionMatrix2>" << endl;
2980 f <<
"Classes" <<
"\t" << classes.ToCommaDelimitedStr () << endl;
2982 f <<
"ClassCount" <<
"\t" << classCount << endl
2983 <<
"BucketSize" <<
"\t" << bucketSize << endl
2984 <<
"probBucketSize" <<
"\t" << probBucketSize << endl
2985 <<
"NumOfBuckets" <<
"\t" << numOfBuckets << endl
2986 <<
"NumOfProbBuckets" <<
"\t" << numOfProbBuckets << endl
2988 <<
"TotalCount" <<
"\t" << totalCount << endl
2989 <<
"CorrectCount" <<
"\t" << correctCount << endl
2990 <<
"TotalPredProb" <<
"\t" << totalPredProb << endl
2991 <<
"NumInvalidClassesPredicted" <<
"\t" << numInvalidClassesPredicted << endl
2994 f <<
"CountsByKnownClass" <<
"\t" << ArrayToDelimitedDelimitedStr (countsByKnownClass,
',') << endl;
2995 f <<
"TotalSizesByKnownClass" <<
"\t" << ArrayToDelimitedDelimitedStr (totalSizesByKnownClass,
',') << endl;
2996 f <<
"TotalPredProbsByKnownClass" <<
"\t" << ArrayToDelimitedDelimitedStr (totalPredProbsByKnownClass,
',') << endl;
3000 MLClassList::const_iterator idx;
3001 for (idx = classes.begin (); idx != classes.end (); idx++)
3004 f <<
"ClassTotals" <<
"\t" <<
"ClassName" <<
"\t" << mlClass->Name ().QuotedStr () <<
"\t" <<
"ClassIndex" <<
"\t" << classIndex << endl;
3006 f <<
"CountByKnownClassBySize" <<
"\t" << ArrayToDelimitedDelimitedStr (countByKnownClassBySize [classIndex], numOfBuckets,
',') << endl;
3007 f <<
"CorrectByKnownClassBySize" <<
"\t" << ArrayToDelimitedDelimitedStr (correctByKnownClassBySize [classIndex], numOfBuckets,
',') << endl;
3009 f <<
"CountByKnownClassByProb" <<
"\t" << ArrayToDelimitedDelimitedStr (countByKnownClassByProb [classIndex], numOfProbBuckets,
',') << endl;
3010 f <<
"CorrectByKnownClassByProb" <<
"\t" << ArrayToDelimitedDelimitedStr (correctByKnownClassByProb [classIndex], numOfProbBuckets,
',') << endl;
3012 f <<
"PredictedCountsCM" <<
"\t" << ArrayToDelimitedDelimitedStr (predictedCountsCM [classIndex], classCount,
',') << endl;
3014 f <<
"TotPredProbCM" <<
"\t" << ArrayToDelimitedDelimitedStr (totPredProbCM [classIndex], classCount,
',') << endl;
3019 f <<
"</ConfusionMatrix2>" << endl;
3033 log.Level (-1) << endl <<
"ConfusionMatrix2::BuildFromIstreamXML ***ERROR*** File already at EOF." << endl << endl;
3041 kkint64 startPos = f.tellg ();
3047 kkint32 numOfProbBuckets = -1;
3050 f.getline (buff,
sizeof (buff));
3051 while ((!f.eof ()) && ((!classes) || (bucketSize < 1) || (numOfBuckets < 1) || (numOfProbBuckets < 1) || (probBucketSize < 1) || (classCount < 1)))
3056 if (l.CompareIgnoreCase (
"</ConfusionMatrix2>") == 0)
3059 KKStr lineName = l.ExtractToken2 (
"\t");
3060 if (lineName.CompareIgnoreCase (
"Classes") == 0)
3061 classes = MLClassList::BuildListFromDelimtedStr (l,
'\t');
3063 else if (lineName.CompareIgnoreCase (
"bucketSize") == 0)
3064 bucketSize = l.ExtractTokenInt (
"\t\n\r");
3066 else if (lineName.CompareIgnoreCase (
"classCount") == 0)
3067 classCount = l.ExtractTokenInt (
"\t\n\r");
3069 else if (lineName.CompareIgnoreCase (
"numOfBuckets") == 0)
3070 numOfBuckets = l.ExtractTokenInt (
"\t\n\r");
3072 else if (lineName.CompareIgnoreCase (
"numOfProbBuckets") == 0)
3073 numOfProbBuckets = l.ExtractTokenInt (
"\t\n\r");
3075 else if (lineName.CompareIgnoreCase (
"probBucketSize") == 0)
3076 probBucketSize = l.ExtractTokenInt (
"\t\n\r");
3078 f.getline (buff,
sizeof (buff));
3081 if (classes == NULL)
3083 log.Level (-1) << endl
3084 <<
"ConfusionMatrix2::BuildFromIstreamXML ***ERROR*** No Class List Was Provided." << endl
3090 if ((bucketSize < 1) || (numOfBuckets < 1) || (numOfProbBuckets < 1) || (probBucketSize < 1))
3092 delete classes; classes = NULL;
3093 log.Level (-1) << endl
3094 <<
"ConfusionMatrix2::BuildFromIstreamXML ***ERROR*** Not all needed header fields were defined." << endl
3095 <<
" bucketSize[" << bucketSize <<
"] ClassCount[" << classCount <<
"] numOfBuckets[" << numOfBuckets <<
"] numOfProbBuckets[" << numOfProbBuckets <<
"] probBucketSize[" << probBucketSize <<
"]" << endl
3102 if (classCount != classes->QueueSize ())
3104 log.Level (-1) << endl
3105 <<
"ConfusionMatrix2::BuildFromIstreamXML ***ERROR*** Disagreement between ClassCount[" << classCount <<
"] and Classes.QueueSize[" << classes->QueueSize () <<
"]" << endl
3107 delete classes; classes = NULL;
3115 delete classes; classes = NULL;
3128 log.Level (-1) <<
"ConfusionMatrix2::Read ***ERROR*** File at EOF can not read any data." << endl;
3140 kkint32 numOfProbBuckets = -1;
3144 KKStr className =
"";
3146 f.getline (buff,
sizeof (buff));
3154 if (l.CompareIgnoreCase (
"</ConfusionMatrix2>") == 0)
3157 KKStr lineName = l.ExtractToken (
"\t\n\r");
3159 if (lineName.CompareIgnoreCase (
"ClassCount") == 0)
3160 classCount = l.ExtractTokenInt (
"\t\n\r");
3162 else if (lineName.CompareIgnoreCase (
"BucketSize") == 0)
3163 bucketSize = l.ExtractTokenInt (
"\t");
3165 else if (lineName.CompareIgnoreCase (
"probBucketSize") == 0)
3166 bucketSize = l.ExtractTokenInt (
"\t");
3168 else if (lineName.CompareIgnoreCase (
"NumOfBuckets") == 0)
3169 numOfBuckets = l.ExtractTokenInt (
"\t");
3171 else if (lineName.CompareIgnoreCase (
"NumOfProbBuckets") == 0)
3172 numOfProbBuckets = l.ExtractTokenInt (
"\t");
3174 else if (lineName.CompareIgnoreCase (
"TotalCount") == 0)
3175 totalCount = l.ExtractTokenDouble (
"\t");
3177 else if (lineName.CompareIgnoreCase (
"CorrectCount") == 0)
3178 correctCount = l.ExtractTokenDouble (
"\t");
3180 else if (lineName.CompareIgnoreCase (
"TotalPredProb") == 0)
3181 totalPredProb = l.ExtractTokenDouble (
"\t");
3183 else if (lineName.CompareIgnoreCase (
"NumInvalidClassesPredicted") == 0)
3184 numInvalidClassesPredicted = l.ExtractTokenDouble (
"\t");
3186 else if (lineName.CompareIgnoreCase (
"CountsByKnownClass") == 0)
3187 DelimitedStrToArray (countsByKnownClass, classCount, l,
',');
3189 else if (lineName.CompareIgnoreCase (
"TotalSizesByKnownClass") == 0)
3190 DelimitedStrToArray (totalSizesByKnownClass, classCount, l,
',');
3192 else if (lineName.CompareIgnoreCase (
"TotalPredProbsByKnownClass") == 0)
3193 DelimitedStrToArray (totalPredProbsByKnownClass, classCount, l,
',');
3195 else if (lineName.CompareIgnoreCase (
"ClassTotals") == 0)
3197 KKStr classNameLabel = l.ExtractToken (
"\t");
3198 className = l.ExtractToken (
"\t");
3200 KKStr classIndexLabel = l.ExtractToken (
"\t");
3201 classIndex = l.ExtractTokenInt (
"\t");
3203 if ((classIndex < 0) || (classIndex >= classCount))
3205 log.Level (-1) << endl
3206 <<
"ConfusionMatrix2::Read ***ERROR*** ClassIndex[" << classIndex <<
"] out of range." << endl
3213 else if (lineName.CompareIgnoreCase (
"CountByKnownClassBySize") == 0)
3214 DelimitedStrToArray (countByKnownClassBySize [classIndex], numOfBuckets, l,
',');
3216 else if (lineName.CompareIgnoreCase (
"CorrectByKnownClassBySize") == 0)
3217 DelimitedStrToArray (correctByKnownClassBySize [classIndex], numOfBuckets, l,
',');
3219 else if (lineName.CompareIgnoreCase (
"CountByKnownClassByProb") == 0)
3220 DelimitedStrToArray (countByKnownClassByProb [classIndex], numOfProbBuckets, l,
',');
3222 else if (lineName.CompareIgnoreCase (
"CorrectByKnownClassByProb") == 0)
3223 DelimitedStrToArray (correctByKnownClassByProb [classIndex], numOfProbBuckets, l,
',');
3225 else if (lineName.CompareIgnoreCase (
"PredictedCountsCM") == 0)
3226 DelimitedStrToArray (predictedCountsCM [classIndex], classCount, l,
',');
3228 else if (lineName.CompareIgnoreCase (
"TotPredProbCM") == 0)
3229 DelimitedStrToArray (totPredProbCM [classIndex], classCount, l,
',');
3232 f.getline (buff,
sizeof (buff));
3253 f <<
"<SimpleConfusionMatrix>" << endl;
3254 f <<
"Classes" <<
"\t" << classes.ToCommaDelimitedStr () << endl;
3257 MLClassList::const_iterator idx;
3258 MLClassList::const_iterator idx2;
3259 for (idx = classes.begin (); idx != classes.end (); idx++)
3262 f <<
"DataRow" <<
"\t" << mlClass->Name () <<
"\t";
3264 for (col = 0; col < classCount; col++)
3267 if (countsByKnownClass[row] != 0.0)
3268 p = predictedCountsCM[row][col] / countsByKnownClass[row];
3273 f << StrFormatDouble (predictedCountsCM[row][col],
"ZZZZZ0.00") <<
":" << StrFormatDouble (p,
"ZZ0.0000000");
3280 f <<
"</SimpleConfusionMatrix>" << std::endl;
3303 if (QueueSize () == 0)
3308 const_iterator cmIDX = begin ();
3309 const ConfusionMatrix2Ptr firstCM = *cmIDX;
3313 for (cmIDX = begin (); cmIDX != end (); cmIDX++)
3315 const ConfusionMatrix2Ptr cm = *cmIDX;
3319 double factor = 1.0 / (
double)QueueSize ();
KKStr(kkint32 size)
Creates a KKStr object that pre-allocates space for 'size' characters.
ConfusionMatrix2(const ConfusionMatrix2 &cm)
void PrintConfusionMatrixHTML(const char *title, ostream &file)
void PrintAccuracyByProbByClassHTML(ostream &o)
double PercentOf(double x, double y)
void PrintErrorByProb(ostream &outFile)
float FMeasure(MLClassPtr positiveClass, RunLog &log) const
void LeftPad(kkint32 width, uchar ch= ' ')
pads the string with enough 'ch' characters on the left side until the string is as long as 'width' c...
VectorFloat AccuracyByClass() const
void PrintConfusionMatrixLatexTable(ostream &outFile)
void PrintConfusionMatrixNarrow(ostream &outFile)
KKStr & operator=(const char *src)
void DelimitedStrToArray(kkint32 *_array, kkint32 _count, const KKStr &_l, char _delimiter)
ConfusionMatrix2(const MLClassList &_classes, istream &f, kkint32 _bucketSize, kkint32 _numOfBuckets, kkint32 _numOfProbBuckets, kkint32 _probBucketSize, RunLog &_log)
void PrintConfusionMatrixAvgPredProbHTML(ostream &o)
float AccuracyClassWeightedEqually()
ConfusionMatrix2 * ConfusionMatrix2Ptr
void PrintTrueFalsePositivesTabDelimited(ostream &outFile)
double Count(MLClassPtr mlClass)
KKStr operator+(const char *right) const
void PrintErrorBySize(ostream &outFile)
KKStr ArrayToDelimitedDelimitedStr(const vector< T > &v, char delimiter)
unsigned __int32 kkuint32
void PrintConfusionMatrixTabDelimited(ostream &outFile)
void PrintConfusionMatrix(ostream &_outFile)
char operator[](kkuint32 i) const
KKStr & operator=(KKStr &&src)
double CountsByKnownClass(kkint32 knownClassIdx) const
kkuint32 Len() const
Returns the number of characters in the string.
void WriteSimpleConfusionMatrix(ostream &f) const
void FactorCounts(double factor)
static ConfusionMatrix2Ptr BuildFromIstreamXML(istream &f, RunLog &log)
KKStr(const KKStr &str)
Copy Constructor.
void AddIn(const ConfusionMatrix2 &cm, RunLog &log)
ConfusionMatrix2Ptr DeriveAverageConfusionMatrix(RunLog &log) const
std::vector< float > VectorFloat
const VectorDouble & CountsByKnownClass() const
ConfusionMatrix2(const MLClassList &_classes)
double AvgPredProb() const
void PrintErrorByProbByRows(ostream &outFile)
static KKStr Concat(const std::vector< std::string > &values)
Concatenates the list of 'std::string' strings.
KKStr ArrayToDelimitedDelimitedStr(T *_array, kkint32 _count, char _delimiter)
void PrintProbDistributionTotalCount(ostream &outFile)
VectorDouble PredictedCounts() const
void PrintProbDistributionTotalError(ostream &outFile)
void PrintErrorBySizeReduced(ostream &outFile)
const KKStr & Name() const
KKStr StripOutInvalidLatexCaracters(const KKStr &src)
std::ostream &__cdecl operator<<(std::ostream &os, const KKStr &str)
ConfussionMatrix2List(bool _owner=true)
void DelimitedStrToArray(vector< double > &v, kkint32 minSize, const KKStr &l, char delimiter)
void ComputeFundamentalStats(MLClassPtr ic, double &truePositives, double &trueNegatives, double &falsePositives, double &falseNegatives) const
KKStr StrFormatDouble(double val, const char *mask)
void Increment(MLClassPtr _knownClass, MLClassPtr _predClass, kkint32 _size, double _probability, RunLog &_log)
double Accuracy(MLClassPtr mlClass)
void PrintConfusionMatrixHTML(ostream &outFile)
KKStr & operator=(const KKStr &src)
void PrintProbDistributionTitle(ostream &outFile)
const MLClassList & MLClasses() const
Used for logging messages.
void EncodeProblem(const struct svm_paramater ¶m, struct svm_problem &prob_in, struct svm_problem &prob_out)
MLClassList * MLClassListPtr
void WriteXML(ostream &f) const
void DelimitedStrToArray(double *_array, kkint32 _count, const KKStr &_l, char _delimiter)
VectorKKStr Split(char del) const
Splits the string up into tokens using 'del' as the separator returning them in a vector...
Maintains a list of MLClass instances.
void PrintErrorBySizeByRows(ostream &outFile)
double PredictedCountsCM(kkint32 knownClassIdx, kkint32 predClassIdx) const
KKStr SubStrPart(kkint32 firstChar) const
returns a SubString consisting of all characters starting at index 'firstChar' until the end of the s...
virtual ~ConfusionMatrix2()
A confusion matrix object that is used to record the results from a CrossValidation. <see also cref="CrossValidation"
std::vector< double > VectorDouble
Vector of doubles.