我试图计算特定区域的二元正态分布概率,分别是java中的特定多边形。
数学描述将整合特定复杂区域的二元正态分布的概率密度函数( pdf )。
我的第一种方法是在NormalDistribution
库的帮助下使用两个apache-commons-math
个对象。给定维度1的数据集x和维度2的数据集y我计算了每个NormalDistribution
的平均值和标准差。
用这个方法
来自public double probability(double x0, double x1)
的{{1}}我可以为每个维度设置单独的区间,这意味着我可以定义矩形区域并通过
org.apache.commons.math3.distribution.NormalDistribution
如果标准偏差足够小且定义的区域足够大,概率将接近1.0(0.99999999999),这是预期的。
正如我所说,我需要计算一个特定区域,我的第一种方法不会这样做,因为我只能定义矩形区域。
所以我的第二种方法是使用类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);
,它也在MultivariateNormalDistribution
中实现。
通过将apache-commons-math
与向量均值和协方差矩阵一起使用,我能够得到具有MultivariateNormalDistribution
的特定点x的pdf,就像说明
返回此分布的概率密度函数(PDF) 在指定的点x进行评估。
在这种方法中,我在PointsList中转换我的复杂区域,然后通过迭代ArrayList来总结所有密度:
public double density(double[] vals)
但是当我将标准偏差设置为非常低的值时,我遇到了缺乏精度的问题,因此pdf包含峰值> 1,在我调用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;
的位置。所以总和是加起来的值> 1.
为了避免这些峰值,我试图总结一个总和值的平均值,它是当前点双精度的周围点
mnd.density(pos)
显然有效。
总而言之,我不太确定我的方法是否从根本上是正确的。另一种方法是通过数值积分来计算概率,但我不知道如何在java中实现这一点。
还有其他可能实现这一目标吗?
编辑:
除了缺乏准确性这一事实外,主要问题是:第二种方法是“总结密度”和“#34;获得双变量正态分布区域概率的有效方法?考虑一维正态分布,一个特定点的概率始终为0. apache数学库中的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;
方法如何获得有效值?
答案 0 :(得分:3)
您当前的方法是通过在具有整数坐标的点处采样来执行数值积分,将每个点处的值指定给整个正方形。这有两个主要的错误来源。一个是该功能可能在广场内变化很大。另一个是边界,您可以在该边界上整合不完全包含在该区域中的方块。第三个错误来源是四舍五入,但由于其他错误来源很多,这种情况很少发生。
减少错误的一种简单方法是使用更精细的网格。如果您在坐标为整数除以n的点处进行采样(并乘以1 / n乘以1 / n正方形的面积n ^ -2),这将减少两个误差源。一个问题是你在大约n ^ 2处采样的点数。
我建议在整个区域内写一个双积分作为积分的积分。
内部积分(例如,相对于x)将是区间上的一维高斯的积分,如果该区域是凸的,或者最坏的是在有限的积分列表上。您将限制为特定y坐标y0的pdf沿多边形与水平线y = y0的交点进行积分。您可以使用erf, which is numerically approximated in libraries等函数来评估内积分,或者您可以使用一维数值积分自行完成。
外部整体(例如,相对于y)自然地分裂成碎片。如果多边形有一个点,则外积分内的函数可能不平滑。因此,通过多边形顶点的y坐标分解外积分,并在每个间隔上执行数值积分,例如梯形规则或Simpson's Rule。这些要求您在每个区间的几个点评估内部积分并对它们进行适当的加权。
与简单地改进网格相比,这应该在给定的时间内产生更准确的结果。