CPT1(const DatasetMetadata* metadata, int self, const vector<int>& parents) : CPT(self, parents) { Feature* selfFeature = metadata->featureList[self]; Feature* parentFeature = metadata->classVariable; table.resize(selfFeature->getRange()); for (int i = 0; i < table.size(); ++i) table[i].resize(parentFeature->getRange()); }
double BayesNet::computeMutualInfo(int featureIdxI, int featureIdxJ) const { Feature* Y = metadata->classVariable; Feature* Xi = metadata->featureList[featureIdxI]; Feature* Xj = metadata->featureList[featureIdxJ]; int rangeY = Y->getRange(); int rangeXi = Xi->getRange(); int rangeXj = Xj->getRange(); vector<int> YOccurance; YOccurance.resize(rangeY); vector<vector<int> > YXiOccurance; YXiOccurance.resize(rangeY); for (int valY = 0; valY < rangeY; ++valY) YXiOccurance[valY].resize(rangeXi); vector<vector<int> > YXjOccurance; YXjOccurance.resize(rangeY); for (int valY = 0; valY < rangeY; ++valY) YXjOccurance[valY].resize(rangeXj); vector<vector<vector<int> > > YXiXjOccurance; YXiXjOccurance.resize(rangeY); for (int valY = 0; valY < rangeY; ++valY) { YXiXjOccurance[valY].resize(rangeXi); for (int valXi = 0; valXi < rangeXi; ++valXi) YXiXjOccurance[valY][valXi].resize(rangeXj); } for (int i = 0; i < instances.size(); ++i) { Instance* inst = instances[i]; int valY = (int)round(inst->classLabel); int valXi = (int)round(inst->featureVector[featureIdxI]); int valXj = (int)round(inst->featureVector[featureIdxJ]); YOccurance[valY]++; YXiOccurance[valY][valXi]++; YXjOccurance[valY][valXj]++; YXiXjOccurance[valY][valXi][valXj]++; } int total = (int)instances.size(); double mutualInfo = 0.0; for (int valY = 0; valY < rangeY; ++valY) { for (int valXi = 0; valXi < rangeXi; ++valXi) { for (int valXj = 0; valXj < rangeXj; ++valXj) { double pXiXjY = (YXiXjOccurance[valY][valXi][valXj] + 1.0) / (total + rangeXi * rangeXj * rangeY); double pXiXj_Y = (YXiXjOccurance[valY][valXi][valXj] + 1.0) / (YOccurance[valY] + rangeXi * rangeXj); double pXi_Y = (YXiOccurance[valY][valXi] + 1.0) / (YOccurance[valY] + rangeXi); double pXj_Y = (YXjOccurance[valY][valXj] + 1.0) / (YOccurance[valY] + rangeXj); mutualInfo += pXiXjY * log2(pXiXj_Y / (pXi_Y * pXj_Y)); } } } return mutualInfo; }
CPT2(const DatasetMetadata* metadata, int self, const vector<int>& parents) : CPT(self, parents) { Feature* selfFeature = metadata->featureList[self]; Feature* parentFeature0 = metadata->featureList[parents[0]]; Feature* parentFeature1 = metadata->classVariable; table.resize(selfFeature->getRange()); for (int i = 0; i < table.size(); ++i) { table[i].resize(parentFeature0->getRange()); for (int j = 0; j < table[i].size(); ++j) table[i][j].resize(parentFeature1->getRange()); } }
CPT0(const DatasetMetadata* metadata, int self, const vector<int>& parents) : CPT(self, parents) { Feature* selfFeature = metadata->classVariable; table.resize(selfFeature->getRange()); }