$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$

下面我将为您介绍几种在 Python 中使用 Sigmoid 函数的主流方法,从最基础的 NumPy 到深度学习框架。
使用 NumPy (最常用、最基础)
NumPy 是 Python 科学计算的基础库,它提供了高效的数组操作和数学函数,对于大多数需要手动实现或进行数值计算的场景,NumPy 是首选。
安装 NumPy
如果您还没有安装,请先安装:
pip install numpy
实现 Sigmoid 函数
使用 numpy.exp (推荐)
这是最直接、最符合数学公式的方法,性能也很好。

import numpy as np
def sigmoid_numpy(x):
"""
使用 NumPy 实现 Sigmoid 函数。
参数:
x : numpy.ndarray
输入数据,可以是标量或数组。
返回:
numpy.ndarray
Sigmoid 函数的输出。
"""
return 1 / (1 + np.exp(-x))
# --- 示例 ---
# 1. 处理单个数值
scalar_input = 0.0
output = sigmoid_numpy(scalar_input)
print(f"Sigmoid({scalar_input}) = {output:.4f}") # 输出: Sigmoid(0.0) = 0.5000
# 2. 处理 NumPy 数组
array_input = np.array([-1, 0, 1, 2, 3])
outputs = sigmoid_numpy(array_input)
print(f"Sigmoid({array_input}) = {outputs}")
# 输出: Sigmoid([-1 0 1 2 3]) = [0.26894142 0.5 0.73105858 0.88079708 0.95257413]
使用 scipy.special.expit (更优)
scipy.special 模块中有一个专门计算 Sigmoid 函数的函数 expit,它通常比 1 / (1 + np.exp(-x)) 更快,并且经过了高度优化,能更好地处理各种数值边界情况(例如非常大的正数或负数)。
import numpy as np
from scipy.special import expit
# --- 示例 ---
scalar_input = 0.0
output = expit(scalar_input)
print(f"scipy.special.expit({scalar_input}) = {output:.4f}") # 输出: 0.5000
array_input = np.array([-1, 0, 1, 2, 3])
outputs = expit(array_input)
print(f"scipy.special.expit({array_input}) = {outputs}")
# 输出: [0.26894142 0.5 0.73105858 0.88079708 0.95257413]
小结:在 NumPy 生态中,scipy.special.expit 是实现 Sigmoid 函数的最佳实践,因为它更专业、更高效。
使用深度学习框架
在构建神经网络时,我们通常使用深度学习框架(如 TensorFlow 或 PyTorch),因为它们提供了自动求导(梯度计算)的功能,这是训练模型所必需的。
使用 TensorFlow/Keras
TensorFlow 的 Keras API 非常友好,内置了 Sigmoid 激活函数。
安装 TensorFlow
pip install tensorflow
使用方法
import tensorflow as tf
import numpy as np
# --- 示例 1: 在 Keras 层中使用 ---
# 在构建模型时直接指定激活函数为 'sigmoid'
from tensorflow.keras.layers import Dense
# 这是一个简单的网络层示例
# activation='sigmoid' 会自动在该层应用 Sigmoid 函数
dense_layer = Dense(units=1, activation='sigmoid')
input_data = np.array([[0.5], [-1.0], [2.0]])
output = dense_layer(input_data)
print("Keras Dense layer output:\n", output.numpy())
# --- 示例 2: 直接调用激活函数 ---
# 你也可以直接调用独立的激活函数
input_data = np.array([-1, 0, 1])
output = tf.keras.activations.sigmoid(input_data)
print("tf.keras.activations.sigmoid output:\n", output.numpy())
使用 PyTorch
PyTorch 是另一个流行的深度学习框架,它将 Sigmoid 作为一个独立的模块。
安装 PyTorch 请根据您的系统和 CUDA 版本从 PyTorch 官网 获取安装命令。
使用方法
import torch
import torch.nn as nn
import numpy as np
# --- 示例 1: 使用 nn.Sigmoid 模块 ---
# 在模型定义中,可以像搭建乐高一样添加 Sigmoid 模块
sigmoid_module = nn.Sigmoid()
input_tensor = torch.tensor([-1.0, 0.0, 1.0])
output = sigmoid_module(input_tensor)
print("nn.Sigmoid module output:\n", output)
# --- 示例 2: 使用 torch.sigmoid 函数 ---
# 也可以直接调用函数,它和 nn.Sigmoid 的功能一样
input_tensor = torch.tensor([-1.0, 0.0, 1.0])
output = torch.sigmoid(input_tensor)
print("torch.sigmoid function output:\n", output)
手动实现 (不推荐,但为了完整性)
虽然不推荐用于生产环境,但理解其原理有助于学习,你可以用纯 Python 实现,但这在处理大数据时性能极差。
import math
def sigmoid_manual(x):
"""
纯 Python 手动实现 Sigmoid 函数。
注意:对于数组输入,此方法非常慢。
"""
return 1 / (1 + math.exp(-x))
# --- 示例 ---
print(f"Sigmoid(0.0) = {sigmoid_manual(0.0):.4f}") # 输出: 0.5000
# 对于数组,你需要循环处理
array_input = [-1, 0, 1]
outputs = [sigmoid_manual(x) for x in array_input]
print(f"Sigmoid({array_input}) = {outputs}")
# 输出: Sigmoid([-1, 0, 1]) = [0.2689414213699951, 0.5, 0.7310585786300049]
总结与选择建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
scipy.special.expit |
性能最佳,数值稳定,API 简洁 | 需要安装 scipy |
科学计算、数据分析、任何非深度学习的数值计算 |
numpy 实现 |
无需额外库(NumPy 是基础),直观 | 性能略逊于 expit |
快速脚本、教学、学习 |
tf.keras.activations.sigmoid |
与 TensorFlow 生态系统无缝集成,支持自动求导 | 需要安装 TensorFlow | 构建 TensorFlow/Keras 模型 |
torch.sigmoid / nn.Sigmoid |
与 PyTorch 生态系统无缝集成,支持自动求导 | 需要安装 PyTorch | 构建 PyTorch 模型 |
| 纯 Python | 无需任何库,易于理解 | 性能极差,无法处理数组 | 学习算法原理,不用于实际计算 |
- 如果你在做数据分析和科学计算,使用
scipy.special.expit。 - 如果你在用 TensorFlow/Keras,直接在层中使用
activation='sigmoid'或调用tf.keras.activations.sigmoid。 - 如果你在用 PyTorch,使用
torch.sigmoid或nn.Sigmoid模块。 - 如果你是初学者,想快速实现,
1 / (1 + np.exp(-x))也是一个不错的选择。
