我有一组点并提取它们的一小部分用于计算二元正态分布。然后,我通过计算每个点的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,index)的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的值。我有什么问题?