示例#1
0
        public GaussianNaiveBayes Estimate(Matrix input, Vector output)
        {
            // Algorithm used to calculate variance + mean : http://i.stanford.edu/pub/cstr/reports/cs/tr/79/773/CS-TR-79-773.pdf
            var distinctOutput = output.Distinct();
            var nbFeatures     = input.NbColumns;
            var nbClasses      = distinctOutput.Count();
            var classCount     = new int[nbClasses];
            var classPrior     = new int[nbClasses];
            var epsilon        = 1e-9 * input.Variance().Max().Key.GetNumber();

            Theta = Matrix.BuildEmptyMatrix(nbClasses, nbFeatures);
            Sigma = Matrix.BuildEmptyMatrix(nbClasses, nbFeatures);
            for (int i = 0; i < nbClasses; i++)
            {
                var    ot        = distinctOutput.Values[i];
                var    indexes   = output.FindIndexes(ot);
                Matrix subMatrix = indexes.Select(_ => input.GetRowVector(_).Values).ToArray();
                var    kvp       = UpdateMeanVariance(subMatrix);
                Theta.SetRow(kvp.Key, i);
                Sigma.SetRow(kvp.Value, i);
                classCount[i] = subMatrix.NbRows;
            }

            Sigma = Sigma.Sum(epsilon);
            CalculateClassPrior(output);
            return(this);
        }