杰瑞科技汇

Python有哪些sigmoid函数库可用?

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

Python有哪些sigmoid函数库可用?-图1
(图片来源网络,侵删)

下面我将为您介绍几种在 Python 中使用 Sigmoid 函数的主流方法,从最基础的 NumPy 到深度学习框架。

使用 NumPy (最常用、最基础)

NumPy 是 Python 科学计算的基础库,它提供了高效的数组操作和数学函数,对于大多数需要手动实现或进行数值计算的场景,NumPy 是首选。

安装 NumPy

如果您还没有安装,请先安装:

pip install numpy

实现 Sigmoid 函数

使用 numpy.exp (推荐) 这是最直接、最符合数学公式的方法,性能也很好。

Python有哪些sigmoid函数库可用?-图2
(图片来源网络,侵删)
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.sigmoidnn.Sigmoid 模块。
  • 如果你是初学者,想快速实现1 / (1 + np.exp(-x)) 也是一个不错的选择。
分享:
扫描分享到社交APP
上一篇
下一篇