python中的sigmoid,可以采用标量、向量或矩阵

Posted

技术标签:

【中文标题】python中的sigmoid,可以采用标量、向量或矩阵【英文标题】:sigmoid in python that can take scalar, vector or matrix 【发布时间】:2017-07-21 15:59:42 【问题描述】:

以下代码是用 Octave 编程语言编写的

g =1./(1+e.^-(z)

它计算一个 sigmoid 函数,可以采用标量、向量或矩阵。例如 如果我将上述内容放入函数 sigmoid(z) 中,其中 z=0,结果将是:

result=sigmoid(0)

结果将是标量 ( 0.5) 如果传递一个向量说 z= [ 0.2, 0.4, 0.1],它将输出一个向量作为结果:-

 result=sigmoid(z)

结果是一个向量:

 0.54983   0.59869   0.52498

如果z是一个矩阵

 z=[ 0.2 0.4; 0.5 0.7; 0.9 .004]

result = sigmoid(z)

结果是 =

  0.54983   0.59869
  0.62246   0.66819
  0.71095   0.50100

现在如何在 Python 中实现类似的方法?我试过下面的代码,

g=1./ (1 + math.exp(-z))

但它仅适用于标量。不适用于向量和矩阵。我究竟做错了什么。 对不起,我之前的问题不是很清楚。我重新编辑了它。

【问题讨论】:

也许我并不清楚,因为我试图在一个句子中添加更多内容。 我重新编辑了我的问题。感谢您指出。 【参考方案1】:

numpy 模块包含在许多 Python 发行版中并且易于添加到其他发行版中,具有数组功能。以下是如何使用 numpy 在 Python 中做你想做的事情。请注意,在 numpy 中定义数组与在 Octave 中有些不同,但 sigmoid 表达式几乎完全相同。

from numpy import array, exp

z = array([ 0.2, 0.4, 0.1])
print('z = \n', z)
g = 1 / (1 + exp(-z))
print('g =\n', g)

print()

z = array([[0.2, 0.4], [0.5, 0.7], [0.9, .004]])
print('z = \n', z)
g = 1 / (1 + exp(-z))
print('g =\n', g)

该代码(在 IPython 中运行)的结果是:

z = 
 [ 0.2  0.4  0.1]
g =
 [ 0.549834    0.59868766  0.52497919]

z = 
 [[ 0.2    0.4  ]
 [ 0.5    0.7  ]
 [ 0.9    0.004]]
g =
 [[ 0.549834    0.59868766]
 [ 0.62245933  0.66818777]
 [ 0.7109495   0.501     ]]

【讨论】:

太棒了!这真的很管用。我应该知道 numpy 支持所有必需的数学函数,例如 log、e。【参考方案2】:

或者,您可以使用 scipy 中提供的 vectorized Sigmoid function expit

from scipy.special import expit
from numpy import array

z = array([ 0.2, 0.4, 0.1])
g = expit(z)

【讨论】:

以上是关于python中的sigmoid,可以采用标量、向量或矩阵的主要内容,如果未能解决你的问题,请参考以下文章

向量之间的角度 - 只有长度为1的数组可以转换为Python标量

彻底理解 softmax、sigmoid、交叉熵(cross-entropy)

标量向量矩阵和张量

线性代数总结

一句python两句R:标量向量矩阵列表/字典的基本运算差异(持续更新中)

线性代数中的各种量理解:标量向量矩阵张量