python - python 中的 sigmoid 函数

标签 python math sigmoid

我想了解为什么我的 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。我的 map 功能:

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 之间

最佳答案

您使用的是常规 float ,它只能容纳 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

选择您想要的解决方案。

关于python - python 中的 sigmoid 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44466751/

相关文章:

python - logistic/sigmoid 函数实现数值精度

python - Python 神经网络中不需要的 [Nan] 输出

python - 为 python 中的列表定义数值稳定的 sigmoid 函数的最佳方法

c++ - 为静态库编译 SWIG Python 包装器?

带类的 Python 自引用字典

java - 验证FFT算法的正确性

ios - 生成介于 pi/2 和 -pi/2 之间的随机数

python - 如何根据 2 个数据框中的列匹配创建列表? Python

python - 在 python 中使用四阶龙格库塔求解 3 个耦合非线性微分方程

math - 导致 MD5 冲突的最短字符串对是什么?