double DecisionTree::ComputeEntropyGivenSurvival(int attr, vi& data){ vi ones, zeroes; for(int i : data){ if(train[i][0] == 0) zeroes.pb(i); else ones.pb(i); } double entropy = (ones.size() * ComputeEntropy(attr, ones) + zeroes.size() * ComputeEntropy(attr, zeroes)) / data.size(); return entropy; }
// LogZp double MatchMRFGraph::ComputeLogZp() { double ae,en; ae = ComputeAverageEnergy(); en = ComputeEntropy(); return ae+en; }
int DecisionTree::ChooseAttributeToSplit(node* curr){ if(__MESSAGE__) cout << "Choosing an attribute to split ... " << endl; vector<pair<double,int> > v; double mutualInfo = 0; for(int i=1; i<NUM_ATTR; i++){ if(curr->parAttr.count(i)) continue; mutualInfo = ComputeEntropy(i, curr->data) - ComputeEntropyGivenSurvival(i, curr->data); v.pb(mp(mutualInfo, NUM_ATTR - i)); } if(v.empty()) return -1; sort(v.begin(), v.end()); int ret = (NUM_ATTR - v.back().second); if(__MESSAGE__) cout << "Chosen attribute number for splitting : " << ret << "..." <<endl; return ret; }