八度-inf和NaN

时间:2018-08-17 12:28:34

标签: octave

我在论坛上进行了搜索,发现了这个主题,但并未涵盖我的问题 Two ways around -inf

从机器学习课程的第3周开始,我在使用-inf时得到了log(0),后来变成了NaNNaN导致求和公式中没有给出答案,因此J(成本函数是矩阵数学的结果)没有标量。

这是对我的功能的测试

>> sigmoid([-100;0;100])
ans =
3.7201e-44
5.0000e-01
1.0000e+00

这是预期的。但该假设需要ans = 1-sigmoid

>> 1-ans
ans =
1.00000
0.50000
0.00000

和Log(0)给出-Inf

>> log(ans)
ans =
0.00000
-0.69315
-Inf

-Inf行不会添加到成本函数中,但是-Inf会延续到NaN,但我没有得到结果。我在-Inf上找不到任何资料,但我认为乙状结肠功能有问题。

您能提供任何指导吗?

3 个答案:

答案 0 :(得分:1)

在这种情况下,避免无穷大的典型方法是在操作数上添加eps

log(ans + eps)

eps是一个非常小的值,除非ans为零,否则不会影响ans的输出:

>> z = [-100;0;100];
>> g = 1 ./ (1+exp(-z));
>> log(1-g + eps)
ans =
    0.0000
   -0.6931
  -36.0437

答案 1 :(得分:1)

在这里添加答案,我确实希望您能为您的问题提供更多的背景信息(尤其是what are you actually trying to do

我会费力地猜测一下上下文,以防万一这很有用。您可能正在进行机器学习,并试图根据模型的负对数似然定义一个成本函数,然后尝试对其进行区分,以找到该成本最小的点。

通常,对于一个合理的模型,它很有可能遵循Cromwell's rule,您不应该遇到这些问题,但是实际上会发生。大概是在尝试计算零概率的负对数似然的过程中,您得到了inf,并试图计算两点之间的差,从而得出inf / inf = nan。

在这种情况下,这是一个“边缘案例”,通常在计算机科学中,边缘案例需要作为特殊情况加以发现并进行适当处理。现实情况是,您可以合理地预期inf不会成为函数的最小值!因此,无论是从计算中删除它,还是将其替换为非常大的数量(无论是任意更改还是通过机器精度更改),都没有真正的区别。

因此,在实践中,您可以执行此处其他人员建议的两项操作中的任何一项,甚至可以检测到此类实例并从计算中跳过它们。实际结果应该是相同的。

答案 2 :(得分:0)

-inf表示负无穷大。这是正确的答案,因为(0)的对数在定义上为负无穷大。

最简单的方法是检查中间结果,如果数字低于某个阈值(如1e-12),则将其设置为该阈值。答案虽然不完美,但仍然非常接近。

将以下内容用作S型函数:

function g = sigmoid(z)
g = 1 ./ (1 + e.^-z);
end

然后,下面的代码运行没有问题。在“最大值”语句中选择阈值,使其小于测量中的预期噪声,然后就可以了

>> a = sigmoid([-100, 0, 100])
a =

   3.7201e-44   5.0000e-01   1.0000e+00

>> b = 1-a
b =

   1.00000   0.50000   0.00000

>> c = max(b, 1e-12)
c =

   1.0000e+00   5.0000e-01   1.0000e-12

>> d = log(c)
d =

    0.00000   -0.69315  -27.63102