import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 设置中文字体(避免中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

def sigmoid(x):
    """
    Sigmoid函数实现
    σ(x) = 1 / (1 + e^(-x))
    """
    return 1 / (1 + np.exp(-x))

def relu(x):
    """
    ReLU函数实现
    ReLU(x) = max(0, x)
    """
    return np.maximum(0, x)

def sigmoid_derivative(x):
    """
    Sigmoid函数的导数
    σ'(x) = σ(x) * (1 - σ(x))
    """
    s = sigmoid(x)
    return s * (1 - s)

def relu_derivative(x):
    """
    ReLU函数的导数
    ReLU'(x) = 1 if x > 0 else 0
    """
    return np.where(x > 0, 1, 0)

def plot_activation_functions():
    """
    绘制激活函数图像
    """
    # 创建x值范围
    x = np.linspace(-10, 10, 1000)
    
    # 创建图形
    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 12))
    fig.suptitle('深度学习常用激活函数可视化', fontsize=16, fontweight='bold')
    
    # 1. Sigmoid函数
    y_sigmoid = sigmoid(x)
    ax1.plot(x, y_sigmoid, 'b-', linewidth=2.5, label='Sigmoid(x)')
    ax1.set_title('Sigmoid函数', fontsize=14, fontweight='bold')
    ax1.set_xlabel('x', fontsize=12)
    ax1.set_ylabel('σ(x)', fontsize=12)
    ax1.grid(True, alpha=0.3)
    ax1.legend(fontsize=12)
    ax1.axhline(y=0, color='k', linestyle='-', alpha=0.3)
    ax1.axvline(x=0, color='k', linestyle='-', alpha=0.3)
    
    # 添加关键点标注
    ax1.plot(0, 0.5, 'ro', markersize=8, label='σ(0) = 0.5')
    ax1.annotate('σ(0) = 0.5', xy=(0, 0.5), xytext=(2, 0.6),
                arrowprops=dict(arrowstyle='->', color='red'),
                fontsize=10, color='red')
    
    # 2. ReLU函数
    y_relu = relu(x)
    ax2.plot(x, y_relu, 'r-', linewidth=2.5, label='ReLU(x)')
    ax2.set_title('ReLU函数', fontsize=14, fontweight='bold')
    ax2.set_xlabel('x', fontsize=12)
    ax2.set_ylabel('ReLU(x)', fontsize=12)
    ax2.grid(True, alpha=0.3)
    ax2.legend(fontsize=12)
    ax2.axhline(y=0, color='k', linestyle='-', alpha=0.3)
    ax2.axvline(x=0, color='k', linestyle='-', alpha=0.3)
    
    # 添加关键点标注
    ax2.plot(0, 0, 'go', markersize=8, label='ReLU(0) = 0')
    ax2.annotate('ReLU(0) = 0', xy=(0, 0), xytext=(2, 1),
                arrowprops=dict(arrowstyle='->', color='green'),
                fontsize=10, color='green')
    
    # 3. Sigmoid导数
    y_sigmoid_deriv = sigmoid_derivative(x)
    ax3.plot(x, y_sigmoid_deriv, 'g-', linewidth=2.5, label="σ'(x)")
    ax3.set_title('Sigmoid函数导数', fontsize=14, fontweight='bold')
    ax3.set_xlabel('x', fontsize=12)
    ax3.set_ylabel("σ'(x)", fontsize=12)
    ax3.grid(True, alpha=0.3)
    ax3.legend(fontsize=12)
    ax3.axhline(y=0, color='k', linestyle='-', alpha=0.3)
    ax3.axvline(x=0, color='k', linestyle='-', alpha=0.3)
    
    # 标注最大值点
    ax3.plot(0, 0.25, 'mo', markersize=8, label="σ'(0) = 0.25")
    ax3.annotate("σ'(0) = 0.25", xy=(0, 0.25), xytext=(2, 0.2),
                arrowprops=dict(arrowstyle='->', color='magenta'),
                fontsize=10, color='magenta')
    
    # 4. ReLU导数
    y_relu_deriv = relu_derivative(x)
    ax4.plot(x, y_relu_deriv, 'm-', linewidth=2.5, label="ReLU'(x)")
    ax4.set_title('ReLU函数导数', fontsize=14, fontweight='bold')
    ax4.set_xlabel('x', fontsize=12)
    ax4.set_ylabel("ReLU'(x)", fontsize=12)
    ax4.grid(True, alpha=0.3)
    ax4.legend(fontsize=12)
    ax4.axhline(y=0, color='k', linestyle='-', alpha=0.3)
    ax4.axvline(x=0, color='k', linestyle='-', alpha=0.3)
    
    # 标注不连续点
    ax4.plot(0, 0, 'co', markersize=8, label='不连续点')
    ax4.annotate('x=0处不连续', xy=(0, 0), xytext=(2, 0.5),
                arrowprops=dict(arrowstyle='->', color='cyan'),
                fontsize=10, color='cyan')
    
    plt.tight_layout()
    plt.show()

