python 中的 sigmoid 函数
sigmoid function in python
我想了解为什么我的 sigmoid 函数在输入为 37 时输出 1。sigmoid 函数:
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 将是 S 形曲线中的 f(x),而 -37 和 37 将是 f(x) 分别为 0 和 1 的位置。使用 -37 和 37 对我不起作用,所以我要问的是为什么它是 37,我该如何解决它,例如它在 -1 和 1 之间
您使用的是常规浮点数,它只能容纳 15 或 16 位有效数字。当您评估 math.e**-37
时,结果是
8.533047625744083e-17
当你把它加到一个时,你可能想要得到
1.00000000000000008533047625744083
但计算机实际上删除了除前 16 位以外的所有数字并给出了
1.000000000000000
这就是 1
。事实上,将 1e-16
添加到 1
只会得到 1
。当您添加 1e-15
时,您确实得到了一个以外的东西,但它比您尝试的要大。
有几种方法可以得到你想要的东西。一种方法是使用 Python 的 decimal 模块,它会在您的数字和计算中添加更多有效数字,您可以添加任意数量的数字。使用小数,
from decimal import Decimal
print(1 / (1 + Decimal(-37).exp()))
你得到
Decimal('0.9999999999999999146695237430')
以及 -37
的结果 sigmoid 函数 1/(1+D(37).exp())
给出
Decimal('8.533047625744065066149031992E-17')
不为零。
另一种解决方案是使用另一个 sigmoid 函数,与您使用的函数不同,它比您的函数更慢地接近 1。一个慢慢接近 1
的是
0.5 * (1 + x / (1 + abs(x)))
这样做 37
产量
0.986842105263158
与1
相差甚远,-37
的结果是
0.01315789473684209
选择您想要的解决方案。
我想了解为什么我的 sigmoid 函数在输入为 37 时输出 1。sigmoid 函数:
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 将是 S 形曲线中的 f(x),而 -37 和 37 将是 f(x) 分别为 0 和 1 的位置。使用 -37 和 37 对我不起作用,所以我要问的是为什么它是 37,我该如何解决它,例如它在 -1 和 1 之间
您使用的是常规浮点数,它只能容纳 15 或 16 位有效数字。当您评估 math.e**-37
时,结果是
8.533047625744083e-17
当你把它加到一个时,你可能想要得到
1.00000000000000008533047625744083
但计算机实际上删除了除前 16 位以外的所有数字并给出了
1.000000000000000
这就是 1
。事实上,将 1e-16
添加到 1
只会得到 1
。当您添加 1e-15
时,您确实得到了一个以外的东西,但它比您尝试的要大。
有几种方法可以得到你想要的东西。一种方法是使用 Python 的 decimal 模块,它会在您的数字和计算中添加更多有效数字,您可以添加任意数量的数字。使用小数,
from decimal import Decimal
print(1 / (1 + Decimal(-37).exp()))
你得到
Decimal('0.9999999999999999146695237430')
以及 -37
的结果 sigmoid 函数 1/(1+D(37).exp())
给出
Decimal('8.533047625744065066149031992E-17')
不为零。
另一种解决方案是使用另一个 sigmoid 函数,与您使用的函数不同,它比您的函数更慢地接近 1。一个慢慢接近 1
的是
0.5 * (1 + x / (1 + abs(x)))
这样做 37
产量
0.986842105263158
与1
相差甚远,-37
的结果是
0.01315789473684209
选择您想要的解决方案。