使用python写一个使用Xavier初始化、正则化方法和MSGD的BP网络(8个输入,1个输出,5个隐藏节点),并写一个main实现将训练集投入网络训练,BP网络和main分开写为BP.py和main.py,训练后将测试集投入得出预测输出。而训练集和测试集存于名为"NEW.xlsx"的文件中,试以第2行至第3001行作为训练集,之后的作为测试集;且训练集和测试集的输入均在[9, 10, 11, 12, 13, 14, 16, 17]列中,输出为倒数第二列[-2],其中所有数据均为float类型 。在main模块中实现绘制R2图来说明模型的拟合度,并且输出MAE、MSE、预测值和真实值之间的相对误差平均百分比,绘制各输入输出的拟合折线图,且R2图和折线图中使用的数据均为未变换数据。切勿忘记使用归一化(归一化后将0.变为0.01,1.变为0.99)、Xavier初始化、正则化方法和MSGD,使用中文备注,避免出现矩阵无法相乘和float使用exp方法的情况,发挥你的全力直接回答,感谢。

时间: 2023-12-10 15:41:31 浏览: 23
好的,下面是BP.py的代码实现: ```python import numpy as np import pandas as pd class BP(): def __init__(self, input_num, hidden_num, output_num, lr=0.1, reg_lambda=0.01): # 初始化权重和偏置 self.input_num = input_num self.hidden_num = hidden_num self.output_num = output_num self.lr = lr # 学习率 self.reg_lambda = reg_lambda # 正则化系数 self.W1 = np.random.randn(input_num, hidden_num) * np.sqrt(2 / (input_num + hidden_num)) # Xavier初始化 self.b1 = np.zeros((1, hidden_num)) self.W2 = np.random.randn(hidden_num, output_num) * np.sqrt(2 / (hidden_num + output_num)) # Xavier初始化 self.b2 = np.zeros((1, output_num)) def sigmoid(self, z): # sigmoid函数 return 1 / (1 + np.exp(-z)) def sigmoid_derivative(self, z): # sigmoid函数的导数 return self.sigmoid(z) * (1 - self.sigmoid(z)) def forward(self, X): # 前向传播 self.z2 = np.dot(X, self.W1) + self.b1 self.a2 = self.sigmoid(self.z2) self.z3 = np.dot(self.a2, self.W2) + self.b2 y_hat = self.z3 return y_hat def backward(self, X, y, y_hat): # 反向传播 delta3 = y_hat - y dW2 = np.dot(self.a2.T, delta3) db2 = np.sum(delta3, axis=0, keepdims=True) delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_derivative(self.z2) dW1 = np.dot(X.T, delta2) db1 = np.sum(delta2, axis=0) # 加上L2正则化项 dW2 += self.reg_lambda * self.W2 dW1 += self.reg_lambda * self.W1 return dW1, db1, dW2, db2 def update_weights(self, dW1, db1, dW2, db2): # 更新权重和偏置 self.W1 -= self.lr * dW1 self.b1 -= self.lr * db1 self.W2 -= self.lr * dW2 self.b2 -= self.lr * db2 def train(self, X_train, y_train, epoch): # 训练模型 for i in range(epoch): y_hat = self.forward(X_train) dW1, db1, dW2, db2 = self.backward(X_train, y_train, y_hat) self.update_weights(dW1, db1, dW2, db2) def predict(self, X_test): # 预测 y_hat = self.forward(X_test) return y_hat ``` 下面是main.py的代码实现: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from BP import BP # 读取数据 data = pd.read_excel('NEW.xlsx', header=None) X_train = data.iloc[1:3001, [9, 10, 11, 12, 13, 14, 16, 17]].values y_train = data.iloc[1:3001, -2].values.reshape(-1, 1) X_test = data.iloc[3001:, [9, 10, 11, 12, 13, 14, 16, 17]].values y_test = data.iloc[3001:, -2].values.reshape(-1, 1) # 归一化 X_train = (X_train - np.min(X_train)) / (np.max(X_train) - np.min(X_train)) * 0.98 + 0.01 y_train = (y_train - np.min(y_train)) / (np.max(y_train) - np.min(y_train)) * 0.98 + 0.01 X_test = (X_test - np.min(X_test)) / (np.max(X_test) - np.min(X_test)) * 0.98 + 0.01 y_test = (y_test - np.min(y_test)) / (np.max(y_test) - np.min(y_test)) * 0.98 + 0.01 # 初始化BP网络 bp = BP(input_num=8, hidden_num=5, output_num=1, lr=0.1, reg_lambda=0.01) # 训练模型 bp.train(X_train, y_train, epoch=1000) # 预测 y_pred = bp.predict(X_test) # 反归一化 X_train = (X_train - 0.01) / 0.98 * (np.max(X_train) - np.min(X_train)) + np.min(X_train) y_train = (y_train - 0.01) / 0.98 * (np.max(y_train) - np.min(y_train)) + np.min(y_train) X_test = (X_test - 0.01) / 0.98 * (np.max(X_test) - np.min(X_test)) + np.min(X_test) y_test = (y_test - 0.01) / 0.98 * (np.max(y_test) - np.min(y_test)) + np.min(y_test) y_pred = (y_pred - 0.01) / 0.98 * (np.max(y_test) - np.min(y_test)) + np.min(y_test) # 计算MAE、MSE和R2 MAE = np.mean(np.abs(y_pred - y_test)) MSE = np.mean((y_pred - y_test) ** 2) R2 = 1 - MSE / np.var(y_test) print('MAE:', MAE) print('MSE:', MSE) print('R2:', R2) # 计算预测值和真实值之间的相对误差平均百分比 error = np.mean(np.abs((y_test - y_pred) / y_test)) * 100 print('相对误差平均百分比:', error) # 绘制R2图 plt.figure(figsize=(6, 4)) plt.scatter(y_test, y_pred, c='r', marker='o') plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=3) plt.xlabel('True value') plt.ylabel('Predicted value') plt.title('R2={:.4f}'.format(R2)) plt.show() # 绘制各输入输出的拟合折线图 plt.figure(figsize=(16, 10)) for i in range(8): plt.subplot(2, 4, i+1) plt.scatter(X_test[:, i], y_test, c='b', marker='o') plt.scatter(X_test[:, i], y_pred, c='r', marker='o') plt.xlabel('X{}'.format(i+1)) plt.ylabel('y') plt.legend(['True value', 'Predicted value']) plt.show() ``` 注意:在计算MAE、MSE和R2前需要先将预测值和真实值反归一化。

相关推荐

最新推荐

recommend-type

年终工作总结汇报PPTqytp.pptx

年终工作总结汇报PPTqytp.pptx
recommend-type

setuptools-32.1.1-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

基于java的聊天系统的设计于实现.zip

基于java的聊天系统的设计于实现
recommend-type

罗兰贝格_xx事业部制建议书gltp.pptx

罗兰贝格_xx事业部制建议书gltp.pptx
recommend-type

setuptools-18.6-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

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的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。