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

用原生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) + 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()

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#冒泡排序

一、冒泡排序基本原理 冒泡排序是一种简单的排序算法。它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。 以一个简单的整数数…

折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务

背景 之前写过&#xff0c;我在家里用了一台旧的工作站笔记本做了服务器&#xff0c;连上一个绿联的5位硬盘盒实现简单的网盘功能&#xff0c;然而&#xff0c;还是觉的不太理想&#xff0c;比如使用filebrowser虽然可以备份文件和图片&#xff0c;当使用手机使用网页&#xf…

从0入门自主空中机器人-2-1【无人机硬件框架】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…

剑指Offer|LCR 013. 二维区域和检索 - 矩阵不可变

LCR 013. 二维区域和检索 - 矩阵不可变 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1) &#xff0c;右下角为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMatrix(…

接口Mock技术介绍

相信学习过程序设计的读者朋友们&#xff0c;一定对“桩&#xff08;Stub&#xff09;”这个概念并不陌生。它是指用来替换一部分功能的程序代码段。桩程序代码段可以用来模拟已有程序的某些功或者是将实现的系统代码的一种临时替代方法。插桩方法被广泛应用于开发和测试工作中…

深入解析C#异步编程:await 关键字背后的实现原理

在C#中&#xff0c;async 和 await 关键字用于编写异步代码。本文将详细介绍 await 的实现原理&#xff0c;包括状态机的生成、回调函数的注册和触发等关键步骤。 1. 异步方法的基本概念 在C#中&#xff0c;async 关键字标记一个方法为异步方法&#xff0c;而 await 关键字用于…

【机器学习】SVM支持向量机(一)

介绍 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习模型&#xff0c;广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点&#xff0c;并且尽可能地最大化离该超平面最近的数据点&#xff08;支持向量…

Unity功能模块一对话系统(1)前置准备

也许你也曾被游戏中的对话系统深深吸引&#xff0c;那些精心设计的对白、鲜活的角色配音、甚至是简单的文字对话&#xff0c;往往能让玩家产生强烈的代入感和情感共鸣。如果你正在开发一款游戏&#xff0c;或者计划为你的项目加入一个引人入胜的对话系统&#xff0c;那么 Unity…

upload-labs关卡记录10

白名单&#xff0c;可以看到已经进行了限制&#xff0c;只能上传这三种后缀的文件&#xff0c;先试一试MIME绕过&#xff1a; 果然不行&#xff1a;观察到是post型&#xff0c;试一试00绕过&#xff1a;没找到路径&#xff0c;绕过失败。 看源码吧&#xff1a; $is_upload f…

专业140+总分410+南京大学851信号与系统考研经验南大电子信息通信集成电路,真题,大纲。参考书。

本人本科中等211&#xff0c;离保送本校差一点&#xff0c;考研前纠结本校还是追求更高目标&#xff0c;和家人聊了自己的想法&#xff0c;感谢父母对我的支持&#xff0c;坚定报考南大的目标&#xff0c;最终专业851信号与系统140&#xff0c;总分410顺利被南京大学录取&#…

《机器学习》——KNN算法

文章目录 KNN算法简介KNN算法——sklearnsklearn是什么&#xff1f;sklearn 安装sklearn 用法 KNN算法 ——距离公式KNN算法——实例分类问题完整代码——分类问题 回归问题完整代码 ——回归问题 KNN算法简介 一、KNN介绍 全称是k-nearest neighbors&#xff0c;通过寻找k个距…

Spring Boot 学习笔记

学习代码第一步&#xff1a;如何写 Hello world &#xff1f; 1、新建项目 新建一个 Maven Java 工程&#xff0c;在 pom.xml 文件中添加 Spring Boot Maven 依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spri…

基于python的扫雷游戏

游戏 游戏目标&#xff1a; 揭开所有非地雷的格子。 如果揭开地雷&#xff0c;游戏失败。 使用标记功能&#xff08;&#x1f6a9;&#xff09;来标记可能的地雷位置。 格子类型&#xff1a; 空白格子&#xff1a;表示周围没有地雷。 数字格子&#xff1a;显示周围 8 个格子…

【K8S系列】深入解析K8S服务的无状态与有状态

在容器编排领域&#xff0c;Kubernetes&#xff08;K8S&#xff09;无疑是占据主导地位的工具。它提供了强大的功能来管理和部署容器化应用程序&#xff0c;其中服务分类是理解和有效使用K8S的关键。K8S中的服务主要分为无状态服务和有状态服务&#xff0c;这两种类型在基础概念…

Linux第100步_Linux之设置LCD作为终端控制台和LCD背光调节

KMS是Kemmel Mode Setting的缩写&#xff0c;内核显示模式设置。它主要负责显示的控制&#xff0c;包括屏幕分辨率、屏幕刷新率和颜色深度等等。 CRTC是指显示控制器&#xff0c;在DRM里有多个显存&#xff0c;通过操作CRTC来控制要显示那个显存。 KMS包含了FB框架。DRM驱动默…

3_TCP/IP连接三次握手与断开四次挥手

TCP/IP 通信是网络通信的基础协议&#xff0c;分为以下主要步骤&#xff1a; 1、建立连接&#xff08;三次握手&#xff09; 目的&#xff1a;保证双方建立可靠的通信连接。 过程&#xff1a; 1>客户端发送 SYN&#xff1a;客户端向服务器发送一个 SYN&#xff08;同步&…

SpringCloud 系列教程:微服务的未来(三)IService接口的业务实现

本文将介绍 IService 接口的基本业务操作、复杂业务操作、Lambda 方法的使用以及批量增加操作&#xff0c;帮助开发者深入了解如何高效地利用 MyBatis-Plus 提供的功能进行数据库操作。无论是简单的单表查询&#xff0c;还是复杂的多表联动&#xff0c;甚至是大数据量的批量操作…

kubernetes学习-集群搭建部署(一)

一、开三台虚拟机进行试验&#xff08;centos7) 1、初始操作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux sudo sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时# 关闭swap sudo swapoff -a # 临时 s…

【AUTOSAR 基础软件】Can模块详解(Can栈之驱动模块)

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中Can模块相关的内容详解。本文从AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码三个维度来帮读者清晰的认识和了解Can驱动软件模块。文中涉及的ISOLAR-AB配置以及生成的ARXML均依托于ETAS工具链&#xff0c;…

Vite内网ip访问,两种配置方式和修改端口号教程

目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候&#xff0c;控制台会只出现127.0.0.1&#xff08;localhost&#xff09;本地地址访问项目。不可以通过公司内网ip访问&#xff0c;其他团队成员无法访问&#xff0c;这是因为没…