diff --git a/modules/ml/src/em.cpp b/modules/ml/src/em.cpp index ea70a06bdc..33587961fd 100644 --- a/modules/ml/src/em.cpp +++ b/modules/ml/src/em.cpp @@ -511,26 +511,27 @@ void EM::computeProbabilities(const Mat& sample, int& label, Mat* probs, double* if(!probs && !logLikelihood) return; - Mat buf, *sampleProbs = probs ? probs : &buf; Mat expL_Lmax(L.size(), CV_64FC1); double maxLVal = L.at(label); for(int i = 0; i < L.cols; i++) expL_Lmax.at(i) = std::exp(L.at(i) - maxLVal); - double partSum = 0, // sum_j!=q (exp(L_ij - L_iq)) - factor; // 1/(1 + partExpSum) + double partSum = 0; // sum_j!=q (exp(L_ij - L_iq)) for(int clusterIndex = 0; clusterIndex < nclusters; clusterIndex++) if(clusterIndex != label) partSum += expL_Lmax.at(clusterIndex); - factor = 1./(1 + partSum); - sampleProbs->create(1, nclusters, CV_64FC1); - expL_Lmax *= factor; - expL_Lmax.copyTo(*sampleProbs); + if(probs) + { + probs->create(1, nclusters, CV_64FC1); + double factor = 1./(1 + partSum); + expL_Lmax *= factor; + expL_Lmax.copyTo(*probs); + } if(logLikelihood) { - double logWeightProbs = std::log(weights.dot(*sampleProbs)); + double logWeightProbs = std::log((1 + partSum) * std::exp(maxLVal)) - 0.5 * dim * CV_LOG2PI; *logLikelihood = logWeightProbs; } }