Octave 倍频程inf与NaN
我搜索了论坛,找到了这个帖子,但它没有涵盖我的问题 在第3周的机器学习课上,当我使用Octave 倍频程inf与NaN,octave,Octave,我搜索了论坛,找到了这个帖子,但它没有涵盖我的问题 在第3周的机器学习课上,当我使用log(0)时,我得到了-inf,它后来变成了NaN。NaN导致在求和公式中没有给出答案,因此J没有标量(矩阵数学结果的代价函数) 这是对我的功能的测试 >> sigmoid([-100;0;100]) ans = 3.7201e-44 5.0000e-01 1.0000e+00 这是意料之中的。但该假设需要ans=1-sigmoid >> 1-ans ans = 1.00000 0.
log(0)
时,我得到了-inf
,它后来变成了NaN
。NaN
导致在求和公式中没有给出答案,因此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
日志(0)给出-Inf
>> log(ans)
ans =
0.00000
-0.69315
-Inf
-Inf
行不会添加到成本函数中,但是-Inf
会传递到NaN
,我没有得到结果。我在-Inf
上找不到任何资料,但我认为我的sigmoid函数有问题
你能提供任何方向吗?-inf表示负无穷大。这是正确的答案,因为(0)的对数定义为负无穷大 最简单的方法是检查中间结果,如果数字低于某个阈值(如1e-12),则将其设置为该阈值。答案并不完美,但仍然非常接近 使用以下函数作为sigmoid函数:
function g = sigmoid(z)
g = 1 ./ (1 + e.^-z);
end
然后,以下代码运行时不会出现任何问题。在“max”语句中选择阈值,使其小于测量中的预期噪声,然后就可以开始了
>> 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
在这些情况下,避免无穷大的典型方法是向操作数添加
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
除了这里的答案,我真的希望你能为你的问题提供更多的背景(特别是 我将冒险猜测上下文,以防万一这是有用的。您可能正在进行机器学习,并尝试根据模型的负对数似然定义成本函数,然后尝试将其区分开来,以找到成本最小的点 一般来说,对于一个具有有用可能性的合理模型,你不应该有这些问题,但是,在实践中它会发生。大概在尝试计算零概率的负对数可能性的过程中,你会得到inf,并且尝试计算两点之间的差分会产生inf/inf=nan 在这种情况下,这是一个“边缘情况”,通常在计算机科学中,边缘情况需要被视为例外情况并适当处理。事实上,你可以合理地预期inf不会是你函数的最小值!因此,无论你是从计算中删除它,还是用一个非常大的n替换它umber(无论是任意的还是通过机器精度)并没有真正的区别
因此,在实践中,你可以做其他人建议的两件事中的任何一件,甚至只检测这样的实例并将其从计算中跳过。实际结果应该是相同的。inf行可能会对成本函数起作用。从技术上讲,sigmoid(100)只是略小于1,但对于浮点表示的精度来说,差异可能太小了。(1-ans)因此是一个非常非常小的正数。因此,log(1-ans)是一个非常非常负的数。这肯定会影响代价函数。我的sigmoid函数是g=1。/(1+exp(-z));这与spoonless的g=1./(1+e.^-z)非常相似;我的sigmoid函数是g=1./(1+exp(-z));这与spoonless的g=1./(1+e.^-z)非常相似;e.^-z和exp(-z)有什么不同吗返回不同精度的值?是否有八度或其他设置会影响此结果?感谢您的建议。(很抱歉有多篇帖子,这是由于手指肥胖)@Edwardh:您可以通过单击“x”删除自己的评论按钮,如果您将鼠标悬停在注释上,它会出现在注释末尾。@Edwardh:MATLAB不知道
e
,它可能是一个倍频程扩展。但是,exp(-z)
和exp(1)。^-z
产生几乎相同的值(3.7201e-44
)在任何情况下,1-g
在这两种情况下都与0
相同。