34 using namespace KKMLL;
51 for (kkint32 i = 1; i < voteLength; i++)
56 maxIndex2 = maxIndex1;
61 else if (maxIndex2 < 0)
67 else if (vote[i] > max2)
87 if (leftVotes < rightVotes)
90 else if (leftVotes > rightVotes)
93 else if (leftProb < rightProb)
96 else if (leftProb > rightProb)
109 else if (prob > 0.999)
115 void SVMModel::GreaterVotes (
bool useProbability,
119 double* probabilities,
126 GetMaxIndex (probabilities, numClasses, pred1Idx , pred2Idx);
132 double max1Prob = probabilities[0];
137 double max2Prob = -1.0f;
140 for (
kkint32 x = 1; x < numClasses; x++)
142 if (votes[x] > max1Votes)
145 else if (votes[x] == max1Votes)
148 if (GreaterThan (votes[x], probabilities[x], max1Votes, max1Prob))
150 max2Votes = max1Votes;
153 max1Votes = votes[x];
154 max1Prob = probabilities[x];
157 else if ((pred2Idx < 0) || GreaterThan (votes[x], probabilities[x], max2Votes, max2Prob))
159 max2Votes = votes[x];
160 max2Prob = probabilities[x];
171 binaryFeatureEncoders (NULL),
172 binaryParameters (NULL),
173 cardinality_table (),
175 classIdxTable (NULL),
176 crossClassProbTable (NULL),
177 crossClassProbTableSize (0),
178 featureEncoder (NULL),
183 oneVsAllAssignment (),
184 oneVsAllClassAssignments (NULL),
185 predictXSpace (NULL),
186 predictXSpaceWorstCase (0),
187 probabilities (NULL),
189 selectedFeatures (NULL),
196 xSpacesTotalAllocated (0)
206 FileDescPtr _fileDesc,
210 assignments (_assignmnets),
211 binaryFeatureEncoders (NULL),
212 binaryParameters (NULL),
214 cardinality_table (),
215 classIdxTable (NULL),
216 crossClassProbTable (NULL),
217 crossClassProbTableSize (0),
218 featureEncoder (NULL),
219 fileDesc (_fileDesc),
223 oneVsAllAssignment (),
224 oneVsAllClassAssignments (NULL),
225 predictXSpace (NULL),
226 predictXSpaceWorstCase (0),
227 probabilities (NULL),
229 selectedFeatures (NULL),
236 xSpacesTotalAllocated (0)
239 if (_examples.QueueSize () < 2)
241 _log.Level (-1) << endl
242 <<
"SVMModel **** ERROR **** NO EXAMPLES TO TRAIN WITH." << endl
255 numOfClasses = (kkint32)assignments.size ();
257 _log.Level (20) <<
"SVMModel::SVMModel - Constructing From Training Data." << endl;
264 ConstructOneVsOneModel (&_examples, prob, _log);
268 ConstructOneVsAllModel (&_examples, prob, _log);
272 ConstructBinaryCombosModel (&_examples, _log);
275 catch (
const exception& e)
277 _log.Level (-1) << endl
278 <<
"SVMModel ***ERROR*** Exception occurred constructing model." << endl
285 _log.Level (-1) << endl
286 <<
"SVMModel ***ERROR*** Exception occurred constructing model." << endl
297 BuildClassIdxTable ();
298 BuildCrossClassProbTable ();
310 if (oneVsAllClassAssignments)
312 for (
kkint32 x = 0; x < numOfModels; x++)
314 if (oneVsAllClassAssignments[x])
316 delete oneVsAllClassAssignments[x];
317 oneVsAllClassAssignments[x] = NULL;
320 delete oneVsAllClassAssignments;
321 oneVsAllClassAssignments = NULL;
324 delete featureEncoder; featureEncoder = NULL;
326 if (binaryParameters)
331 delete[] binaryParameters;
332 binaryParameters = NULL;
335 if (binaryFeatureEncoders)
337 for (x = 0; x < numOfModels; x++)
339 delete binaryFeatureEncoders[x];
340 binaryFeatureEncoders[x] = NULL;
342 delete[] binaryFeatureEncoders;
343 binaryFeatureEncoders = NULL;
346 if (crossClassProbTable)
348 for (x = 0; x < crossClassProbTableSize; x++)
350 delete [] crossClassProbTable[x];
351 crossClassProbTable[x] = NULL;
353 delete[] crossClassProbTable;
354 crossClassProbTable = NULL;
358 delete [] classIdxTable; classIdxTable = NULL;
359 delete [] predictXSpace; predictXSpace = NULL;
360 delete [] probabilities; probabilities = NULL;
361 delete [] votes; votes = NULL;
363 delete selectedFeatures; selectedFeatures = NULL;
364 delete svmParam; svmParam = NULL;
373 for (
kkint32 x = 0; x < numOfModels; x++)
375 if (models[x] != NULL)
393 for (
kkint32 x = 0; x < numOfModels; x++)
395 if (xSpaces[x] != NULL)
404 xSpacesTotalAllocated = 0;
415 models =
new ModelPtr [numOfModels];
417 for (
kkint32 x = 0; x < numOfModels; x++)
430 for (
kkint32 x = 0; x < numOfModels; x++)
439 kkint32 memoryConsumedEstimated =
sizeof (SVMModel)
440 + assignments.MemoryConsumedEstimated ()
441 +
sizeof (kkint16) * oneVsAllAssignment.size ()
442 +
sizeof (kkint32) * cardinality_table.size ()
443 + rootFileName.MemoryConsumedEstimated ()
444 + svmParam->MemoryConsumedEstimated ()
445 +
sizeof (AttributeType) * type_table.size ();
447 if (binaryFeatureEncoders)
450 for (
kkint32 x = 0; x < numOfModels; x++)
452 if (binaryFeatureEncoders[x])
457 if (binaryParameters)
458 memoryConsumedEstimated += numOfModels *
sizeof (BinaryClassParmsPtr);
461 memoryConsumedEstimated += numOfClasses *
sizeof (MLClassPtr);
463 if (crossClassProbTable)
464 memoryConsumedEstimated += crossClassProbTableSize * crossClassProbTableSize *
sizeof (
double);
473 memoryConsumedEstimated += numOfModels *
sizeof (ModelPtr);
474 for (
kkint32 x = 0; x < numOfModels; ++x)
482 if (oneVsAllClassAssignments)
485 for (
kkint32 x = 0; x < numOfModels; ++x)
487 if (oneVsAllClassAssignments[x])
493 memoryConsumedEstimated +=
sizeof (
svm_node) * predictXSpaceWorstCase;
496 memoryConsumedEstimated +=
sizeof (
double) * numOfClasses;
499 memoryConsumedEstimated +=
sizeof (
kkint32) * numOfClasses;
502 memoryConsumedEstimated += xSpacesTotalAllocated *
sizeof (
svm_node) + numOfModels *
sizeof (
XSpacePtr);
504 return memoryConsumedEstimated;
517 cancelFlag = _cancelFlag;
523 void SVMModel::BuildClassIdxTable ()
525 delete[] classIdxTable;
527 classIdxTable =
new MLClassPtr[numOfClasses];
528 for (
kkint32 classIdx = 0; classIdx < numOfClasses; classIdx++)
531 probabilities =
new double[numOfClasses + 2];
532 votes =
new kkint32[numOfClasses + 2];
534 for (
kkint32 x = 0; x < numOfClasses; x++)
536 probabilities[x] = 0.0;
554 log.Level (20) <<
"SVMModel::BuildProblemOneVsAll" << endl;
556 if (!selectedFeatures)
559 SetSelectedFeatures (tempFeatures, log);
566 MLClassPtr mlClass = NULL;
567 delete classAssignments;
570 MLClassList::const_iterator idx;
572 for (idx = allClasses.begin (); idx != allClasses.end (); idx++)
575 if (classesThisAssignment.PtrToIdx (mlClass) >= 0)
578 classAssignments->AddMLClass (mlClass, 0, log);
583 classAssignments->AddMLClass (mlClass, 1, log);
597 xSpacesTotalAllocated += totalxSpaceUsed;
607 void SVMModel::BuildProblemBinaryCombos (FeatureVectorListPtr class1Examples,
608 FeatureVectorListPtr class2Examples,
609 BinaryClassParmsPtr& _twoClassParms,
618 log.Level (10) <<
"SVMModel::BuildProblemBinaryCombos Class1[" << class1->Name () <<
"] Class2[" << class2->Name () <<
"]" << endl;
628 FeatureVectorListPtr twoClassExamples
653 xSpacesTotalAllocated += totalxSpaceUsed;
659 <<
"Gamma was set to ZERO" << endl
663 delete twoClassExamples;
664 twoClassExamples = NULL;
671 void SVMModel::BuildCrossClassProbTable ()
675 if (crossClassProbTable)
677 for (x = 0; x < crossClassProbTableSize; x++)
678 delete crossClassProbTable[x];
679 delete[] crossClassProbTable;
680 crossClassProbTable = NULL;
683 crossClassProbTable = NULL;
685 if (numOfClasses > 0)
687 crossClassProbTableSize = numOfClasses;
688 crossClassProbTable =
new double*[crossClassProbTableSize + 2];
689 for (x = 0; x < crossClassProbTableSize; x++)
691 crossClassProbTable[x] =
new double[crossClassProbTableSize + 2];
692 for (y = 0; y < crossClassProbTableSize; y++)
693 crossClassProbTable[x][y] = 0.0;
735 cerr << endl <<
"SVMModel::DistanceFromDecisionBoundary ***ERROR*** This method only works with BinaryCombos." << endl << endl;
740 bool revClassOrder =
false;
743 while (modelIDX < numOfModels)
745 encoder = binaryFeatureEncoders[modelIDX];
748 revClassOrder =
false;
753 revClassOrder =
true;
769 double distance = 0.0;
774 distance = 0.0 - distance;
781 void SVMModel::InializeProbClassPairs ()
783 if (svmParam->ProbClassPairs ().size () < 1)
785 svmParam->ProbClassPairsInitialize (assignments);
793 MLClassPtr knownClass,
794 MLClassPtr& predClass1,
795 MLClassPtr& predClass2,
798 double& probOfKnownClass,
799 double& predClass1Prob,
800 double& predClass2Prob,
802 bool& knownClassOneOfTheWinners,
806 InializeProbClassPairs ();
810 knownClassOneOfTheWinners =
false;
815 predClass1Votes = -1;
816 predClass2Votes = -1;
818 probOfKnownClass = 0.0;
819 predClass1Prob = 0.0;
820 predClass2Prob = -1.0f;
826 EncodeExample (example, predictXSpace);
827 PredictOneVsAll (predictXSpace,
835 knownClassOneOfTheWinners,
845 EncodeExample (example, predictXSpace);
854 vector<kkint32> winners;
856 SvmPredictClass (*svmParam,
874 numOfWinners = (kkint32)winners.size ();
876 for (
kkint32 idx = 0; idx < (kkint32)winners.size (); idx++)
878 if (winners[idx] == knownClassNum)
880 knownClassOneOfTheWinners =
true;
893 PredictByBinaryCombos (example,
904 knownClassOneOfTheWinners
910 KKStr errMsg =
"***ERROR*** SVMModel::Predict Invalid Machine Type Specified.";
911 cerr << endl << errMsg << endl << endl;
922 MLClassPtr& predClass,
926 InializeProbClassPairs ();
930 EncodeExample (example, predictXSpace);
940 MLClassPtr knownClass,
941 MLClassPtr& predClass1,
942 MLClassPtr& predClass2,
943 double& probOfKnownClass,
944 double& predClass1Prob,
945 double& predClass2Prob,
947 bool& knownClassOneOfTheWinners,
951 InializeProbClassPairs ();
955 knownClassOneOfTheWinners =
false;
957 probOfKnownClass = 0.0;
958 predClass1Prob = 0.0;
960 vector<kkint32> winningClasses;
962 double* probabilities =
new double [numOfModels + 2];
964 double largestLosingProbability = FLT_MIN;
965 kkint32 largestLosingProbabilityIDX = -1;
967 double secondLargestLosingProbability = FLT_MIN;
968 kkint32 secondLargestLosingProbabilityIDX = -1;
970 double largestWinningProbability = FLT_MIN;
971 kkint32 largestWinningProbabilityIDX = -1;
973 double secondLargestWinningProbability = FLT_MIN;
974 kkint32 secondLargestWinningProbabilityIDX = -1;
976 kkint32 knownAssignmentIDX = -1;
980 for (assignmentIDX = 0; assignmentIDX < oneVsAllAssignment.size (); ++assignmentIDX)
982 kkint16 assignmentNum = oneVsAllAssignment[assignmentIDX];
992 if (knownClass == classWeAreLookingAt)
994 knownAssignmentIDX = assignmentIDX;
1003 double predictedClassProbability = 0.0f;
1004 double predictedClassProbability2 = 0.0f;
1005 double knownClassProbabilioty = 0.0f;
1007 vector<kkint32> winners;
1009 double* tempProbabilities =
new double[numOfClasses + 2];
1015 SvmPredictClass (*svmParam,
1016 models[assignmentIDX],
1025 predictedClassProbability,
1026 predictedClassProbability2,
1027 knownClassProbabilioty,
1029 crossClassProbTable,
1035 delete[] tempProbabilities;
1036 tempProbabilities = NULL;
1038 if (predClassNum1 == 0)
1040 winningClasses.push_back (assignmentIDX);
1041 probabilities[assignmentIDX] = predictedClassProbability;
1042 if (predictedClassProbability > largestWinningProbability)
1044 secondLargestWinningProbability = largestWinningProbability;
1045 secondLargestWinningProbabilityIDX = largestWinningProbabilityIDX;
1047 largestWinningProbability = predictedClassProbability;
1048 largestWinningProbabilityIDX = assignmentIDX;
1050 else if (predictedClassProbability > secondLargestWinningProbability)
1052 secondLargestWinningProbability = predictedClassProbability;
1053 secondLargestWinningProbabilityIDX = assignmentIDX;
1058 probabilities[assignmentIDX] = 1.0 - predictedClassProbability;
1059 if (probabilities[assignmentIDX] > largestLosingProbability)
1061 secondLargestLosingProbabilityIDX = largestLosingProbabilityIDX;
1062 secondLargestLosingProbability = largestLosingProbability;
1064 largestLosingProbabilityIDX = assignmentIDX;
1065 largestLosingProbability = probabilities[assignmentIDX];
1067 else if (probabilities[assignmentIDX] > secondLargestLosingProbability)
1069 secondLargestLosingProbabilityIDX = assignmentIDX;
1070 secondLargestLosingProbability = probabilities[assignmentIDX];
1075 numOfWinners = (kkint32)winningClasses.size ();
1077 kkint32 assignmentIDXthatWon = -1;
1078 kkint32 assignmentIDXsecond = -1;
1080 if (winningClasses.size () <= 0)
1084 assignmentIDXthatWon = largestLosingProbabilityIDX;
1085 assignmentIDXsecond = secondLargestLosingProbabilityIDX;
1087 predClass1 = assignments.GetMLClassByIndex (oneVsAllAssignment[assignmentIDXthatWon]);
1089 knownClassOneOfTheWinners =
false;
1092 else if (winningClasses.size () == 1)
1094 assignmentIDXthatWon = winningClasses[0];
1095 knownClassOneOfTheWinners = (assignmentIDXthatWon == knownAssignmentIDX);
1096 assignmentIDXsecond = largestLosingProbabilityIDX;
1102 assignmentIDXthatWon = largestWinningProbabilityIDX;
1103 assignmentIDXsecond = secondLargestLosingProbabilityIDX;
1105 for (kkint32 idx = 0; idx < (kkint32)winningClasses.size (); idx++)
1107 if (winningClasses[idx] == knownAssignmentIDX)
1109 knownClassOneOfTheWinners =
true;
1115 predClass1 = assignments.GetMLClassByIndex (oneVsAllAssignment[assignmentIDXthatWon]);
1116 predClass2 = assignments.GetMLClassByIndex (oneVsAllAssignment[assignmentIDXsecond]);
1118 predClass1Prob = (probabilities [oneVsAllAssignment[assignmentIDXthatWon]]);
1119 probOfKnownClass = (probabilities [oneVsAllAssignment[knownAssignmentIDX]]);
1121 delete[] probabilities;
1122 probabilities = NULL;
1133 double breakTie = -1.0f;
1134 bool knownClassOneOfTheWinners =
false;
1136 MLClassPtr pred1 = NULL;
1137 MLClassPtr pred2 = NULL;
1138 double predClass1Prob = -1.0;
1139 double predClass2Prob = -1.0;
1140 double probOfKnownClass = -1.0;
1145 InializeProbClassPairs ();
1157 knownClassOneOfTheWinners
, 1168 void SVMModel::PredictByBinaryCombos (FeatureVectorPtr example,
1169 MLClassPtr knownClass,
1170 MLClassPtr& predClass1,
1171 MLClassPtr& predClass2,
1174 double& probOfKnownClass,
1175 double& predClass1Prob,
1176 double& predClass2Prob,
1179 bool& knownClassOneOfTheWinners
1186 probOfKnownClass = -1.0f;
1187 predClass1Prob = -1.0f;
1188 predClass2Prob = -1.0f;
1190 predClass1Prob = 0.0;
1191 predClass2Prob = 0.0;
1193 knownClassOneOfTheWinners =
false;
1195 double probability = -1.0;
1197 kkint32 knownClassIDX = numOfClasses - 1;
1203 for (
kkint32 x = 0; x < numOfClasses; x++)
1206 probabilities[x] = 1.0f;
1209 for (
kkint32 class1IDX = 0; class1IDX < (numOfClasses - 1); class1IDX++)
1211 MLClassPtr class1 = classIdxTable [class1IDX];
1213 if (class1 == knownClass)
1214 knownClassIDX = class1IDX;
1216 for (
kkint32 class2IDX = (class1IDX + 1); class2IDX < numOfClasses; class2IDX++)
1218 MLClassPtr class2 = classIdxTable [class2IDX];
1219 BinaryClassParmsPtr thisComboPrameters = binaryParameters[modelIDX];
1223 if (binaryFeatureEncoders[modelIDX] == NULL)
1226 errMsg <<
"SVMModel::PredictByBinaryCombos ***ERROR*** No feature encoder for model[" << modelIDX <<
"]";
1227 cerr << endl << errMsg << endl << endl;
1233 double distance = 0.0;
1234 double margin = 0.0;
1237 probability = (1.0 / (1.0 + exp (-1.0 * (thisComboPrameters
->Param ().A) * distance)));
1240 if (probability > 0.5)
1243 probabilities[class1IDX] *= probability;
1244 probabilities[class2IDX] *= (1.0f - probability);
1249 probabilities[class2IDX] *= (1.0 - probability);
1250 probabilities[class1IDX] *= probability;
1257 double totProbability = 0.0;
1258 for (classIDX = 0; classIDX < numOfClasses; classIDX++)
1259 totProbability += probabilities[classIDX];
1261 if (totProbability <= 0.0)
1262 totProbability = 1.0;
1264 for (classIDX = 0; classIDX < numOfClasses; classIDX++)
1265 probabilities[classIDX] = probabilities[classIDX] / totProbability;
1276 if (predClass1IDX >= 0)
1278 predClass1 = classIdxTable [predClass1IDX];
1279 predClass1Votes = votes [predClass1IDX];
1280 predClass1Prob = probabilities [predClass1IDX];
1283 if (predClass2IDX >= 0)
1285 predClass2 = classIdxTable [predClass2IDX];
1286 predClass2Votes = votes [predClass2IDX];
1287 predClass2Prob = probabilities [predClass2IDX];
1290 if (knownClassIDX >= 0)
1291 probOfKnownClass = probabilities[knownClassIDX];
1294 breakTie = fabs (predClass1Prob - predClass2Prob);
1295 knownClassOneOfTheWinners = (predClass1IDX == knownClassIDX);
1306 kkint32 numOfSupportVectors = 0;
1313 vector<KKStr> svNames = SupportVectorNames ();
1314 numOfSupportVectors = (kkint32)svNames.size ();
1318 for (
kkint32 x = 0; x < numOfModels; x++)
1319 numOfSupportVectors += models[x][0]
->l;
1322 return numOfSupportVectors;
1340 for (
kkint32 modelIDX = 0; modelIDX < numOfModels; modelIDX++)
1342 totalNumSVs += models[modelIDX][0]
->l;
1357 double* _probabilities,
1361 InializeProbClassPairs ();
1365 PredictProbabilitiesByBinaryCombos (example, _mlClasses, _votes, _probabilities, _log);
1371 double predClass1Prob = 0.0;
1372 double predClass2Prob = 0.0;
1373 double probOfKnownClass = 0.0;
1374 double smallestDistOfPredClass = 0.0;
1376 double breakTie = 0.0f;
1378 MLClassPtr predictedClass = NULL;
1388 for (x = 0; x < numOfClasses; x++)
1390 probabilities [x] = 0.0;
1391 _probabilities[x] = 0.0;
1395 vector<kkint32> winners;
1397 SvmPredictClass (*svmParam,
1411 crossClassProbTable,
1417 for (x = 0; x < numOfClasses; x++)
1422 y = _mlClasses.PtrToIdx (predictedClass);
1423 if ((y < 0) || (y >= numOfClasses))
1425 _log.Level (-1) << endl
1426 <<
"SVMModel::ProbabilitiesByClass ***ERROR***" << endl
1427 <<
" Invalid classIdx[" << y <<
"] Specified." << endl
1428 <<
" ClassName [" << predictedClass->Name () <<
"]" << endl
1433 _votes [y] = votes [x];
1434 _probabilities[y] = probabilities[x];
1450 void SVMModel::PredictProbabilitiesByBinaryCombos (FeatureVectorPtr example,
1453 double* _probabilities,
1457 InializeProbClassPairs ();
1461 double probability = -1.0;
1465 for (
kkint32 x = 0; x < numOfClasses; x++)
1467 probabilities[x] = 1.0;
1472 if (numOfClasses != crossClassProbTableSize)
1474 _log.Level (-1) << endl << endl
1475 <<
"SVMModel::PredictProbabilitiesByBinaryCombos ***ERROR***" << endl
1476 <<
" numfClasses != crossClassProbTableSize" << endl
1482 for (
kkint32 class1IDX = 0; class1IDX < (numOfClasses - 1); class1IDX++)
1485 for (
kkint32 class2IDX = (class1IDX + 1); class2IDX < numOfClasses; class2IDX++)
1487 BinaryClassParmsPtr thisComboPrameters = binaryParameters[modelIDX];
1489 if (binaryFeatureEncoders[modelIDX] == NULL)
1492 errMsg <<
"SVMModel::PredictProbabilitiesByBinaryCombos ***ERROR*** No feature encoder for model[" << modelIDX <<
"]";
1493 _log.Level (-1) << endl << endl << errMsg << endl << endl;
1500 double distance = 0.0;
1503 probability = (1.0 / (1.0 + exp (-1.0 * (thisComboPrameters
->Param ().A) * distance)));
1506 crossClassProbTable[class1IDX][class2IDX] = probability;
1507 crossClassProbTable[class2IDX][class1IDX] = 1.0 - probability;
1509 if (probability > 0.5f)
1511 probabilities[class1IDX] *= probability;
1512 probabilities[class2IDX] *= (1.0f - probability);
1517 probabilities[class2IDX] *= (1.0f - probability);
1518 probabilities[class1IDX] *= probability;
1526 double totProbability = 0.0;
1528 for (classIDX = 0; classIDX < numOfClasses; classIDX++)
1530 totProbability += probabilities[classIDX];
1533 if (totProbability == 0.0f)
1534 totProbability = 1.0f;
1538 MLClassList::const_iterator idx;
1539 for (idx = _mlClasses.begin (); idx != _mlClasses.end (); idx++)
1541 kkint32 ourIdx = assignments.GetNumForClass (*idx);
1542 if ((ourIdx < 0) || (ourIdx >= numOfClasses))
1546 _log.Level (-1) << endl
1547 <<
"SVMModel::PredictProbabilitiesByBinaryCombos ***WARNING*** MLClass[" << (*idx)->Name () <<
"] is not one of the classes in SVMModel." << endl
1549 _votes [callersIdx] = 0;
1550 _probabilities[callersIdx] = 0.0;
1554 _votes [callersIdx] = votes [ourIdx];
1555 _probabilities[callersIdx] = probabilities[ourIdx] / totProbability;
1576 vector<KKStr>
SVMModel::SupportVectorNames (MLClassPtr c1,
1580 vector<KKStr> results;
1581 if (svmParam->MachineType () != SVM_MachineType::BinaryCombos)
1586 BinaryClassParmsPtr parms = NULL;
1587 for (modelIDX = 0; modelIDX < numOfModels; modelIDX++)
1589 parms = binaryParameters[modelIDX];
1597 if (modelIDX >= numOfModels)
1601 <<
"SVMModel::SupportVectorNames ***ERROR*** Class1[" << c1->Name () <<
"] Class2[" << c2->Name () <<
"] not part of model." << endl
1608 for (svIDX = 0; svIDX < numSVs; svIDX++)
1611 results.push_back (svName);
1620 vector<KKStr> results;
1621 if (svmParam->MachineType () != SVM_MachineType::BinaryCombos)
1624 map<KKStr,KKStr> names;
1625 map<KKStr,KKStr>::iterator svnIDX;
1629 BinaryClassParmsPtr parms = NULL;
1630 for (modelIDX = 0; modelIDX < numOfModels; modelIDX++)
1632 parms = binaryParameters[modelIDX];
1636 for (svIDX = 0; svIDX < numSVs; svIDX++)
1639 svnIDX = names.find (svName);
1640 if (svnIDX == names.end ())
1642 names.insert (pair<KKStr,KKStr>(svName, svName));
1643 results.push_back (svName);
1659 vector<ProbNamePair> results;
1660 if (svmParam->MachineType () != SVM_MachineType::BinaryCombos)
1664 bool c1RevFlag =
false;
1667 BinaryClassParmsPtr parms = NULL;
1669 for (modelIDX = 0; modelIDX < numOfModels; modelIDX++)
1671 parms = binaryParameters[modelIDX];
1684 if (modelIDX >= numOfModels)
1688 <<
"SVMModel::FindWorstSupportVectors ***ERROR*** Class1[" << c1->Name () <<
"] Class2[" << c2->Name () <<
"] not part of model." << endl
1693 if (binaryFeatureEncoders[modelIDX] == NULL)
1696 errMsg <<
"SVMModel::FindWorstSupportVectors ***ERROR*** No feature encoder for model[" << modelIDX <<
"]";
1697 cerr << endl << errMsg << endl << endl;
1708 double origProbabilityC1 = 0.0;
1709 double probabilityC1 = 0.0;
1710 double distance = 0.0;
1713 origProbabilityC1 = ((1.0 / (1.0 + exp (-1.0 * (parms
->Param ().A) * distance))));
1714 origProbabilityC1 =
AdjProb (origProbabilityC1
);
1717 origProbabilityC1 = 1.0f - origProbabilityC1;
1719 vector<ProbNamePair> candidates;
1721 for (svIDX = 0; svIDX < numSVs; svIDX++)
1724 probabilityC1 = ((1.0 / (1.0 + exp (-1.0 * (parms
->Param ().A) * distance))));
1725 probabilityC1 =
AdjProb (probabilityC1
);
1727 probabilityC1 = 1.0f - probabilityC1;
1729 double deltaProb = probabilityC1 - origProbabilityC1;
1731 candidates.push_back (ProbNamePair (svName, deltaProb));
1734 sort (candidates.begin (), candidates.end (), PairCompareOperator);
1737 for (zed = 0; (zed < (kkint32)candidates.size ()) && (zed < numToFind); zed++)
1738 results.push_back (candidates[zed]);
1751 vector<ProbNamePair> results;
1752 if (svmParam->MachineType () != SVM_MachineType::BinaryCombos)
1756 bool c1RevFlag =
false;
1759 BinaryClassParmsPtr parms = NULL;
1761 for (modelIDX = 0; modelIDX < numOfModels; modelIDX++)
1763 parms = binaryParameters[modelIDX];
1776 if (modelIDX >= numOfModels)
1780 <<
"SVMModel::FindWorstSupportVectors ***ERROR*** Class1[" << c1->Name () <<
"] Class2[" << c2->Name () <<
"] not part of model." << endl
1786 if (binaryFeatureEncoders[modelIDX] == NULL)
1789 errMsg <<
"SVMModel::FindWorstSupportVectors2 ***ERROR*** No feature encoder for model[" << modelIDX <<
"]";
1790 cerr << endl << errMsg << endl << endl;
1801 double origProbabilityC1 = 0.0;
1802 double probabilityC1 = 0.0;
1803 double distance = 0.0;
1806 origProbabilityC1 = ((1.0 / (1.0 + exp (-1.0 * (parms
->Param ().A) * distance))));
1807 origProbabilityC1 =
AdjProb (origProbabilityC1
);
1809 origProbabilityC1 = 1.0 - origProbabilityC1;
1811 vector<ProbNamePair> candidates;
1821 probabilityC1 = ((1.0 / (1.0 + exp (-1.0 * (parms
->Param ().A) * distance))));
1822 probabilityC1 =
AdjProb (probabilityC1
);
1824 probabilityC1 = 1.0f - probabilityC1;
1828 for (svIDX = 0; svIDX < numSVs; svIDX++)
1837 probabilityC1 = ((1.0 / (1.0 + exp (-1.0 * (parms
->Param ().A) * distance))));
1838 probabilityC1 =
AdjProb (probabilityC1
);
1840 probabilityC1 = 1.0f - probabilityC1;
1842 double deltaProb = probabilityC1 - origProbabilityC1;
1845 candidates.push_back (ProbNamePair (svName, deltaProb));
1847 delete subSetModel; subSetModel = NULL;
1848 delete subSetProb; subSetProb = NULL;
1851 sort (candidates.begin (), candidates.end (), PairCompareOperator);
1854 for (zed = 0; (zed < (kkint32)candidates.size ()) && (zed < numToFind); zed++)
1855 results.push_back (candidates[zed]);
1864 if (!selectedFeatures)
1866 KKStr errMsg =
"SVMModel::CalculatePredictXSpaceNeeded ***ERROR*** numOfFeaturesSelected is NOT defined.";
1867 log.Level (-1) << endl << errMsg << endl
1873 kkint32 numFeaturesAfterEncoding = 0;
1879 for (z = 0; z < numOfFeaturesSelected; z++)
1881 if ((type_table[(*selectedFeatures)[z]] == AttributeType::Nominal) ||
1882 (type_table[(*selectedFeatures)[z]] == AttributeType::Symbolic)
1884 numFeaturesAfterEncoding += cardinality_table[(*selectedFeatures)[z]];
1886 numFeaturesAfterEncoding ++;
1898 numFeaturesAfterEncoding++;
1900 predictXSpaceWorstCase = numFeaturesAfterEncoding + 10;
1910 delete predictXSpace;
1911 predictXSpace =
new svm_node[predictXSpaceWorstCase];
1921 if (!featureEncoder)
1932 kkint32 xSpaceNodesNeeded = 0;
1934 return xSpaceNodesNeeded;
1939 void SVMModel::ConstructOneVsOneModel (FeatureVectorListPtr examples,
1948 models =
new ModelPtr [numOfModels];
1953 for (x = 0; x < numOfModels; x++)
1960 delete featureEncoder;
1976 xSpacesTotalAllocated += totalxSpaceUsed;
1983 trainingTime = endTrainingTime - startTrainingTime;
1987 free (prob.y); prob
.y = NULL;
1988 if (xSpaces[0] != NULL)
1992 free (prob.x); prob
.x = NULL;
1994 delete[] prob
.W; prob
.W = NULL;
2000 void SVMModel::ConstructOneVsAllModel (FeatureVectorListPtr examples,
2008 numOfModels = (kkint32)assignmentNums.size ();
2010 models =
new ModelPtr [numOfModels];
2014 for (x = 0; x < numOfModels; x++)
2033 oneVsAllAssignment.erase (oneVsAllAssignment.begin (), oneVsAllAssignment.end ());
2037 delete oneVsAllClassAssignments;
2039 for (modelIDX = 0; modelIDX < numOfModels; modelIDX++)
2040 oneVsAllClassAssignments[modelIDX] = NULL;
2044 for (assignmentIDX = 0; assignmentIDX < numOfModels; assignmentIDX++)
2046 kkint16 assignmentNum = assignmentNums[assignmentIDX];
2047 oneVsAllAssignment.push_back (assignmentNum);
2051 BuildProblemOneVsAll (*examples,
2054 classesThisAssignment,
2057 oneVsAllClassAssignments [modelIDX],
2066 trainingTime += (trainTimeEnd - trainTimeStart);
2070 free (prob.y); prob
.y = NULL;
2071 free (prob.x); prob
.x = NULL;
2082 void SVMModel::ConstructBinaryCombosModel (FeatureVectorListPtr examples,
2086 log.Level (10) <<
"SVMModel::ConstructBinaryCombosModel" << endl;
2088 kkint32 maxXSpaceNeededPerExample = 0;
2090 numOfModels = (numOfClasses * (numOfClasses - 1)) / 2;
2092 models =
new ModelPtr [numOfModels];
2094 binaryParameters =
new BinaryClassParmsPtr [numOfModels];
2102 for (x = 0; x < numOfModels; x++)
2105 binaryParameters [x] = NULL;
2106 binaryFeatureEncoders [x] = NULL;
2110 FeatureVectorListPtr srcExamples = examples;
2111 FeatureVectorListPtr compressedExamples = NULL;
2113 FeatureVectorListPtr* examplesByClass = BreakDownExamplesByClass (srcExamples);
2120 for (class1IDX = 0; (class1IDX < (numOfClasses - 1)) && (!cancelFlag); class1IDX++)
2124 for (class2IDX = class1IDX + 1; (class2IDX < numOfClasses) && (!cancelFlag); class2IDX++)
2128 log.Level (20) <<
"ConstructBinaryCombosModel Class1[" << class1->Name () <<
"] Class2[" << class2->Name () <<
"]" << endl;
2133 binaryParameters [modelIDX] = NULL;
2134 binaryFeatureEncoders [modelIDX] = NULL;
2135 xSpaces [modelIDX] = NULL;
2138 BuildProblemBinaryCombos (examplesByClass[class1IDX],
2139 examplesByClass[class2IDX],
2140 binaryParameters [modelIDX],
2141 binaryFeatureEncoders [modelIDX],
2149 maxXSpaceNeededPerExample = Max (maxXSpaceNeededPerExample, binaryFeatureEncoders [modelIDX]->XSpaceNeededPerExample ());
2155 trainingTime += (endTrainingTime - startTrainingTime);
2180 free (prob.y); prob
.y = NULL;
2181 free (prob.x); prob
.x = NULL;
2190 for (x = 0; x < (kkint32)assignments.size (); x++)
2191 delete examplesByClass[x];
2192 delete[] examplesByClass;
2193 examplesByClass = NULL;
2196 predictXSpaceWorstCase = maxXSpaceNeededPerExample + 10;
2205 delete predictXSpace; predictXSpace = NULL;
2206 predictXSpace =
new svm_node[predictXSpaceWorstCase];
2208 delete compressedExamples;
2210 log.Level (10) <<
"SVMModel::ConstructBinaryCombosModel Done." << endl;
2215 FeatureVectorListPtr*
SVMModel::BreakDownExamplesByClass (FeatureVectorListPtr examples)
2219 FeatureVectorListPtr* examplesByClass =
new FeatureVectorListPtr[numOfClasses];
2220 for (x = 0; x < numOfClasses; x++)
2223 MLClassPtr lastMLClass = NULL;
2226 FeatureVectorList::iterator idx;
2228 for (idx = examples->begin (); idx != examples->end (); idx++)
2230 FeatureVectorPtr example = *idx;
2241 return examplesByClass;
2260 delete selectedFeatures;
2262 CalculatePredictXSpaceNeeded (_log);
2271 delete selectedFeatures;
2273 CalculatePredictXSpaceNeeded (_log);
2280 double** crossProbTable,
2284 if (classes.QueueSize () != crossClassProbTableSize)
2287 log.Level (-1) << endl
2288 <<
"SVMModel::RetrieveCrossProbTable ***ERROR***" << endl
2289 <<
" classes.QueueSize ()[" << classes.QueueSize () <<
"] != crossClassProbTableSize[" << crossClassProbTableSize <<
"]" << endl
2296 for (x = 0; x < classes.QueueSize (); x++)
2298 for (y = 0; y < classes.QueueSize (); y++)
2299 crossProbTable[x][y] = 0.0;
2301 indexTable[x] = assignments.GetNumForClass (classes.IdxToPtr (x));
2302 if (indexTable[x] < 0)
2304 log.Level (-1) << endl << endl
2305 <<
"SVMModel::RetrieveCrossProbTable ***WARNING***" << endl
2307 <<
" Class Index[" << x <<
"] Name[" << classes[x].Name () <<
"]" << endl
2308 <<
" will populate this index with zeros." << endl
2313 if (classes.QueueSize () != crossClassProbTableSize)
2315 log.Level (-1) << endl
2316 <<
"SVMModel::RetrieveCrossProbTable ***ERROR***" << endl
2317 <<
" 'classes.QueueSize () != crossClassProbTableSize'" << endl
2325 for (x = 0; x < classes.QueueSize (); x++)
2330 for (y = 0; y < classes.QueueSize (); y++)
2335 if ((x != xIdx) || (y != yIdx))
2340 crossProbTable[x][y] =
this->crossClassProbTable[xIdx][yIdx];
2346 delete[] indexTable; indexTable = NULL;
2370 headerFields
->Add ("RootFileName", rootFileName
);
2372 headerFields
->Add ("NumOfModels", numOfModels
);
2373 if (selectedFeatures)
2376 headerFields
->Add ("TrainingTime", trainingTime
);
2379 delete headerFields;
2380 headerFields = NULL;
2388 if (models && (models[0]) && models[0][0])
2401 for (modelsIDX = 0; modelsIDX < numOfModels; modelsIDX++)
2403 BinaryClassParmsPtr binClassParms = binaryParameters[modelsIDX];
2428 KKStr lastBinaryClass1Name =
"";
2429 KKStr lastBinaryClass2Name =
"";
2435 delete binaryParameters; binaryParameters = NULL;
2436 delete models; models = NULL;
2437 delete binaryFeatureEncoders; binaryFeatureEncoders = NULL;
2444 bool errorsFound =
false;
2446 while (!errorsFound)
2450 if ((!t) || cancelFlag)
2472 for (
auto idx: *hf->Value ())
2474 if (idx.first.EqualIgnoreCase (
"RootFileName"))
2475 rootFileName = idx.second;
2477 else if (idx.first.EqualIgnoreCase (
"Time"))
2478 timeSaved = DateTime (idx.second);
2480 else if (idx.first.EqualIgnoreCase (
"NumOfModels"))
2481 numOfModels = idx.second.ToInt32 ();
2483 else if (idx.first.EqualIgnoreCase (
"SelectedFeatures"))
2485 delete selectedFeatures;
2486 bool validFeatures =
false;
2487 selectedFeatures =
new FeatureNumList (idx.second, validFeatures);
2490 else if (idx.first.EqualIgnoreCase (
"TrainingTime"))
2491 trainingTime = idx.second.ToDouble ();
2493 else if (idx.first.EqualIgnoreCase (
"Assignments") || idx.first.EqualIgnoreCase (
"ClassAssignments"))
2494 assignments.ParseToString (idx.second, log);
2498 log.Level (-1) << endl
2499 <<
"SVMModel::ReadXM ***ERROR*** Unrecognized Header Field: " << idx.first << endl
2505 if (numOfModels < 1)
2507 log.Level (-1) << endl
2508 <<
"SVMModel::ReadXM ***ERROR*** numOfModels: " << numOfModels <<
" Is invalid." << endl
2516 binaryParameters =
new BinaryClassParmsPtr [numOfModels];
2519 for (
kkint32 x = 0; x < numOfModels; x++)
2521 binaryParameters [x] = NULL;
2522 binaryFeatureEncoders [x] = NULL;
2527 else if (varName.EqualIgnoreCase (
"SvmParam") && (
typeid (*e) ==
typeid (XmlElementSVMparam)))
2529 XmlElementSVMparamPtr xmlSvmParam =
dynamic_cast<XmlElementSVMparamPtr> (e);
2533 svmParam = xmlSvmParam->TakeOwnership ();
2537 else if (varName.EqualIgnoreCase (
"RootFileName"))
2539 rootFileName = e->ToKKStr ();
2542 else if (varName.EqualIgnoreCase (
"OneVsOneModel") && (
typeid (*e) ==
typeid (XmlElementSvmModel233)))
2544 XmlElementSvmModel233Ptr xmlElementModel =
dynamic_cast<XmlElementSvmModel233Ptr> (e);
2545 SvmModel233* m = xmlElementModel->Value ();
2550 log.Level (-1) << endl
2551 <<
"SVMModel::ReadXM ***ERROR*** 'OneVsOneModel' is invalid." << endl
2558 log.Level (-1) << endl
2559 <<
"SVMModel::ReadXM ***ERROR*** 'OneVsOneModel' models was not defined/allocated." << endl
2564 models[0][0] = xmlElementModel->TakeOwnership ();
2571 else if (varName.EqualIgnoreCase (
"BinaryCombo") && (
typeid (*e) ==
typeid (XmlElementKKStr)))
2573 KKStr s = *(
dynamic_cast<XmlElementKKStrPtr> (e)->Value ());
2574 lastModelIdx = s.ExtractTokenInt (
"\t");
2575 lastBinaryClass1Name = s.ExtractToken2 (
"\t");
2576 lastBinaryClass2Name = s.ExtractToken2 (
"\t");
2579 else if (varName.StartsWith (
"BinaryComboModel_") && (
typeid (*e) ==
typeid (XmlElementSvmModel233)))
2581 XmlElementSvmModel233Ptr xmlElementModel =
dynamic_cast<XmlElementSvmModel233Ptr> (e);
2582 SvmModel233* m = xmlElementModel->Value ();
2583 if ((!m) || (!m->valid))
2585 log.Level (-1) << endl
2586 <<
"SVMModel::ReadXM ***ERROR*** SvmModel233[" << varName <<
"] is invalid." << endl
2591 else if (numModeLoaded >= numOfModels)
2593 log.Level (-1) << endl
2594 <<
"SVMModel::ReadXM ***ERROR*** Number of models being loaded exceeds what was expected." << endl
2601 MLClassPtr class1 = MLClass::CreateNewMLClass (lastBinaryClass1Name);
2602 MLClassPtr class2 = MLClass::CreateNewMLClass (lastBinaryClass2Name);
2604 log.Level (10) <<
"SVMModel::ReadXM Class1[" << lastBinaryClass1Name <<
"] Class2[" << lastBinaryClass2Name <<
"]" << endl;
2606 BinaryClassParmsPtr binClassParms = svmParam->GetParamtersToUseFor2ClassCombo (class1, class2);
2609 log.Level (-1) << endl
2610 <<
"SVMModel::ReadXM ***ERROR*** Binary Class Parms are missing for classes " << lastBinaryClass1Name <<
" and " << lastBinaryClass2Name << endl
2616 models[numModeLoaded][0] =
dynamic_cast<XmlElementSvmModel233Ptr> (e)->TakeOwnership ();
2617 binaryParameters[numModeLoaded] = binClassParms;
2619 binaryFeatureEncoders[numModeLoaded]
2620 =
new FeatureEncoder (fileDesc,
2621 binClassParms->Class1 (),
2622 binClassParms->Class2 (),
2623 *(binClassParms->SelectedFeatures ()),
2624 svmParam->EncodingMethod (),
2639 if (assignments.size () < 2)
2641 log.Level (-1) << endl
2642 <<
"SVMModel::ReadXM ***ERROR*** 'assignments is not properly defined." << endl
2649 log.Level (-1) << endl
2650 <<
"SVMModel::ReadXM ***ERROR*** 'fileDesc' is not defined." << endl
2657 log.Level (-1) << endl
2658 <<
"SVMModel::ReadXM ***ERROR*** 'svmParam' is not defined." << endl
2668 numOfClasses = (kkint32)assignments.size ();
2669 BuildClassIdxTable ();
2670 BuildCrossClassProbTable ();
2672 CalculatePredictXSpaceNeeded (log);
2676 delete featureEncoder;
2687 validModel = !errorsFound;
__int16 kkint16
16 bit signed integer.
KKStr(kkint32 size)
Creates a KKStr object that pre-allocates space for 'size' characters.
XmlTag(const KKStr &_name, TagTypes _tagType)
kkint32 CodedNumOfFeatures() const
void Gamma_Param(double _gamma)
void PushOnBack(FeatureVectorPtr image)
Overloading the PushOnBack function in KKQueue so we can monitor the Version and Sort Order...
VectorShort GetUniqueListOfAssignments() const
kkint32 MemoryConsumedEstimated() const
void GetMaxIndex(T *vote, kkint32 voteLength, kkint32 &maxIndex1, kkint32 &maxIndex2)
void AddQueue(const FeatureVectorList &examplesToAdd)
Add the contents of 'examplesToAdd' to the end of this list.
ClassAssignments * ClassAssignmentsPtr
bool EqualIgnoreCase(const char *s2) const
void Gamma(double _gamma)
void SvmPredictRaw(SvmModel233 **submodel, const svm_node *unKnownData, double &label, double &dist)
FeatureNumListConstPtr SelectedFeatures() const
void svm_GetSupportVectorStatistics(const struct SvmModel233 *model, kkint32 &numSVs, kkint32 &totalNumSVs)
Extract Support Vector statistics .
KKB::DateTime osGetLocalDateTime()
Returned the current local date and time.
void SupportVectorStatistics(kkint32 &numSVs, kkint32 &totalNumSVs)
kkuint32 NumOfFields() const
MLClassPtr GetMLClass(kkint16 num) const
Keeps track of selected features.
FeatureNumList(FileDescPtr _fileDesc)
virtual void CancelFlag(bool _cancelFlag)
FeatureNumListConstPtr GetFeatureNums(FileDescPtr fileDesc) const
FeatureNumListConstPtr GetFeatureNums() const
SVMparam(const SVMparam &_svmParam)
MLClassListPtr ExtractListOfClasses() const
std::vector< ProbNamePair > FindWorstSupportVectors2(FeatureVectorPtr example, kkint32 numToFind, MLClassPtr c1, MLClassPtr c2)
For a given two class pair return the names of the 'numToFind' worst S/V's.
kkint16 GetNumForClass(MLClassPtr mlClass) const
MLClassPtr Class2() const
BinaryClassParmsPtr GetParamtersToUseFor2ClassCombo(MLClassPtr class1, MLClassPtr class2)
const FileDescPtr FileDesc() const
FeatureNumList const FeatureNumListConst
MLClassPtr Class1() const
MLClassPtr Predict(FeatureVectorPtr example)
virtual void WriteXML(const KKStr &varName, std::ostream &o) const
SVMModel()
Default constructor used by XmlElementSVMModel to create and load a new instance from a XML Stream...
void Add(const KKStr &key, kkint32 v)
KKStr SupportVectorName(kkint32 svIDX)
struct SvmModel233 * svm_train(const struct svm_problem *prob, const struct svm_parameter *param)
SVM_MachineType MachineType() const
SVM_EncodingMethod EncodingMethod() const
double svm_predictTwoClasses(const SvmModel233 *model, const svm_node *x, double &dist, kkint32 excludeSupportVectorIDX)
FeatureNumListConstPtr GetFeatureNums(FileDescPtr fileDesc) const
unsigned __int32 kkuint32
FeatureNumList(const FeatureNumList &featureNumList)
Copy constructor.
VectorInt32 CreateCardinalityTable() const
FeatureVectorList(FileDescPtr _fileDesc, bool _owner)
Will create a new empty list of FeatureVector's.
MLClassList GetMLClasses(kkint16 num) const
Container class for FeatureVector derived objects.
void Add(const KKStr &key, double v)
KKStr operator+(const char *left, const KKStr &right)
void Add(const KKStr &key, const KKStr &v)
struct svm_node * XSpacePtr
FeatureNumList * FeatureNumListPtr
XmlElement * XmlElementPtr
void AddAtribute(const KKStr &attributeName, const KKStr &attributeValue)
kkint32 NumOfFeatures() const
virtual ~SVMModel()
Frees any memory allocated by, and owned by the SVMModel.
FeatureNumListConstPtr GetFeatureNums() const
XmlTag const * XmlTagConstPtr
kkint32 MemoryConsumedEstimated() const
Manages the reading and writing of objects in a simple XML format. For a class to be supported by Xml...
XSpacePtr EncodeAExample(FeatureVectorPtr example)
Converts a single example into the svm_problem format.
std::vector< KKStr > SupportVectorNames() const
double DistanceFromDecisionBoundary(FeatureVectorPtr example, MLClassPtr class1, MLClassPtr class2)
Binds MLClass objects to the appropriate number that the Learning Algorithm expects.
static KKStr Concat(const std::vector< std::string > &values)
Concatenates the list of 'std::string' strings.
void AddMLClass(MLClassPtr mlClass, kkint16 num, RunLog &log)
void EncodeIntoSparseMatrix(FeatureVectorListPtr src, ClassAssignments &assignments, XSpacePtr &xSpace, kkint32 &totalxSpaceUsed, struct svm_problem &prob, RunLog &log)
Compresses 'src' examples, allocating new 'xSpace' data structure.
MLClassPtr MLClass() const
Class that is example is assigned to.
struct SvmModel233 ** SvmTrainModel(const struct svm_parameter ¶m, struct svm_problem &subprob)
MLClassPtr GetMLClassByIndex(size_t idx)
This class encapsulates are the information necessary to build a SVMModel class.
void RetrieveCrossProbTable(MLClassList &classes, double **crossProbTable, RunLog &log)
Will return the probabilities for all pairs of the classes listed in 'classes'.
virtual void WriteXML(const KKStr &varName, std::ostream &o) const
kkint32 MemoryConsumedEstimated() const
void ProbabilitiesByClass(FeatureVectorPtr example, const MLClassList &_mlClasses, kkint32 *_votes, double *_probabilities, RunLog &_log)
Will get the probabilities assigned to each class.
MLClassPtr Class2() const
void Predict(FeatureVectorPtr example, MLClassPtr knownClass, MLClassPtr &predClass1, MLClassPtr &predClass2, kkint32 &predClass1Votes, kkint32 &predClass2Votes, double &probOfKnownClass, double &predClass1Prob, double &predClass2Prob, kkint32 &numOfWinners, bool &knownClassOneOfTheWinners, double &breakTie)
Will predict the two most likely classes of 'example'.
virtual const KKStr & VarName() const
KKStr StrFormatInt(kkint32 val, const char *mask)
bool PairCompareOperator(ProbNamePair l, ProbNamePair r)
void WriteXML(const KKStr &varName, std::ostream &o) const
XmlElementKeyValuePairs * XmlElementKeyValuePairsPtr
const svm_parameter & Param() const
KKStr ToString() const
Returns comma delimited list of all features selected; will make use of range specification.
SVM_SelectionMethod SelectionMethod() const
double osGetSystemTimeUsed()
Returns the number of CPU seconds used by current process.
FeatureEncoder * FeatureEncoderPtr
AttributeTypeVector CreateAttributeTypeTable() const
void WriteXML(std::ostream &o)
void SvmDestroyModel(struct SvmModel233 **subModel)
FeatureNumListConst * FeatureNumListConstPtr
Used for logging messages.
void EncodeProblem(const struct svm_paramater ¶m, struct svm_problem &prob_in, struct svm_problem &prob_out)
FeatureEncoder(FileDescPtr _fileDesc, MLClassPtr _class1, MLClassPtr _class2, const FeatureNumList &_selectedFeatures, SVM_EncodingMethod _encodingMethod, double _c_Param)
Constructs a Feature Encoder object.
SVMModel(const SVMparam &_svmParam, FeatureVectorList &_examples, ClassAssignments &_assignments, FileDescPtr _fileDesc, RunLog &_log)
Constructor that will create a svmlib training model using the features and classes for training purp...
void PredictRaw(FeatureVectorPtr example, MLClassPtr &predClass, double &dist)
Returns the distance from the decision border of the SVM.
std::vector< short > VectorShort
void EncodeAExample(FeatureVectorPtr example, svm_node *xSpace, kkint32 &xSpaceUsed)
Converts a single example into the svm_problem format.
virtual TokenTypes TokenType()=0
FileDescPtr Value() const
virtual void ReadXML(XmlStream &s, XmlTagConstPtr tag, VolConstBool &cancelFlag, RunLog &log)
FeatureNumListConstPtr GetFeatureNums(FileDescPtr fileDesc, MLClassPtr class1, MLClassPtr class2) const
virtual XmlTokenPtr GetNextToken(VolConstBool &cancelFlag, RunLog &log)
KKException(const KKStr &_exceptionStr)
double AdjProb(double prob)
Maintains a list of MLClass instances.
std::vector< ProbNamePair > FindWorstSupportVectors(FeatureVectorPtr example, kkint32 numToFind, MLClassPtr c1, MLClassPtr c2)
For a given two class pair return the names of the 'numToFind' worst S/V's.
FeatureNumListConstPtr GetFeatureNums(FileDescPtr fileDesc, MLClassPtr class1, MLClassPtr class2) const
virtual void WriteXML(const KKStr &varName, std::ostream &o) const
const svm_parameter & Param() const
XmlElementKeyValuePairs()
Used to construct an instance that will be written out to a XML file.
virtual bool NormalizeNominalAttributes()
void WriteXML(const KKStr &varName, std::ostream &o) const
#define XmlFactoryMacro(NameOfClass)
kkint32 MemoryConsumedEstimated() const
void Add(const KKStr &key, const KKB::DateTime &v)
kkint32 NumOfSupportVectors() const
svm_problem * svm_BuildProbFromTwoClassModel(const SvmModel233 *model, kkint32 excludeSupportVectorIDX)
void WriteXML(const KKStr &varName, std::ostream &o)
MLClassPtr Class1() const
std::vector< KKStr > SupportVectorNames(MLClassPtr c1, MLClassPtr c2) const
XmlElementFileDesc * XmlElementFileDescPtr
volatile const bool VolConstBool