基于BP训练深度学习模型(用于回归)以及验证误差值

用原生Python训练了一个BP网络,适合没有pytorch等环境的电脑,并用训练的模型对原始数据进行了预测,拿来估测比较误差值了,可以直接拿去用(需根据个人数据来调训练次数、学习效率),代码在文章末。

1.随机生成1000条种子数据,用于示例

2.运行BP深度学习代码,训练结果如下:

预测值与真实值进行绘图对比:

误差计算:

均方误差 (MSE): 21414.6402

平均绝对误差 (MAE): 120.8660

python 复制代码
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) + b1
        A1 = relu(Z1)  # 使用 ReLU 激活函数
        Z2 = np.dot(A1, W2) + b2
        A2 = Z2  # 回归任务的输出层通常不使用激活函数

        # 计算误差
        error = A2 - y

        # 反向传播
        dA2 = error
        dZ2 = 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 * dW1
        W2 -= learning_rate * dW2
        b1 -= learning_rate * db1
        b2 -= 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) + b1
    A1 = relu(Z1)
    Z2 = np.dot(A1, W2) + b2
    return Z2

# 主函数
def main():
    # 1. 从Excel文件中读取数据
    data = load_data(r'C:\Users\giggle\Desktop\bp\igcsv.xlsx')  # 请根据实际文件路径修改
    
    # 假设数据的最后一列是目标变量y,前面的列是输入特征X
    X = 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])  # 计算 MSE
    mae = 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()

希望这些能对大家有所帮助。如果你觉得这篇文章有价值,请在转载时注明来源,感谢支持!

本次分享就到这里,感谢大家的阅读!

相关推荐
这是谁的博客?7 分钟前
CUDA 内存一致性模型与同步原语深度解析:从弱内存序、作用域可见性到异步代理栅栏的 GPU 并发正确性底层原理
人工智能
u13013029 分钟前
GitHub 热榜项目:周榜(2026-11-01)
人工智能·github
lifallen36 分钟前
ub-mode skill:软件工程原则
人工智能·学习·ai·软件工程·ai编程
Geek-Chow1 小时前
05.4 · DeepInfer 推理框架总览:源码结构、开源与未开源部分对照
人工智能
Flynn Liang1 小时前
Spring AI 多模态实战(下):文生图 + TTS 语音合成(含 2.0 流式音频分片)
人工智能·spring·文生图·音视频·语音合成·tts·springai
城南皮卡丘1 小时前
苹果果实成熟度检测数据集 4195张+YOLO格式
深度学习·yolo·目标检测·计算机视觉·数据集
长不大的杨瑞杰1 小时前
OpenCode v2 Custom Tools 实战:开发数据库、工单与发布工具
人工智能·typescript·开发工具·opencode·custom tools
羊仔AI探索1 小时前
离世仅仅半个月,张雪峰被蒸馏了
人工智能·aigc·蒸馏·张雪峰·skills
zhippt_10141 小时前
只剩截图没有源文件?图转PPT把图片还原成可编辑幻灯片
前端·人工智能·powerpoint
小oo呆1 小时前
【自然语言处理与大模型】自然语言处理的漫漫长路之深度学习时代
人工智能·深度学习·自然语言处理