问题标签 [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.
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
在哪里,是一个要比较的固定值,是模拟的数量。我们正在计算大于ss
STATISTIC
B
ss
STATISTIC.
1
分子和分母相加应该完成什么?
和
为什么我们需要乘以1 - 64 * .Machine$double.eps
?
java - 对数概率Java实现的数值精度
有时,当您使用常见数据类型(例如双精度数)以非常小的概率进行计算时,数值不准确会在多次计算中级联并导致不正确的结果。因此,建议使用对数概率,这可以提高数值稳定性。我已经在 Java 中实现了对数概率并且我的实现工作,但它的数值稳定性比使用原始双精度差。我的实施有什么问题?在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)))
稳定性问题很可能包含在这两行中,但这是我的整个实现:
floating-point - x 的平方根等于 x
给定一个双精度浮点(非负)数x
,其平方的平方根是否总是等于它自己?
换句话说,如果执行以下操作,是否会降低精度:
以便:
我对平方变为无穷大或零的情况不感兴趣,只是适合双精度的数字。
numerical - Logsoftmax 稳定性
我知道如何通过添加元素 -max _i x_i 来使 softmax 稳定。这避免了上溢和下溢。现在,记录这个可能会导致下溢。log softmax(x) 可以计算为零,导致 -infinity。
我不知道如何解决它。我知道这是一个常见的问题。我看了几个答案,我不明白。但我仍然对如何解决这个问题感到困惑。
PS:如果你提供一个简单的例子,那就太棒了。
matlab - 将我的有限差分模型从 2D 更改为 3D 会导致行为不稳定
我一直在编写有限差分代码,用于使用激光诱导热成像来模拟和检测裂缝。裂纹由因素 a 和 b 实现,它们使用鬼点方法“阻尼”通过空气填充裂纹的热流。二维模型按预期运行,满足稳定条件,一切正常。甚至用实验数据很好地证明了这一点。只需复制和粘贴,它就会工作。
但是从 2D 变为 3D,稳定行为的 dt 值比预期增加了几个数量级。我什么都试过了。使用更简单的负载,注释掉“crack-loop”,但没有任何效果。
计算稳定性条件,
应该足够了。但只要尝试 2E-9,该方案就会开始振荡。问题是,我需要裂缝下方的热流。这就是为什么我需要一个 3D 模型,以防万一你问。但是这种方式只需要数年才能计算出 10 到 100 毫秒,这是我需要的范围。
提前谢谢你,我对这个问题非常绝望。
问候亚历克斯
c++ - 比较运算符的数值精度
简短的问题:比较运算符的行为是否以最大精度定义?意思是,如果我有两个精确到相同的数字(x 和 y),当我执行 x < y 时,我是否应该总是期待相同的答案?
我意识到这似乎是一个愚蠢的问题,但让我详细说明一下。我正在使用,double
并且我有一系列数字,例如:
请注意,条目 0、7 和 9 具有相同的值。
当我这样做时(像这样):
我有时会得到:low: 8 high: 0
,有时:low: 8 high: 7
我总是期望最低的索引值。
有任何想法吗?
[编辑缺少的大括号。]
python - 具有极小值的函数的积分对数的数值稳定评估
如果我有一个随机数Z
,它被定义为其他两个随机数和的X
和Y
,那么 的概率分布是和的概率分布Z
的卷积。卷积基本上是分布函数乘积的积分。卷积中的积分往往没有解析解,所以必须用基本的求积算法来计算。在伪代码中:X
Y
举一个具体的例子,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?
r - 为什么 chisq.test 在求和之前按降序对数据进行排序
为什么chisq.test
R中的函数在求和之前按降序对数据进行排序?
有问题的代码是:
如果由于使用浮点运算而担心数值稳定性并想使用一些易于部署的hack,我会在求和之前按升序对数据进行排序,以避免在累加器中将小值添加到大值(以避免尽可能多地修剪结果中的最低有效位)。
我查看了sum的源代码,但它没有解释为什么要按降序将数据传递给sum()
. 我想念什么?
一个例子:
结果:
当我们按升序对数据进行排序时,我们会得到正确的结果。如果我们按降序对数据进行排序,我们会得到一个偏移 4 的结果。
tensorflow - 加权交叉熵张量流
我找不到允许您传入不等于 1 的标签的内置 tensorflow,因此尝试编写自己的:(输入为 [batch_size,labels])
然而,它似乎没有工作(损失是不同的)。我做错什么了吗?