public Matrix PredictProbability(Matrix input) { var jointLogLikelihood = new Vector[ClassPriors.Count()]; for (int i = 0; i < ClassPriors.Count(); i++) { var kvp = ClassPriors.ElementAt(i); var jointi = System.Math.Log(kvp.Value); var nij = Sigma.GetRowVector(i).Multiply(System.Math.PI).Multiply(2.0).Log().Sum().GetNumber() * -0.5; var res = input.Substract(Theta.GetRowVector(i)).Pow(2).Div(Sigma.GetRowVector(i)).SumAllRows().Multiply(-0.5).Sum(nij); jointLogLikelihood[i] = res.Sum(jointi); } Matrix jointLogLikelihoodMatrix = jointLogLikelihood; jointLogLikelihoodMatrix = jointLogLikelihoodMatrix.Transpose(); var logProbX = jointLogLikelihoodMatrix.Logsumexp(); return(jointLogLikelihoodMatrix.Substract(logProbX).Exp()); }