1

我有一组点并提取其中的一小部分来计算二元正态分布。之后,我通过计算每个点的 PDF 并拒绝值低于某个阈值的点来检查所有其他点是否适合该分布。

理论讲了这么多...

PDF根据维基百科的公式:

公式

σ 是标准偏差,μ 是平均值,计算如下:

cv::Scalar mean;
cv::Scalar stdDev;
dataPoints = dataPoints.reshape(3); // convert 3 columns to 3 channels
cv::meanStdDev(dataPoints, mean, stdDev);
dataPoints = dataPoints.reshape(1); // convert back
meanX = mean.val[0];
meanY = mean.val[1];
sigmaX = stdDev.val[0];
sigmaY = stdDev.val[1];

dataPoints 是具有 3 列浮点数(x、y、索引)的 cv::Mat。

ρ 是我这样计算的相关系数:

cv::matchTemplate(dataPoints.col(0), dataPoints.col(1), rho, cv::TM_CCOEFF_NORMED);

最后一步是使用以下方法计算每个点的概率:

double p = (1. / (2. * M_PI * sigmaX * sigmaY * sqrt(1. - pow(rho, 2))));
double e = exp((-1. / 2.) * D(x, y, rho));
double ret = p * e;

据我所知,D() 应该是马氏距离,但是 OpenCV 的公式cv::Mahalanobis(x, y, rho)返回的值与我自己计算时的值不同:

double cX = (x - meanX) / sigmaX;
double cY = (y - meanY) / sigmaY;
double a = (1. / (1. - pow(rho, 2)));
double b = (pow(cX, 2) + pow(cY, 2) - 2. * rho * cX * cY);
double ret = a * b;

所以现在我的问题:

据我所知,PDF 的积分应该是 1,PDF 的最大值应该是(meanX, meanY),所以当 σ 为 0 时,平均值的 PDF 应该是 1。但是通过上面的计算,我可以得到超过 1 的值。我怎么了?

4

0 回答 0