用原生Python训练了一个BP网络,适合没有pytorch等环境的电脑,并用训练的模型对原始数据进行了预测,拿来估测比较误差值了,可以直接拿去用(需根据个人数据来调训练次数、学习效率),代码在文章末。
1.随机生成1000条种子数据,用于示例
2.运行BP深度学习代码,训练结果如下:
预测值与真实值进行绘图对比:
误差计算:
均方误差 (MSE): 21414.6402
平均绝对误差 (MAE): 120.8660
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import matplotlib.pyplot as plt # 引入matplotlib用于画图# 激活函数:ReLU 和 ReLU 的导数
def relu(x):return np.maximum(0, x)def relu_derivative(x):return np.where(x > 0, 1, 0)# 数据读取函数
def load_data(file_path):data = pd.read_excel(file_path) # 使用pandas读取Excel文件return data# 数据预处理函数(归一化)
def preprocess_data(data):scaler = MinMaxScaler()return scaler.fit_transform(data)# BP神经网络训练函数
def train_bp_network(X, y, input_size, hidden_size, output_size, epochs=10000, learning_rate=0.0000000009):# 初始化权重np.random.seed(42)W1 = np.random.rand(input_size, hidden_size) # 输入层到隐藏层的权重W2 = np.random.rand(hidden_size, output_size) # 隐藏层到输出层的权重b1 = np.zeros((1, hidden_size)) # 隐藏层的偏置b2 = np.zeros((1, output_size)) # 输出层的偏置# 训练过程for epoch in range(epochs):# 前向传播Z1 = np.dot(X, W1) + b1A1 = relu(Z1) # 使用 ReLU 激活函数Z2 = np.dot(A1, W2) + b2A2 = Z2 # 回归任务的输出层通常不使用激活函数# 计算误差error = A2 - y# 反向传播dA2 = errordZ2 = dA2 # 回归问题,输出层不需要对激活函数求导dW2 = np.dot(A1.T, dZ2)db2 = np.sum(dZ2, axis=0, keepdims=True)dA1 = np.dot(dZ2, W2.T)dZ1 = dA1 * relu_derivative(A1) # ReLU 的导数dW1 = np.dot(X.T, dZ1)db1 = np.sum(dZ1, axis=0, keepdims=True)# 更新权重和偏置W1 -= learning_rate * dW1W2 -= learning_rate * dW2b1 -= learning_rate * db1b2 -= learning_rate * db2# 每100次输出一次误差if epoch % 100 == 0:loss = np.mean(np.square(error))print(f"Epoch {epoch}, Loss: {loss:.4f}")return W1, W2, b1, b2# 预测函数
def predict(X, W1, W2, b1, b2):Z1 = np.dot(X, W1) + b1A1 = relu(Z1)Z2 = np.dot(A1, W2) + b2return Z2# 主函数
def main():# 1. 从Excel文件中读取数据data = load_data(r'C:\Users\giggle\Desktop\bp\igcsv.xlsx') # 请根据实际文件路径修改# 假设数据的最后一列是目标变量y,前面的列是输入特征XX = data.iloc[:, :-1].values # 输入特征y = data.iloc[:, -1].values # 目标变量(回归目标)# 2. 数据归一化X_scaled = preprocess_data(X)y_scaled = y.reshape(-1, 1) # 目标变量也需要转为列向量# 3. 定义神经网络的结构input_size = X_scaled.shape[1] # 输入层的节点数hidden_size = 10 # 隐藏层的节点数,可以根据需求调整output_size = 1 # 输出层的节点数# 4. 训练BP神经网络W1, W2, b1, b2 = train_bp_network(X_scaled, y_scaled, input_size, hidden_size, output_size)'''# 6. 预测前十行数据的结果print("预测结果:")print(predictions[:26]) # 打印前10个预测结果'''# . 打印权重和偏置print("\n神经网络的训练参数:")print("W1 (输入层到隐藏层的权重):")print(W1)print("\nW2 (隐藏层到输出层的权重):")print(W2)print("\nb1 (隐藏层的偏置):")print(b1)print("\nb2 (输出层的偏置):")print(b2)# 5. 使用训练好的模型进行预测predictions = predict(X_scaled, W1, W2, b1, b2)# 6. 打印所有预测结果与真实值(格式化输出)print("\n预测结果与真实值对比:")print(f"{'Index':<10}{'Predicted':<15}{'True Value':<15}")for i in range(len(y)):print(f"{i+1:<10}{predictions[i][0]:<15.4f}{y[i]:<15.4f}")# 7. 计算并打印误差(均方误差 MSE 和 平均绝对误差 MAE)mse = mean_squared_error(y_scaled[:26], predictions[:26]) # 计算 MSEmae = mean_absolute_error(y_scaled[:26], predictions[:26]) # 计算 MAE'''print("\n真实目标值:")print(y[:26]) # 打印前10个真实目标值'''plt.figure(figsize=(10, 6))plt.plot(range(len(y)), y, label="True Value", color='blue', marker='o')plt.plot(range(len(y)), predictions, label="Predicted Value", color='red', marker='x')plt.xlabel("Sample Index")plt.ylabel("Value")plt.title("True vs Predicted Values")plt.legend()plt.grid(True)plt.show()print("\n误差计算:")print(f"均方误差 (MSE): {mse:.4f}")print(f"平均绝对误差 (MAE): {mae:.4f}")if __name__ == "__main__":main()
希望这些能对大家有所帮助。如果你觉得这篇文章有价值,请在转载时注明来源,感谢支持!
本次分享就到这里,感谢大家的阅读!