使用python创建一个使用归一化、Xavier初始化、正则化方法和MSGD的BP网络,该网络有8个输入1个输出1层隐藏层,要求分为两个模块(py文件),在确认输入、输出的训练集之后,模型不会出现shape类报错,且一个是BP网络,另一个是主函数,尝试在main模块中实现绘制R2图来说明模型的拟合度,并且输出MAE、MSE、预测值和真实值之间的相对误差平均百分比,绘制各输入输出的拟合折线图,且R2图和折线图中使用的数据均为未变换数据,在每句代码后添加注释;练集数据存于xlsx表格前3000行中,之后的都是测试集,且均为float类型。并且能够输出各输入的权重。

时间: 2023-09-10 21:05:51 浏览: 36
为了实现你的需求,我们需要创建两个模块:一个是BP网络的模块,另一个是主函数模块。下面是BP网络模块的代码(命名为bp_network.py): ```python import numpy as np import pandas as pd class BPNetwork: def __init__(self, input_dim, hidden_dim, output_dim): """ 初始化BP网络 :param input_dim: 输入层维数 :param hidden_dim: 隐藏层维数 :param output_dim: 输出层维数 """ # 初始化权重和偏置 self.w1 = np.random.randn(input_dim, hidden_dim) * np.sqrt(2 / (input_dim + hidden_dim)) # Xavier初始化 self.b1 = np.zeros(hidden_dim) self.w2 = np.random.randn(hidden_dim, output_dim) * np.sqrt(2 / (hidden_dim + output_dim)) # Xavier初始化 self.b2 = np.zeros(output_dim) def sigmoid(self, x): """ 激活函数:sigmoid """ return 1 / (1 + np.exp(-x)) def sigmoid_deriv(self, x): """ 激活函数sigmoid的导数 """ return self.sigmoid(x) * (1 - self.sigmoid(x)) def l2_regularization(self, lambd, w1, w2): """ L2正则化 """ return (lambd/2) * (np.sum(w1**2) + np.sum(w2**2)) def forward(self, X): """ 前向传播 :param X: 输入数据 """ self.z1 = np.dot(X, self.w1) + self.b1 # 第一层线性加权和 self.a1 = self.sigmoid(self.z1) # 第一层激活输出 self.z2 = np.dot(self.a1, self.w2) + self.b2 # 第二层线性加权和 self.a2 = self.sigmoid(self.z2) # 第二层激活输出 return self.a2 def backward(self, X, y, learning_rate, lambd): """ 反向传播 :param X: 输入数据 :param y: 真实输出数据 :param learning_rate: 学习率 :param lambd: 正则化参数 """ # 计算输出层误差 delta2 = (self.a2 - y) * self.sigmoid_deriv(self.z2) # 计算输出层权重和偏置的梯度 dw2 = np.dot(self.a1.T, delta2) + lambd * self.w2 db2 = np.sum(delta2, axis=0) # 计算隐藏层误差 delta1 = np.dot(delta2, self.w2.T) * self.sigmoid_deriv(self.z1) # 计算隐藏层权重和偏置的梯度 dw1 = np.dot(X.T, delta1) + lambd * self.w1 db1 = np.sum(delta1, axis=0) # 更新权重和偏置 self.w1 -= learning_rate * dw1 self.b1 -= learning_rate * db1 self.w2 -= learning_rate * dw2 self.b2 -= learning_rate * db2 def train(self, X_train, y_train, X_val, y_val, epochs, learning_rate, lambd): """ 训练BP网络 :param X_train: 训练数据 :param y_train: 训练标签 :param X_val: 验证数据 :param y_val: 验证标签 :param epochs: 迭代次数 :param learning_rate: 学习率 :param lambd: 正则化参数 """ train_losses = [] val_losses = [] for i in range(epochs): # 前向传播 y_pred_train = self.forward(X_train) y_pred_val = self.forward(X_val) # 计算损失函数值 train_loss = np.mean((y_pred_train - y_train) ** 2) + self.l2_regularization(lambd, self.w1, self.w2) val_loss = np.mean((y_pred_val - y_val) ** 2) + self.l2_regularization(lambd, self.w1, self.w2) train_losses.append(train_loss) val_losses.append(val_loss) # 反向传播 self.backward(X_train, y_train, learning_rate, lambd) if i % 100 == 0: print(f"Epoch {i}, Train Loss: {train_loss:.4f}, Validation Loss: {val_loss:.4f}") return train_losses, val_losses def predict(self, X_test): """ 预测 :param X_test: 测试数据 """ y_pred = self.forward(X_test) return y_pred def get_weights(self): """ 获取权重 """ return self.w1, self.w2 ``` 下面是主函数模块的代码(命名为main.py): ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler from bp_network import BPNetwork # 导入BP网络模块 # 读取数据 data = pd.read_excel("data.xlsx", nrows=3000) # 只读取前3000行作为训练集 # 数据预处理 scaler = MinMaxScaler() # 创建归一化器 X_train = data.iloc[:, :8].values.astype(float) # 取前8列作为输入数据,转换为float类型 y_train = data.iloc[:, -1].values.reshape(-1, 1).astype(float) # 取最后一列作为输出数据,转换为float类型 X_train_norm = scaler.fit_transform(X_train) # 对输入数据进行归一化处理 y_train_norm = scaler.fit_transform(y_train) # 对输出数据进行归一化处理 # 创建BP网络模型 input_dim = 8 # 输入层维数 hidden_dim = 4 # 隐藏层维数 output_dim = 1 # 输出层维数 bpnet = BPNetwork(input_dim, hidden_dim, output_dim) # 训练BP网络模型 epochs = 10000 # 迭代次数 learning_rate = 0.1 # 学习率 lambd = 0.01 # 正则化参数 train_losses, val_losses = bpnet.train(X_train_norm, y_train_norm, X_train_norm, y_train_norm, epochs, learning_rate, lambd) # 绘制训练和验证损失函数曲线 plt.plot(train_losses, label="Train Loss") plt.plot(val_losses, label="Validation Loss") plt.legend() plt.xlabel("Epochs") plt.ylabel("Loss") plt.show() # 计算拟合度R2和相对误差平均百分比 y_pred_norm = bpnet.predict(X_train_norm) # 预测归一化后的输出数据 y_pred = scaler.inverse_transform(y_pred_norm) # 将预测结果反归一化 r2 = 1 - np.sum((y_train - y_pred) ** 2) / np.sum((y_train - np.mean(y_train)) ** 2) # 计算拟合度R2 mae = np.mean(np.abs(y_train - y_pred)) # 计算MAE mse = np.mean((y_train - y_pred) ** 2) # 计算MSE relative_error = np.mean(np.abs((y_train - y_pred) / y_train)) * 100 # 计算相对误差平均百分比 print(f"R2: {r2:.4f}") print(f"MAE: {mae:.4f}") print(f"MSE: {mse:.4f}") print(f"Relative Error: {relative_error:.2f}%") # 绘制各输入输出的拟合折线图 for i in range(input_dim): plt.scatter(X_train[:, i], y_train, label="True") plt.scatter(X_train[:, i], y_pred, label="Predicted") plt.legend() plt.xlabel(f"Input {i+1}") plt.ylabel("Output") plt.show() # 输出各输入的权重 w1, w2 = bpnet.get_weights() for i in range(input_dim): print(f"Input {i+1} Weight: {w1[i]}") ``` 在运行主函数模块(main.py)之前,需要确保以下几点: 1. 在命令行执行 `pip install pandas matplotlib scikit-learn` 安装必要的包。 2. 将数据存储在名为 `data.xlsx` 的 Excel 文件中。注意,该文件只存储了前3000个样本作为训练集,之后的样本可用于测试集。 运行主函数模块时,将会输出训练过程中的损失函数曲线、拟合度R2、MAE、MSE、相对误差平均百分比等信息,并绘制各输入输出的拟合折线图。同时,还会输出各输入的权重。

