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);
        }