数学建模: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)

在这里插入图片描述

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

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

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()

在这里插入图片描述

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()

在这里插入图片描述

  • 49
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: BP神经网络是一种常见的人工神经网络,用于解决回归和分类问题。在Python中,可以使用许多库来实现BP神经网络,如TensorFlow、Keras、PyTorch、Scikit-learn等。下面是一个使用Scikit-learn库实现BP神经网络的示例代码: ```python from sklearn.neural_network import MLPClassifier # 准备训练数据和标签 X_train = [[0, 0], [0, 1], [1, 0], [1, 1]] y_train = [0, 1, 1, 0] # 创建BP神经网络分类器 clf = MLPClassifier(hidden_layer_sizes=(4,), activation='logistic', solver='sgd', max_iter=1000) # 训练模型 clf.fit(X_train, y_train) # 预测新数据 X_test = [[0, 0], [0, 1], [1, 0], [1, 1]] y_pred = clf.predict(X_test) # 打印预测结果 print(y_pred) ``` 上面的代码使用Scikit-learn库中的`MLPClassifier`类创建了一个BP神经网络分类器,使用逻辑函数作为激活函数,使用随机梯度下降算法作为优化器,最多迭代1000次。然后,使用训练数据训练模型,并预测新的数据。最后,打印预测结果。 ### 回答2: BP神经网络是一种常用的人工神经网络模型,用于解决分类、回归和预测问题。BP即反向传播算法,它能够通过计算输出值与实际值之间的误差,并反向传播该误差来调整神经网络的权重和偏置值,从而提高网络的准确性。 在Python中,可以使用多种库来实现BP神经网络,如TensorFlow、PyTorch、Keras等。以下是一个使用Keras库实现BP神经网络的示例: 首先,安装Keras库:pip install keras 然后,导入相应的库和模块: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense ``` 接下来,定义输入和输出数据集: ```python # 输入数据 X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) # 输出数据 y_train = np.array([[0], [1], [1], [0]]) ``` 然后,构建BP神经网络的模型: ```python # 创建模型 model = Sequential() # 添加输入层和隐藏层 model.add(Dense(units=4, input_dim=2, activation='relu')) # 添加输出层 model.add(Dense(units=1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 最后,训练模型并进行预测: ```python # 训练模型 model.fit(X_train, y_train, epochs=1000, verbose=0) # 预测结果 result = model.predict(X_train) print(result) ``` 通过以上代码,我们可以利用BP神经网络进行分类和预测任务。 总结起来,BP神经网络是一种常用的人工神经网络模型,通过反向传播算法来调整权重和偏置值,从而提高网络的准确性。在Python中,可以使用多种库来实现BP神经网络,如Keras等。 ### 回答3: BP神经网络是一种常用的人工神经网络模型,也被称为多层感知机。它在许多机器学习任务中具有广泛的应用,如分类、回归和聚类等。Python是一种高级编程语言,广泛应用于数据科学和机器学习领域。接下来,我将简要介绍一下如何使用Python实现BP神经网络。 首先,我们需要通过导入必要的库来创建和训练BP神经网络模型。常用的库包括NumPy、SciPy和pandas等。使用NumPy库可以方便地进行矩阵运算,SciPy库可以提供一些优化算法,pandas库则可以用来处理数据。 接下来,我们需要准备输入和输出数据集,以便训练模型。可以从文件中读取数据,或使用pandas库从数据库中获取数据。 然后,我们需要定义神经网络的结构。BP神经网络通常由输入层、隐藏层和输出层组成。输入层和输出层节点的数量由数据集的特征和标签确定,隐藏层的节点数量可以根据实际需求进行调整。 接下来,我们需要初始化神经网络的权重和偏置。可以使用随机数来初始化权重和偏置,也可以使用其他初始化方法。 然后,我们需要定义激活函数。常用的激活函数有sigmoid、ReLU和tanh等。激活函数可以使神经网络具有非线性能力。 接下来,我们可以进行神经网络的前向传播和误差计算。首先,我们将输入数据传递给输入层,然后将数据通过隐藏层传递到输出层。最后,我们可以计算输出层的误差。 然后,我们需要根据误差来调整神经网络的权重和偏置。这可以使用反向传播算法来实现。反向传播算法通过链式法则来计算权重和偏置的梯度,并使用优化算法来更新它们。 最后,我们可以使用训练好的神经网络来进行预测。将输入数据传递给神经网络,并获得输出结果。 总结起来,使用Python实现BP神经网络可以通过导入必要的库、准备数据集、定义网络结构、初始化权重和偏置、定义激活函数、进行前向传播和误差计算、使用反向传播算法调整权重和偏置,最后使用训练好的模型进行预测。这样可以实现一个基本的BP神经网络模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一本糊涂张~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值