• 数学建模:BP神经网络(含python实现)


    原理

      BP 神经网络,也称为多层感知机(Multilayer Perceptron,MLP),是一种常见的神经网络模型,用于解决各种机器学习问题,包括分类和回归。BP 代表“反向传播”(Backpropagation),这是该模型训练的关键算法。
      BP 神经网络由多个神经元组成,通常分为输入层、隐藏层和输出层。每个神经元都与前一层的每个神经元相连,并且具有权重,用于调整信号的传递和计算。BP 神经网络的原理基于前向传播和反向传播两个关键步骤。
      前向传播是在前向传播过程中,输入信号从输入层传递到隐藏层和输出层,每个神经元将其输入与权重相乘并应用激活函数来产生输出。这个过程一直持续到达输出层,生成网络的预测结果。输入层到隐藏层公式: z j = ∑ i = 1 n w j i ( 1 ) x i z_j=\sum_{i=1}^{n}w_{ji}^{(1)}x_i zj=i=1nwji(1)xi α j = f ( z j ) \alpha_j=f(z_j) αj=f(zj)  输入层到隐藏层公式: z k = ∑ j = 1 m w k i ( 2 ) α j z_k=\sum_{j=1}^{m}w_{ki}^{(2)}\alpha_j zk=j=1mwki(2)αj α k = f ( z k ) \alpha_k=f(z_k) αk=f(zk)  其中, z j z_j zj z k z_k zk分别表示隐藏层和输出层神经元的加权输入, α j \alpha_j αj α k \alpha_k αk表示它们的激活输出,𝑤是权重,𝑥是自变量,𝑓是激活函数。
      反向传播是在反向传播过程中,网络的输出与实际目标进行比较,以计算误差。然后,误差通过网络反向传播,根据链式规则,将误差分配给每个神经元,并根据误差调整权重,以减小误差。这个过程重复进行多次,直到误差收敛到满意的水平或达到预定的训练轮次。其公式如下: Δ w k j ( 2 ) = − η ∂ E ∂ w k j ( 2 ) \Delta w_{kj}^{(2)}=-\eta \frac{\partial E}{\partial w_{kj}^{(2)}} Δwkj(2)=ηwkj(2)E Δ w j i ( 1 ) = − η ∂ E ∂ w j i ( 1 ) \Delta w_{ji}^{(1)}=-\eta \frac{\partial E}{\partial w_{ji}^{(1)}} Δwji(1)=ηwji(1)E  其中,其中,𝜂是学习率,∂𝐸,∂𝑤表示误差关于权重的偏导数。误差计算中通常使用均方误差(Mean Squared Error,MSE)作为误差函数: E = 1 2 ∑ k = 1 p ( t k − α k ) 2 E=\frac12\sum_{k=1}^p(t_k-\alpha_k)^2 E=21k=1p(tkαk)2  其中, t k t_k tk是目标输入, α k \alpha_k αk是网络的实际输出。
      BP神经网络结构:在这里插入图片描述

    代码

    多层感知机实际上就是多层全连接网络构成的网络,一个示例代码:

    import tensorflow as tf
    from tensorflow import keras
    
    # 定义模型
    model = keras.Sequential([
        keras.layers.Dense(64, activation='relu', input_shape=(X.shape[1],)),
        keras.layers.Dense(32, activation='sigmoid'),
        keras.layers.Dense(1, activation='sigmoid')
    ])
    # model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    # model.fit(X_train, Y_train, epochs=100, batch_size=32, validation_split=0.05)
    # odel = keras.Sequential([
    #     keras.layers.Dense(128, activation='relu', input_shape=(X.shape[1],)),
    #     keras.layers.Dense(64, activation='sigmoid'),
    #     keras.layers.Dense(32, activation='relu'),
    #     keras.layers.Dense(16, activation='sigmoid'),
    #     keras.layers.Dense(8, activation='relu'),
    #     keras.layers.Dense(1, activation='sigmoid')
    # ])
    
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    # 模型训练
    history=model.fit(X_train, Y_train, epochs=60, batch_size=32, validation_split=0.5)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    # 模型评估
    test_loss, test_accuracy = model.evaluate(X_test, Y_test)
    print(f'Test accuracy: {test_accuracy}')
    # 使用表1的所有行进行水肿概率的预测
    # all_predictions = model.predict(X2)
    # all_predictions
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    可视化:

    import pandas as pd
    df = pd.DataFrame(all_predictions, columns=["Value"])
    
    # 保留4位小数
    df["Value"] = df["Value"].round(4)
    
    # 将DataFrame保存为Excel文件
    df.to_excel("output4.xlsx", index=False)
    
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 训练过程中损失的历史记录
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    
    # 训练过程中性能指标的历史记录
    accuracy = history.history['accuracy']
    val_accuracy = history.history['val_accuracy']
    
    # 绘制损失曲线
    plt.figure(figsize=(12, 6))
    plt.subplot(1, 2, 1)
    plt.plot(loss, label='训练集误差')
    plt.plot(val_loss, label='验证集误差')
    plt.xlabel('训练次数')
    plt.ylabel('误差')
    plt.legend()
    plt.title('误差曲线')
    
    # 绘制性能指标曲线
    plt.subplot(1, 2, 2)
    plt.plot(accuracy, label='训练集准确率')
    plt.plot(val_accuracy, label='验证集准确率')
    plt.xlabel('训练次数')
    plt.ylabel('准确率')
    plt.legend()
    plt.title('准确率曲线')
    plt.savefig('神经网络训练过程图.png',dpi=300)
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述

    from sklearn.metrics import roc_curve, roc_auc_score
    # 计算ROC曲线的参数
    fpr, tpr, thresholds = roc_curve(Y, all_predictions)
    
    # 计算AUC-ROC
    roc_auc = roc_auc_score(Y,all_predictions)
    
    # 绘制ROC曲线
    plt.figure(figsize=(8, 6))
    plt.plot(fpr, tpr, color='orange', label=f'AUC = {roc_auc:.2f}')
    plt.plot([0, 1], [0, 1], color='blue',linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.0])
    plt.xlabel('假正例率(FPR)')
    plt.ylabel('真正例率(TPR)')
    plt.title('BP神经网络ROC Curve')
    plt.legend(loc='lower right')
    plt.savefig('神经网络roc.png',dpi=300)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

  • 相关阅读:
    渗透测试信息收集方法笔记
    面试经典150题——Day22
    LeetCode-169. 多数元素【计数,哈希表,排序,随机化,分治】
    动态追踪技术之BTrace
    游戏APP失踪事件,连环杀
    微服务环境认证和SSO以及Springboot整合JWT+Shiro
    分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测
    Java跳动爱心代码
    awk提取nginx日志相应字段
    宝塔FTP提示:553 Can‘t open that file: Permission denied的解决方案
  • 原文地址:https://blog.csdn.net/zly_Always_be/article/details/136128624