Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Octave 倍频程inf与NaN_Octave - Fatal编程技术网

Octave 倍频程inf与NaN

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.

我搜索了论坛,找到了这个帖子,但它没有涵盖我的问题

在第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.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
相同。