C++ 如何计算二元正态分布的PDF?

C++ 如何计算二元正态分布的PDF?,c++,opencv,normal-distribution,probability-density,C++,Opencv,Normal Distribution,Probability Density,我有一组点,并提取其中的一小部分用于计算二元正态分布。然后,通过计算每个点的PDF并拒绝值低于某个阈值的点,检查所有其他点是否适合此分布 关于这个理论有很多 根据维基百科,PDF包含以下公式: σ是标准偏差,μ是平均值,计算如下: cv::Scalar mean; cv::Scalar stdDev; dataPoints = dataPoints.reshape(3); // convert 3 columns to 3 channels cv::meanStdDev(dataPoints,

我有一组点,并提取其中的一小部分用于计算二元正态分布。然后,通过计算每个点的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是一个cv::Mat,有3列浮动(x、y、索引)

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

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的值。我错了什么?

我很肯定你不是说stackoverflow标签[pdf]的pdf都是关于……是的,对不起。我的意思是概率密度函数
double e=exp((-1./2.)*D(x,y,rho))
与这个公式不太匹配-
(1-rho^2)
位发生了什么?为什么不使用矩阵表示法呢?它在D()->double a=(1./(1-pow(rho,2))中;