我试图计算特定区域上二元正态分布的概率,这是java中的一个特定多边形。
数学描述是将特定复杂区域上二元正态分布的概率密度函数(、pdf、)结合起来。
我的第一种方法是在NormalDistribution库的帮助下使用两个apache-commons-math对象。给定维度1的dataset x和维度2的dataset y,我计算了每个NormalDistribution的均值和标准差。
使用public double probability(double x0, double x1) from org.apache.commons.math3.distribution.NormalDistribution的方法,我可以为每个维度设置一个单独的间隔,这意味着我可以定义一个矩形区域,并通过
NormalDistribution normalX = new NormalDistribution(means[0], stdDeviation_x);
NormalDistribution normalY = new NormalDistribution(means[1], stdDeviation_y);
double probabilityOfRect = normalX.probability(x1, x2) * normalY.probability(y1, y2);如果标准偏差足够小,定义的区域足够大,那么概率将接近1.0 (0.99999999999),这是预期的。
正如我已经说过的,我需要计算一个特定的区域,我的第一种方法不能这样工作,因为我只能定义矩形区域。
因此,我的第二种方法是使用类MultivariateNormalDistribution,它也是在apache-commons-math中实现的。
通过使用向量均值和协方差矩阵的MultivariateNormalDistribution,我可以用public double density(double[] vals)得到特定点x的pdf,就像描述中所说的
返回在指定点x处计算的此分布的概率密度函数(PDF)。
[http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/distribution/MultivariateNormalDistribution.html#density(double[])](http://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/distribution/MultivariateNormalDistribution.html#density(double[]%29)
在这种方法中,我在点的ArrayList中转换我的复杂区域,然后通过迭代ArrayList来总结所有密度,如下所示:
MultivariateNormalDistribution mnd = new MultivariateNormalDistribution(means, covariances);
double sum = 0.0;
for(Point p : complexArea) {
double[] pos = {p.x, p.y};
sum += mnd.density(pos);
}
return sum;但是,当我将标准差设置为非常低的值时,我遇到了一个缺乏精确性的问题,以便pdf在我称为mnd.density(pos)的位置包含峰值>1。所以求和等于值大于1。
为了避免这些峰值,我试图总结一个求和值的平均值,它是当前点的双精度的周围点
MultivariateNormalDistribution mnd = new MultivariateNormalDistribution(means, covariances);
double sum = 0.0;
for(Point p : surfacePoints) {
double tmpRes = 0.0;
for(double x = p.x - 0.5; x < p.x + 0.5; x+=0.1) {
for(double y = p.y - 0.5; y < p.y + 0.5; y+=0.1) {
double[] pos = {x, y};
tmpRes += mnd.density(pos);
}
}
sum += tmpRes / 100.0;
}
return sum;很明显很管用。
总之,我不太确定我的方法是否从根本上正确。另一种方法是用数值积分计算概率,但我不知道如何在java中实现这一点。
是否还有其他实现这一目标的可能性?
编辑:除了缺乏准确性的事实,主要问题是:第二种方法“总结密度”是否是在二元正态分布区域内获得概率的有效方法?考虑到一维正态分布,一个特定点的概率总是0.Apache数学库中的public double density(double[] vals)方法如何获得有效值?
发布于 2015-04-29 15:08:35
当前的方法是通过在具有整数坐标的点上采样来执行数值积分,并将每个点的值赋给整个正方形。这有两个主要的错误来源。一是函数在方格内可能有很大变化。另一个是边界,在这里,你在区域内不完全包含的正方形上进行积分。第三个错误来源是舍入,但这很少有意义,因为其他来源的错误是巨大的。
减少错误的一个简单方法是使用更精细的网格。如果你用整数除以n的坐标(乘以1/n的面积n^-2乘以1/n平方)采样,这将减少这两个误差源。一个问题是,你在n^2点附近取样。
我建议把区域上的双积分写成积分的积分。
内部积分(例如,关于x)将是区间上一维高斯的积分,如果区域是凸的,或者在最坏的情况下,在有限的积分列表上。您可以将被限制为特定y坐标y0的pdf沿着多边形与水平线y=y0的交点进行集成。您可以使用像erf,在库中进行了数值近似。这样的函数来计算内部积分,也可以使用一维数值积分进行计算。
外积分(例如,相对于y)自然分解成几个部分。当存在多边形点时,外部积分内的函数可能不是光滑的。因此,用多边形顶点的y坐标分解外部积分,并在每个区间上做一个数值积分,如梯形规则或辛普森法则。这就要求你在每个区间的几个点上对内部积分进行评估,并对它们进行适当的加权。
这应该会在给定的时间内产生更精确的结果,而不是简单地细化网格。
发布于 2022-07-13 18:18:07
请参见:
Didonato,A.R.,Jarnagin Jr.,M.P.,& Hageman,R.K.(1980年)。凸多边形上二元正态分布积分的计算。“科学和统计计算杂志”,1(2),179-186。doi:10.1137/0901010
(如果您的多边形不是凸的,则在同一问题上有另一篇论文处理一般情况。)
https://stackoverflow.com/questions/29942652
复制相似问题