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