问题标签 [numerical-stability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
45 浏览

r - 计算分数有时非常接近零的数值策略

在 R 函数chisq.test()中有以下行:

PVAL <- (1 + sum(ss >= almost.1 * STATISTIC))/(B + 1)

almost.1 <- 1 - 64 * .Machine$double.eps

这显然是一种计算调整,以避免为PVAL.

计算什么并不重要,但我们真正想要的是,一堆模拟的结果sum(ss >= STATISTIC)/ B在哪里,是一个要比较的固定值,是模拟的数量。我们正在计算大于ssSTATISTICBssSTATISTIC.

1分子和分母相加应该完成什么?

为什么我们需要乘以1 - 64 * .Machine$double.eps

0 投票
1 回答
604 浏览

java - 对数概率Java实现的数值精度

有时,当您使用常见数据类型(例如双精度数)以非常小的概率进行计算时,数值不准确会在多次计算中级联并导致不正确的结果。因此,建议使用对数概率,这可以提高数值稳定性。我已经在 J​​ava 中实现了对数概率并且我的实现工作,但它的数值稳定性比使用原始双精度差。我的实施有什么问题?在Java中以小概率执行许多连续计算的准确有效的方法是什么?

我无法为这个问题提供一个简洁的演示,因为许多计算的不准确性会级联。然而,这里有一个问题存在的证据:由于数值准确性,提交给 CodeForces 竞赛的文件失败了。运行测试 #7 并添加调试打印清楚地表明,从 1774 天开始,数字错误开始级联,直到概率总和下降到 0(当它应该为 1 时)。在用一个简单的包装器替换我的 Prob 类后,完全相同的解决方案通过了测试

我的乘法概率的实现:

a * b = Math.log(a) + Math.log(b)

我的加法实现:

a + b = Math.log(a) + Math.log(1 + Math.exp(Math.log(b) - Math.log(a)))

稳定性问题很可能包含在这两行中,但这是我的整个实现:

0 投票
2 回答
328 浏览

floating-point - x 的平方根等于 x

给定一个双精度浮点(非负)数x,其平方的平方根是否总是等于它自己?

换句话说,如果执行以下操作,是否会降低精度:

以便:

我对平方变为无穷大或零的情况不感兴趣,只是适合双精度的数字。

0 投票
4 回答
4788 浏览

numerical - Logsoftmax 稳定性

我知道如何通过添加元素 -max _i x_i 来使 softmax 稳定。这避免了上溢和下溢。现在,记录这个可能会导致下溢。log softmax(x) 可以计算为零,导致 -infinity。

我不知道如何解决它。我知道这是一个常见的问题。我看了几个答案,我不明白。但我仍然对如何解决这个问题感到困惑。

PS:如果你提供一个简单的例子,那就太棒了。

0 投票
2 回答
111 浏览

matlab - 将我的有限差分模型从 2D 更改为 3D 会导致行为不稳定

我一直在编写有限差分代码,用于使用激光诱导热成像来模拟和检测裂缝。裂纹由因素 a 和 b 实现,它们使用鬼点方法“阻尼”通过空气填充裂纹的热流。二维模型按预期运行,满足稳定条件,一切正常。甚至用实验数据很好地证明了这一点。只需复制和粘贴,它就会工作。

但是从 2D 变为 3D,稳定行为的 dt 值比预期增加了几个数量级。我什么都试过了。使用更简单的负载,注释掉“crack-loop”,但没有任何效果。

计算稳定性条件,

应该足够了。但只要尝试 2E-9,该方案就会开始振荡。问题是,我需要裂缝下方的热流。这就是为什么我需要一个 3D 模型,以防万一你问。但是这种方式只需要数年才能计算出 10 到 100 毫秒,这是我需要的范围。

提前谢谢你,我对这个问题非常绝望。

问候亚历克斯

0 投票
2 回答
137 浏览

c++ - 比较运算符的数值精度

简短的问题:比较运算符的行为是否以最大精度定义?意思是,如果我有两个精确到相同的数字(x 和 y),当我执行 x < y 时,我是否应该总是期待相同的答案?

我意识到这似乎是一个愚蠢的问题,但让我详细说明一下。我正在使用,double并且我有一系列数字,例如:

请注意,条目 0、7 和 9 具有相同的值。

当我这样做时(像这样):

我有时会得到:low: 8 high: 0,有时:low: 8 high: 7 我总是期望最低的索引值。

有任何想法吗?

[编辑缺少的大括号。]

0 投票
1 回答
1198 浏览

python - 具有极小值的函数的积分对数的数值稳定评估

如果我有一个随机数Z,它被定义为其他两个随机数和的XY,那么 的概率分布是和的概率分布Z的卷积。卷积基本上是分布函数乘积的积分。卷积中的积分往往没有解析解,所以必须用基本的求积算法来计算。在伪代码中:XY

举一个具体的例子,Z一个正态分布变量X和一个对数正态分布变量之和Y可以用下面的 Python/Scipy 代码计算:

现在我想计算对数概率。天真的解决方案很简单:

然而,这在数值上是不稳定的。在大约 39 个标准差之后,概率分布在数值上为 0.0,因此即使对数概率具有某个有限值,也无法通过简单地取概率的对数来计算除此之外的值。比较norm.pdf(39, 1, 0)哪个是 0.0,norm.logpdf(39, 1, 0)哪个大约是 -761。logpdf显然,Scipy 不会计算log(pdf)- 它会找到其他方式 - 因为否则它会返回-inf,一个较差的响应。同样,我想为我的问题找到另一种方法。

(您可能想知道为什么我关心与平均值相差甚远的值的对数相似度。答案是参数拟合。当对数似然为某个极大的负数时,拟合算法可以更接近,但当它是-inf或时,什么都做不了nan。 )

问题是:有谁知道我可以如何重新排列log(quad(...)),所以我不计算quad(...),从而避免在日志中创建 0.0?

0 投票
1 回答
416 浏览

r - 为什么 chisq.test 在求和之前按降序对数据进行排序

为什么chisq.testR中的函数在求和之前按降序对数据进行排序?

有问题的代码是:

如果由于使用浮点运算而担心数值稳定性并想使用一些易于部署的hack,我会在求和之前按升序对数据进行排序,避免在累加器中将小值添加到大值(以避免尽可能多地修剪结果中的最低有效位)。

我查看了sum的源代码,但它没有解释为什么要按降序将数据传递给sum(). 我想念什么?

一个例子:

结果:

当我们按升序对数据进行排序时,我们会得到正确的结果。如果我们按降序对数据进行排序,我们会得到一个偏移 4 的结果。

0 投票
1 回答
269 浏览

tensorflow - 加权交叉熵张量流

我找不到允许您传入不等于 1 的标签的内置 tensorflow,因此尝试编写自己的:(输入为 [batch_size,labels])

然而,它似乎没有工作(损失是不同的)。我做错什么了吗?

0 投票
1 回答
69 浏览

python - 提高 numpy narrays 的精度

我已经使用 numpy 编写了这个优化过程,我必须执行以下计算:

公式

B 是对称负半定矩阵,I 是单位矩阵。问题是 B 的值可能太大(> 1e25),当减去对角矩阵时,一些元素不会因为有足够的精度。有什么办法可以克服这个问题,还是我需要使用另一个库(如 mpmath)重写它?