def plot_comparison():
    """
    绘制两个函数的对比图
    """
    # 创建x值范围
    x = np.linspace(-5, 5, 1000)
    
    # 创建图形
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))
    fig.suptitle('Sigmoid vs ReLU 函数对比', fontsize=16, fontweight='bold')
    
    # 左图:函数对比
    y_sigmoid = sigmoid(x)
    y_relu = relu(x)
    
    ax1.plot(x, y_sigmoid, 'b-', linewidth=2.5, label='Sigmoid(x)')
    ax1.plot(x, y_relu, 'r-', linewidth=2.5, label='ReLU(x)')
    ax1.set_title('函数对比', fontsize=14, fontweight='bold')
    ax1.set_xlabel('x', fontsize=12)
    ax1.set_ylabel('f(x)', fontsize=12)
    ax1.grid(True, alpha=0.3)
    ax1.legend(fontsize=12)
    ax1.axhline(y=0, color='k', linestyle='-', alpha=0.3)
    ax1.axvline(x=0, color='k', linestyle='-', alpha=0.3)
    
    # 右图:导数对比
    y_sigmoid_deriv = sigmoid_derivative(x)
    y_relu_deriv = relu_derivative(x)
    
    ax2.plot(x, y_sigmoid_deriv, 'g-', linewidth=2.5, label="σ'(x)")
    ax2.plot(x, y_relu_deriv, 'm-', linewidth=2.5, label="ReLU'(x)")
    ax2.set_title('导数对比', fontsize=14, fontweight='bold')
    ax2.set_xlabel('x', fontsize=12)
    ax2.set_ylabel("f'(x)", fontsize=12)
    ax2.grid(True, alpha=0.3)
    ax2.legend(fontsize=12)
    ax2.axhline(y=0, color='k', linestyle='-', alpha=0.3)
    ax2.axvline(x=0, color='k', linestyle='-', alpha=0.3)
    
    plt.tight_layout()
    plt.show()

def plot_3d_surface():
    """
    绘制3D表面图展示函数特性
    """
    from mpl_toolkits.mplot3d import Axes3D
    
    # 创建网格
    x = np.linspace(-5, 5, 100)
    y = np.linspace(-5, 5, 100)
    X, Y = np.meshgrid(x, y)
    
    # 计算函数值
    Z_sigmoid = sigmoid(X)
    Z_relu = relu(X)
    
    # 创建3D图形
    fig = plt.figure(figsize=(15, 6))
    
    # Sigmoid 3D图
    ax1 = fig.add_subplot(121, projection='3d')
    surf1 = ax1.plot_surface(X, Y, Z_sigmoid, cmap='viridis', alpha=0.8)
    ax1.set_title('Sigmoid函数3D视图', fontsize=14, fontweight='bold')
    ax1.set_xlabel('x')
    ax1.set_ylabel('y')
    ax1.set_zlabel('σ(x)')
    fig.colorbar(surf1, ax=ax1, shrink=0.5, aspect=5)
    
    # ReLU 3D图
    ax2 = fig.add_subplot(122, projection='3d')
    surf2 = ax2.plot_surface(X, Y, Z_relu, cmap='plasma', alpha=0.8)
    ax2.set_title('ReLU函数3D视图', fontsize=14, fontweight='bold')
    ax2.set_xlabel('x')
    ax2.set_ylabel('y')
    ax2.set_zlabel('ReLU(x)')
    fig.colorbar(surf2, ax=ax2, shrink=0.5, aspect=5)
    
    plt.tight_layout()
    plt.show()

def analyze_functions():
    """
    分析函数特性并打印结果
    """
    print("=" * 60)
    print("激活函数特性分析")
    print("=" * 60)
    
    # 测试点
    test_points = [-5, -2, -1, 0, 1, 2, 5]
    
    print("\nSigmoid函数分析:")
    print("-" * 30)
    print(f"函数公式: σ(x) = 1 / (1 + e^(-x))")
    print(f"导数公式: σ'(x) = σ(x) * (1 - σ(x))")
    print("\n测试点结果:")
    for x in test_points:
        y = sigmoid(x)
        y_deriv = sigmoid_derivative(x)
        print(f"x = {x:3d}: σ(x) = {y:.6f}, σ'(x) = {y_deriv:.6f}")
    
    print("\nReLU函数分析:")
    print("-" * 30)
    print(f"函数公式: ReLU(x) = max(0, x)")
    print(f"导数公式: ReLU'(x) = 1 if x > 0 else 0")
    print("\n测试点结果:")
    for x in test_points:
        y = relu(x)
        y_deriv = relu_derivative(x)
        print(f"x = {x:3d}: ReLU(x) = {y:6.3f}, ReLU'(x) = {y_deriv}")
    
    print("\n函数特性对比:")
    print("-" * 30)
    print("Sigmoid函数:")
    print("  ✓ 输出范围: (0, 1)")
    print("  ✓ 中心对称: σ(0) = 0.5")
    print("  ✓ 平滑可导")
    print("  ✗ 梯度消失问题")
    print("  ✗ 输出非零中心")
    
    print("\nReLU函数:")
    print("  ✓ 计算简单高效")
    print("  ✓ 缓解梯度消失")
    print("  ✓ 稀疏激活")
    print("  ✗ 负区间梯度为0 (Dead ReLU)")
    print("  ✗ 输出非零中心")

if __name__ == "__main__":
    # 运行分析
    analyze_functions()
    
    # 绘制图像
    print("\n正在绘制函数图像...")
    plot_activation_functions()
    
    print("\n正在绘制对比图像...")
    plot_comparison()
    
    print("\n正在绘制3D图像...")
    plot_3d_surface()
    
    print("\n绘图完成!")

在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