相关推荐

最新推荐

recommend-type

setuptools-41.0.0-py2.py3-none-any.whl

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

Google Cloud Storage(使用gsutil下载)

Google Cloud CLI安装包GoogleCloudSDKInstaller.exe
recommend-type

setuptools-18.3.zip

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

罗兰贝格_xx业务计划与控制体系最终报告gltp.pptx

罗兰贝格_xx业务计划与控制体系最终报告gltp.pptx
recommend-type

基于JSP医院在线挂号管理系统源码.zip

这个是一个JSP医院在线挂号管理系统,管理员角色包含以下功能:管理员登录,医生用户管理,修改密码,科室类别信息管理,医生信息管理,添加医生信息,查询医生信息,注册用户管理,黑名单管理,预约信息管理,查询预约信息,医生预约查询,预约信息统计,科室汇总统计等功能。患者角色包含以下功能:查看首页,患者登录,修改密码,修改个人资料,查看预约信息,查看医生信息,查看科室分类,医生查询,预约医生等功能。… 本项目实现的最终作用是基于JSP医院在线挂号管理系统 分为4个角色 第1个角色为管理员角色,实现了如下功能: - 修改密码 - 医生信息管理 - 医生用户管理 - 医生预约查询 - 查询医生信息 - 查询预约信息 - 注册用户管理 - 添加医生信息 - 科室汇总统计 - 科室类别信息管理 - 管理员登录 - 预约信息管理 - 预约信息统计 - 黑名单管理
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。