首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算面积/多边形上二元正态分布的概率

计算面积/多边形上二元正态分布的概率
EN

Stack Overflow用户
提问于 2015-04-29 11:41:17
回答 2查看 1.9K关注 0票数 1

我试图计算特定区域上二元正态分布的概率,这是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的方法,我可以为每个维度设置一个单独的间隔,这意味着我可以定义一个矩形区域,并通过

代码语言:javascript
复制
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来总结所有密度,如下所示:

代码语言:javascript
复制
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。

为了避免这些峰值,我试图总结一个求和值的平均值,它是当前点的双精度的周围点

代码语言:javascript
复制
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)方法如何获得有效值?

EN

回答 2

Stack Overflow用户

发布于 2015-04-29 15:08:35

当前的方法是通过在具有整数坐标的点上采样来执行数值积分,并将每个点的值赋给整个正方形。这有两个主要的错误来源。一是函数在方格内可能有很大变化。另一个是边界,在这里,你在区域内不完全包含的正方形上进行积分。第三个错误来源是舍入,但这很少有意义,因为其他来源的错误是巨大的。

减少错误的一个简单方法是使用更精细的网格。如果你用整数除以n的坐标(乘以1/n的面积n^-2乘以1/n平方)采样,这将减少这两个误差源。一个问题是,你在n^2点附近取样。

我建议把区域上的双积分写成积分的积分。

内部积分(例如,关于x)将是区间上一维高斯的积分,如果区域是凸的,或者在最坏的情况下,在有限的积分列表上。您可以将被限制为特定y坐标y0的pdf沿着多边形与水平线y=y0的交点进行集成。您可以使用像erf,在库中进行了数值近似。这样的函数来计算内部积分,也可以使用一维数值积分进行计算。

外积分(例如,相对于y)自然分解成几个部分。当存在多边形点时,外部积分内的函数可能不是光滑的。因此,用多边形顶点的y坐标分解外部积分,并在每个区间上做一个数值积分,如梯形规则或辛普森法则。这就要求你在每个区间的几个点上对内部积分进行评估,并对它们进行适当的加权。

这应该会在给定的时间内产生更精确的结果,而不是简单地细化网格。

票数 3
EN

Stack Overflow用户

发布于 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

(如果您的多边形不是凸的,则在同一问题上有另一篇论文处理一般情况。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29942652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档