【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数

Sigmoid 函数是一种常用的激活函数,尤其在神经网络和逻辑回归中扮演重要角色。它将输入的实数映射到区间 (0, 1),形状类似于字母 "S"。


1. 定义与公式

Sigmoid 函数的公式为:

特点

  1. 输出范围:(0, 1),适合用于概率预测。
  2. 单调性:是一个单调递增函数。
  3. 对称性:以 x = 0 为中心,对称于 y = 0.5。

2.Sigmoid 函数的推导过程

2-1. 目标与需求

我们希望构造一个函数 f(x) 满足以下性质:

  1. 输出范围:f(x) 的值限定在区间 (0, 1),便于解释为概率。
  2. 平滑性:函数连续且可导,以便使用梯度下降进行优化。
  3. 单调性:函数值随着输入 x 的增大而增大。
  4. 对称性:以 x = 0 为对称中心,输入为 0 时,输出为 0.5,表示不偏不倚的概率。

2-2. 构造 Sigmoid 函数

为了满足这些性质,可以使用指数函数 的形式,因为指数函数本身是平滑的、单调递增的。

构造输出范围

首先,为了限制输出范围在 (0, 1),我们构造如下函数:

其中 g(x) > 0 保证分母大于 1,因此 f(x) 始终在 (0, 1)。

选择 ,得到:

性质验证

  1. 输出范围

  2. 单调性 : 指数函数 单调递减,分母 随 x 增大而变大,分数值变小,因此 f(x) 单调递增。

  3. 对称性: 令 x = 0,

    满足 f(0) = 0.5,以 x = 0 为中心对称。


2-3. 导数推导

公式

导数计算如下:

对 f(x) 求导:

  1. 分母求导法则:

  2. 应用到 f(x): 设 ,则:

  3. 进一步化简:

    ,得:


2-4. 推导的直观解释

概率建模视角

Sigmoid 函数可以看作将线性模型的输出 转换为概率值的过程:

,预测概率接近 1;当 ,预测概率接近 0。

对称性与平滑性

  • 对称性来源于指数函数的性质:负指数 的曲线是正指数 的镜像。
  • 平滑性来源于指数函数的连续和可导性。

3. Sigmoid 的性质

导数

Sigmoid 的导数具有简洁的形式:

这使得计算变得高效。

梯度消失问题

  • 当 x 的绝对值较大时,σ(x) 的值接近 0 或 1,导数接近于 0。这会导致梯度更新过慢的问题,特别是在深层神经网络中。

4. Sigmoid 的用途

  1. 逻辑回归

    • 用于将线性回归的结果转化为二分类概率。
  2. 神经网络

    • 作为激活函数,尤其是输出层,用于预测概率值。
  3. 概率建模

    • 用于模型的概率预测或生成。

5. 缺点

  1. 梯度消失
    • 绝对值较大的输入导致梯度趋于 0,影响深层网络的训练。
  2. 非零均值
    • Sigmoid 输出的均值不为零,可能导致下一层神经元的输入分布偏移。

6. 代码实现

以下是 Sigmoid 函数的实现及其应用示例。

Sigmoid 函数

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

# Sigmoid 函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Sigmoid 导数
def sigmoid_derivative(x):
    s = sigmoid(x)
    return s * (1 - s)

# 绘图
x = np.linspace(-10, 10, 100)
y = sigmoid(x)
y_prime = sigmoid_derivative(x)

plt.plot(x, y, label='Sigmoid Function')
plt.plot(x, y_prime, label='Sigmoid Derivative', linestyle='--')
plt.title("Sigmoid and Its Derivative")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.legend()
plt.grid()
plt.show()

逻辑回归示例

python 复制代码
# 导入必要的库
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成一个模拟的二分类数据集
# 这里详细说明了数据集的特性:样本数、特征数、类别数、信息特征数、冗余特征数、重复特征数和随机种子
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=1, n_repeated=0,
                           random_state=0)

# 将数据集分为训练集和测试集,测试集大小为30%,并设置了随机种子以保证结果的可重复性
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 初始化逻辑回归模型
model = LogisticRegression()
# 使用训练集数据训练模型
model.fit(X_train, y_train)

# 使用训练好的模型对测试集进行预测
y_pred = model.predict(X_test)
# 打印模型的准确率
print("Accuracy:", accuracy_score(y_test, y_pred))

输出结果

bash 复制代码
Accuracy: 0.9

7. Sigmoid 的替代品

为了克服 Sigmoid 的缺点,神经网络中常用以下替代激活函数:

  1. ReLU(Rectified Linear Unit): f(x) = max(0, x)
  2. Leaky ReLU
  3. Tanh 输出范围为 (-1, 1)。

Sigmoid 函数虽然简单,但由于其梯度问题和计算开销,在深度学习中逐渐被其他激活函数所取代。不过,它在概率建模等领域仍然非常实用!

相关推荐
岑梓铭9 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
边缘计算社区13 分钟前
首个!艾灵参编的工业边缘计算国家标准正式发布
大数据·人工智能·边缘计算
游客52024 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主24 分钟前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
Eric.Lee202126 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
Dontla31 分钟前
vscode怎么设置anaconda python解释器(anaconda解释器、vscode解释器)
ide·vscode·python
深圳南柯电子40 分钟前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ41 分钟前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
biter00881 小时前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习