41 using namespace KKMLL;
53 #define Malloc (type,n) (type *)malloc((n)*sizeof(type)) 78 for (kkint32 i = 1; i < voteLength; i++)
88 else if (maxIndex2 < 0)
94 else if (vote[i] > max2)
119 for (kkint32 i = 1; i < voteLength; i++)
124 maxIndex2 = maxIndex;
129 else if (maxIndex2 < 0)
135 else if (vote[i] > max2)
157 if (leftVotes < rightVotes)
160 else if (leftVotes > rightVotes)
163 else if (leftProb < rightProb)
166 else if (leftProb > rightProb)
178 double* probabilities,
185 pred1Idx = GetMaxIndex (probabilities, numClasses, pred2Idx);
190 double max1Prob = probabilities[0];
194 double max2Prob = -1.0f;
197 for (
kkint32 x = 1; x < numClasses; x++)
201 max2Votes = max1Votes;
204 max1Votes = votes[x];
205 max1Prob = probabilities[x];
208 else if ((pred2Idx < 0) ||
GreaterThan (votes[x]
, probabilities[x]
, max2Votes
, max2Prob
))
210 max2Votes = votes[x];
211 max2Prob = probabilities[x];
229 ofstream out(name.c_str());
232 cout <<
" cannot open " << name << endl;
235 for(
kkint32 i=begin; i<end; i++)
240 out << temp->value <<
",";
243 out << ds.y[i] << endl;
256 double* probabilities,
257 double minProbability
260 double sumGreaterOrEqualMin = 0.0;
264 for (x = 0; x < numClasses; ++x)
266 if (probabilities[x] < minProbability)
269 sumGreaterOrEqualMin += probabilities[x];
272 double probLessMinTotal = numLessThanMin * minProbability;
273 double probLeftToAllocate = 1.0 - probLessMinTotal;
275 for (x = 0; x < numClasses; ++x)
277 if (probabilities[x] < minProbability)
278 probabilities[x] = minProbability;
280 probabilities[x] = (probabilities[x] / sumGreaterOrEqualMin) * probLeftToAllocate;
289 vector<
double>& dist,
290 double** crossClassProbTable,
292 double* probabilities,
301 for (i = 0; i < numClasses; i++)
305 for (i = 0; i < (numClasses - 1); i++)
307 for (
kkint32 j = i + 1; j < numClasses; j++)
309 if (dist[distIdx] > 0)
314 crossClassProbTable[i][j] = 0.0;
315 crossClassProbTable[j][i] = 0.0;
331 for (i = 0; i < numClasses; ++i)
371 probabilities[win1Idx] = 0.25;
372 probabilities[win2Idx] = 0.25;
373 probabilities[win3Idx] = 0.25;
374 probabilities[win4Idx] = 0.25;
378 probabilities[win1Idx] = 0.95 / 3.0;
379 probabilities[win2Idx] = 0.95 / 3.0;
380 probabilities[win3Idx] = 0.95 / 3.0;
381 probabilities[win4Idx] = 0.05;
386 probabilities[win1Idx] = 0.85 / 2.0;
387 probabilities[win2Idx] = 0.85 / 2.0;
388 probabilities[win3Idx] = 0.10;
389 probabilities[win4Idx] = 0.05;
395 probabilities[win1Idx] = 0.65;
400 probabilities[win2Idx] = 0.30 / 3.0;
401 probabilities[win3Idx] = 0.30 / 3.0;
402 probabilities[win4Idx] = 0.30 / 3.0;
406 probabilities[win2Idx] = 0.30 / 2.0;
407 probabilities[win3Idx] = 0.30 / 2.0;
408 probabilities[win4Idx] = 0.05;
414 probabilities[win2Idx] = 0.20;
417 probabilities[win3Idx] = 0.15 / 2.0;
418 probabilities[win4Idx] = 0.15 / 2.0;
422 probabilities[win3Idx] = 0.10;
423 probabilities[win4Idx] = 0.05;
430 for (i = 0; i < numClasses; ++i)
432 crossClassProbTable [win1Idx][i] = probabilities[win1Idx];
433 crossClassProbTable [i][win1Idx] = 1.0 - probabilities[win1Idx];
436 crossClassProbTable [win2Idx][i] = probabilities[win2Idx];
437 crossClassProbTable [i][win2Idx] = 1.0 - probabilities[win2Idx];
440 crossClassProbTable [win3Idx][i] = probabilities[win3Idx];
441 crossClassProbTable [i][win3Idx] = 1.0 - probabilities[win3Idx];
444 crossClassProbTable [win4Idx][i] = probabilities[win4Idx];
445 crossClassProbTable [i][win4Idx] = 1.0 - probabilities[win4Idx];
451 if ((knownClassNum >= 0) && (knownClassNum < numClasses))
455 maxIndex1 = GetMaxIndex (probabilities, numClasses, maxIndex2);
457 if (probabilities[maxIndex1] >= confidence)
459 if ((probabilities[knownClassNum] < 1.0f) && (probabilities[knownClassNum] > 0.0f))
461 compact = -log ((
double)probabilities[knownClassNum]);
474 vector<
double>& dist,
475 double** crossClassProbTable,
477 double* probabilities,
482 for (i = 0; i < numClasses; i++)
486 for (i = 0; i < (numClasses - 1); i++)
488 for (
kkint32 j = i + 1; j < numClasses; j++)
490 if (dist[distIdx] > 0)
495 double tempProb = (
double)(1.0 / (1.0 + exp (-1.0 * probClassPairs[distIdx] * dist[distIdx])));
496 crossClassProbTable[i][j] = tempProb;
497 crossClassProbTable[j][i] = (1.0 - tempProb);
502 double totalProb = 0.0;
503 for (i = 0; i < numClasses; i++)
505 double probThisClass = 1.0;
506 for (
kkint32 j = 0; j < numClasses; j++)
509 probThisClass *= crossClassProbTable [i][j];
512 probabilities[i] = probThisClass;
513 totalProb += probThisClass;
516 if (totalProb == 0.0)
520 for (i = 0; i < numClasses; i++)
521 probabilities[i] = (1.0 /
double(numClasses));
525 for (i = 0; i < numClasses; i++)
526 probabilities[i] = probabilities[i] / totalProb;
529 if ((knownClassNum >= 0) && (knownClassNum < numClasses))
533 maxIndex1 = GetMaxIndex (probabilities, numClasses, maxIndex2);
559 if ((numSVM == 1) && (sample == 100))
562 else if (dimSelect > 0)
565 else if (boosting != 0)
587 const struct svm_node* unknownClassFeatureData,
589 double* probabilities,
595 double& predClass1Prob,
596 double& predClass2Prob,
597 double& probOfKnownClass,
599 double** crossClassProbTable,
607 kkint32 numBinary = (NUMCLASS * (NUMCLASS - 1)) / 2;
611 svm_predict (subModel[0], unknownClassFeatureData, dist, winners, -1);
614 ComputeProb (NUMCLASS,
615 svmParam.ProbClassPairs (),
632 predClass1Votes = votes[predClass1];
633 predClass1Prob = probabilities[predClass1];
638 predClass2Votes = votes[predClass2];
639 predClass2Prob = probabilities[predClass2];
643 probOfKnownClass = probabilities[knownClass];
645 breakTie = (predClass1Prob - predClass2Prob);
659 kkint32 excludeSupportVectorIDX
666 <<
"SvmPredictTwoClass *** ERROR ***" << endl
668 <<
"Number of classes should be equal to two." << endl
676 probability = (1.0 / (1.0 + exp (-1.0 * param
.A * dist)));
694 <<
"SvmPredictTwoClass *** ERROR ***" << endl
696 <<
"Number of classes should be equal to two." << endl
729 if (models[0] == NULL)
std::vector< double > Dvector
bool GreaterThan(kkint32 leftVotes, double leftProb, kkint32 rightVotes, double rightProb)
void SvmPredictRaw(SvmModel233 **submodel, const svm_node *unKnownData, double &label, double &dist)
std::vector< kkint32 > Ivector
kkint32 GetMaxIndex(vector< T > &vote, kkint32 voteLength, kkint32 &maxIndex2)
void SvmSaveModel(ostream &o, struct SvmModel233 **model)
void saveData(svm_problem ds, kkint32 begin, kkint32 end, string name)
void ComputeProb(kkint32 numClasses, const VectorFloat &probClassPairs, vector< double > &dist, double **crossClassProbTable, kkint32 *votes, double *probabilities, kkint32 knownClassNum)
struct SvmModel233 * svm_train(const struct svm_problem *prob, const struct svm_parameter *param)
double svm_predictTwoClasses(const SvmModel233 *model, const svm_node *x, double &dist, kkint32 excludeSupportVectorIDX)
struct SvmModel233 * Svm_Load_Model(std::istream &f, RunLog &log)
std::vector< float > VectorFloat
struct SvmModel233 ** SvmTrainModel(const struct svm_parameter ¶m, struct svm_problem &subprob)
This class encapsulates are the information necessary to build a SVMModel class.
void GreaterVotes(bool useProbability, kkint32 numClasses, kkint32 *votes, double *probabilities, kkint32 &pred1Idx, kkint32 &pred2Idx)
kkint32 SvmPredictTwoClass(const struct svm_parameter ¶m, SvmModel233 **submodel, const svm_node *unKnownData, kkint32 desired, double &dist, double &probability, kkint32 excludeSupportVectorIDX)
void ComputeProbForVoting(kkint32 numClasses, float A, vector< double > &dist, double **crossClassProbTable, kkint32 *votes, double *probabilities, kkint32 knownClassNum, double confidence, double &compact)
SVM_SelectionMethod SelectionMethod() const
void NormalizeProbabilitiesWithAMinumum(kkint32 numClasses, double *probabilities, double minProbability)
Will normailize probabilites such that the sum of all equal 1.0 and no one probability will be less t...
void SvmDestroyModel(struct SvmModel233 **subModel)
Used for logging messages.
void EncodeProblem(const struct svm_paramater ¶m, struct svm_problem &prob_in, struct svm_problem &prob_out)
struct SvmModel233 ** SvmLoadModel(istream &f, RunLog &log)
void Svm_Save_Model(std::ostream &o, const SvmModel233 *model)
kkint32 GetMaxIndex(T *vote, kkint32 voteLength, kkint32 &maxIndex2)
const svm_parameter & Param() const
void svm_destroy_model(struct SvmModel233 *model)
void SvmPredictClass(SVMparam &svmParam, struct SvmModel233 **subModel, const struct svm_node *unknownClassFeatureData, kkint32 *votes, double *probabilities, kkint32 knownClass, kkint32 &predClass1, kkint32 &predClass2, kkint32 &predClass1Votes, kkint32 &predClass2Votes, double &predClass1Prob, double &predClass2Prob, double &probOfKnownClass, Ivector &winners, double **crossClassProbTable, double &breakTie)