private double CalculateFeatureProbability(NaiveBayesProbabilityTable table, int featureIndex) { int totalNumerator = 0; for (int i = 0; i < ClassMappingDictionary.Count; i++) { totalNumerator += table[featureIndex][i].Numerator; } return(totalNumerator / (double)ClassProbabilityTable[0].Denominator); }
private double CalculateFeatureLikelihood(NaiveBayesProbabilityTable table, int featureNumerator, int labelIndex) { int totalDenominator = 0; for (int i = 0; i < table.Rows; i++) { totalDenominator += table[i][labelIndex].Numerator; } return(featureNumerator / (double)totalDenominator); }
private void SetupFeatureProbabilityTables() { for (int i = 0; i < FeatureMappingDictionaries.Count; i++) { var probabilityTable = new NaiveBayesProbabilityTable(); for (int j = 0; j < FeatureMappingDictionaries[i].Count; j++) { probabilityTable.AddRow(ClassMappingDictionary.Count); } FeatureProbabilityTables.Add(probabilityTable); } }
private List <ProbabilityStorage> PredictProbabilities(List <object> x) { var featureIndices = new List <int>(); for (int i = 0; i < x.Count; i++) { var featureMappingDict = FeatureMappingDictionaries[i]; int index = featureMappingDict.GetValueOrDefault(x[i], -1); featureIndices.Add(index); } var retPredictionProbabilites = new List <ProbabilityStorage>(); foreach (KeyValuePair <object, int> mappedLabel in ClassMappingDictionary) { double calculatedProbability = 1.0; int labelIndex = mappedLabel.Value; ProbabilityTableEntry labelEntry = ClassProbabilityTable[labelIndex]; double labelProbability = labelEntry.Numerator / (double)labelEntry.Denominator; for (int i = 0; i < featureIndices.Count; i++) { if (featureIndices[i] == -1) { double toAdd = 1.0 / (FeatureProbabilityTables[i].Rows + 1); double labelProbabilityPrime = (labelEntry.Numerator + toAdd) / (labelEntry.Denominator + 1); } else { int featureIndex = featureIndices[i]; NaiveBayesProbabilityTable currTable = FeatureProbabilityTables[i]; ProbabilityTableEntry entry = FeatureProbabilityTables[i][featureIndex][labelIndex]; double featureProbability = CalculateFeatureProbability(currTable, featureIndex); double divisionResult = CalculateFeatureLikelihood(currTable, entry.Numerator, labelIndex); if (divisionResult == 0) { double toAdd = 1.0 / currTable.Rows; divisionResult = (entry.Numerator + toAdd) / (entry.Denominator + 1); } calculatedProbability *= (divisionResult * labelProbability) / featureProbability; } } retPredictionProbabilites.Add(new ProbabilityStorage(calculatedProbability, mappedLabel.Key)); } retPredictionProbabilites.Sort(ProbabilityStorage.Sort); return(retPredictionProbabilites); }