原理

  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=1∑n​wji(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=1∑m​wki(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=21​k=1∑p​(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()

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: