我试图理解为什么我的乙状结肠功能当输入是37,它输出1。乙状结肠功能:
import math
def sigmoid(x):
return 1 / (1 + math.e ** -x)
我数学不好,但我认为永远不应该有一刻f(x)等于1对吧?也许是因为e常数不够精确,但我真正的问题是,我想把一个0到1之间的数字映射到f(x)为0时x是什么,f(x)为1时x是什么。我的地图功能:
def p5map(n, start1, stop1, start2, stop2):
return ((float(n)-start1)/(stop1-start1))*(stop2-start2)+start2
所以举个例子
p5map(y, 0, 1, -37, 37)
其中y在乙状结肠曲线中为f(x),而-37和37分别为f(x)为0和1。使用-37和37对我不起作用,所以我要问的是为什么它是37,我如何修复它,例如它在-1和1之间
您使用的是常规浮点数,它只能包含15或16个有效数字。当您计算
math.e**-37
时,结果是当你把它添加到一个时,你可能想得到
但实际上,计算机删除了除前16位以外的所有数字,并给出
这就是
1
。实际上,将1e-16
添加到1
只会得到1
。当你添加1e-15
时,你确实得到了一个以外的东西,但这比你正在尝试的要大。有几种方法可以得到你想要的东西。一种方法是使用Python的decimal模块,它向数字和计算中添加更多的有效数字,您可以添加任意数量的数字。使用十进制
你得到
得到的sigmoid函数
1/(1+D(37).exp())
给出了-37
这不是零。
另一个解决方案是使用另一个乙状结肠功能,不同于你使用的那个,它比你使用的慢得多。慢慢接近
1
的是这样做是为了
37
产生离
1
很远,结果是-37
选择你想要的解决方案。
相关问题 更多 >
编程相关推荐