使用了LSTM的数据预测

记录一下,这个是在national university of singapore,黄教授给我们布置的任务,做了一个北京的已知十年的打印量,预测100天的打印机大作业,我们使用了lstm模型,就是两层神经网络,同时dropout的加入为了防止过拟合问题,验证集是最后的100个,后续优化打算往里面使用聚类,加入neuralprophet,效果应该会更好,也可以加入GANs

import numpy as np  # 导入NumPy库,用于数学运算
import pandas as pd  # 导入Pandas库,用于数据分析
import datetime  # 导入datetime库,用于处理日期和时间
from sklearn.preprocessing import MinMaxScaler  # 从sklearn库导入MinMaxScaler,用于数据标准化
from tensorflow.keras.models import Sequential  # 从Keras库导入Sequential模型,用于构建神经网络
from tensorflow.keras.layers import LSTM, Dense, Dropout  # 从Keras库导入LSTM, Dense, Dropout层
import matplotlib.pyplot as plt  # 导入matplotlib.pyplot,用于数据可视化# 定义一个转换数据的函数
def transform(path):df = pd.read_csv(open(path, 'rb'), low_memory=False)  # 读取CSV文件到DataFrameprinterIdx = np.array(df['printerIndex'])  # 从DataFrame中提取打印机索引usage = np.array(df['usage'])  # 提取使用数据date = np.array(df['date'])  # 提取日期数据numofkinds = len(np.unique(printerIdx))  # 计算不同打印机种类的数量numofday = len(np.unique(date))  # 计算不同日期的数量date = np.unique(date)  # 获取唯一的日期数组usage = np.reshape(usage, [numofkinds, numofday])  # 重塑使用数据数组以匹配打印机种类和日期df_output = pd.DataFrame(usage)  # 创建新的DataFrame来存储使用数据df_output.columns = date  # 将日期设置为DataFrame的列return df_output  # 返回处理后的数据集# 定义数据加载函数
def DataLoading(path):Dataset = transform(path)  # 调用transform函数处理数据TOTALDAYNUM = Dataset.shape[1]  # 获取数据集中的日期总数TOTALDEVICENUM = Dataset.shape[0]  # 获取数据集中的设备总数# 遍历日期列,将字符串转换为datetime对象for colIdx in range(TOTALDAYNUM):tmpDate = datetime.datetime.strptime(Dataset.columns[colIdx], '%Y-%m-%d %H:%M:%S.%f')Dataset.rename(columns={Dataset.columns[colIdx]: tmpDate}, inplace=True)Dataset = Dataset.transpose()  # 转置数据集Dataset.index.name = 'Datetime'  # 将索引名称设置为DatetimeDataset.reset_index(inplace=True)  # 重置索引# 遍历设备列,重命名列以匹配打印机索引for colIdx in range(TOTALDEVICENUM):tmpColName = 'PrinterIdx' + str(Dataset.columns[colIdx + 1])Dataset.rename(columns={Dataset.columns[colIdx + 1]: tmpColName}, inplace=True)date = Dataset.iloc[:, 0].values  # 获取日期列return Dataset, date  # 返回处理后的数据集和日期# 定义LSTM预测、可视化和保存结果的函数
def predict_and_save(path, save_path):# 加载数据Dataset, date = DataLoading(path)# 标准化数据scaler = MinMaxScaler(feature_range=(0, 1))  # 创建MinMaxScaler实例scaled_data = scaler.fit_transform(Dataset.iloc[:, 1:].values)  # 对数据进行标准化# 定义创建时间序列数据集的函数def create_dataset(data, look_back=100):X, Y = [], []  # 初始化X和Y列表# 遍历数据,创建时间序列数据集for i in range(len(data) - look_back):X.append(data[i:i + look_back])Y.append(data[i + look_back])return np.array(X), np.array(Y)look_back = 100  # 设置时间步长X, Y = create_dataset(scaled_data, look_back)  # 创建数据集# 划分训练集和测试集trainX, testX = X[:-look_back], X[-look_back:]  # 分割X数据集trainY, testY = Y[:-look_back], Y[-look_back:]  # 分割Y数据集# 调整形状以适配LSTM网络trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1], trainX.shape[2]))testX = np.reshape(testX, (testX.shape[0], testX.shape[1], testX.shape[2]))# 构建LSTM模型model = Sequential()  # 创建Sequential模型model.add(LSTM(50, return_sequences=True, input_shape=(trainX.shape[1], trainX.shape[2])))model.add(Dropout(0.2))  # 添加Dropout层防止过拟合model.add(LSTM(50))model.add(Dropout(0.2))  # 再次添加Dropout层防止过拟合model.add(Dense(Dataset.shape[1] - 1))  # 添加Dense层进行预测model.compile(optimizer='adam', loss='mean_squared_error')  # 编译模型# 训练模型model.fit(trainX, trainY, epochs=50, batch_size=32, validation_data=(testX, testY))# 预测未来100天的打印量futureX = testX[-1].reshape(1, look_back, Dataset.shape[1] - 1)  # 准备输入数据predictions = []  # 初始化预测结果列表for _ in range(100):  # 进行100次预测pred = model.predict(futureX)  # 预测predictions.append(pred[0])  # 添加预测结果futureX = np.roll(futureX, -1, axis=1)  # 滚动输入数据futureX[0, -1] = pred  # 更新最后一个时间步的数据# 反标准化预测结果predictions = scaler.inverse_transform(predictions)# 后处理:确保所有预测值为非负数predictions = np.clip(predictions, 0, None)# 保存结果到CSVprediction_df = pd.DataFrame(predictions, columns=Dataset.columns[1:])  # 创建DataFramefuture_dates = pd.date_range(start=date[-1], periods=101, freq='D')[1:]  # 生成未来日期prediction_df['Date'] = future_dates  # 添加日期列prediction_df.set_index('Date', inplace=True)  # 将日期设置为索引# 保存到指定路径prediction_df.to_csv(save_path)  # 保存CSV文件print(f"Predictions saved to {save_path}")  # 打印保存信息# 可视化plt.figure(figsize=(12, 6))  # 创建图形for column in prediction_df.columns:  # 遍历列plt.plot(prediction_df.index, prediction_df[column], label=column)  # 绘制折线图plt.title('Predicted Printer Usage for the Next 100 Days')  # 设置标题plt.xlabel('Date')  # 设置X轴标签plt.ylabel('Predicted Usage')  # 设置Y轴标签plt.legend(loc='upper right')  # 设置图例位置plt.show()  # 显示图形# 使用示例
data_path = 'D:\\桌面\\singapore\\Model_Beijing_Assignment.csv'  # 数据文件路径
save_path = 'D:\\桌面\\singapore\\prediction.CSV'  # 预测结果保存路径
predict_and_save(data_path, save_path)  # 调用函数进行预测并保存结果

最后还加了可视化,挺直观的
数据集也已经绑定

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s跨节点后pod无法访问

场景 k8s在node1节点部署nginx后, 除node1外,主节点以及node2节点都无法正常访问nginx 并且主节点以及node2节点都无法ping通node1节点上的pod 网络插件为calico 并且也没有相关路由信息 解决方案 启动tunl0接口,因为calico需要使用tunl0网…

【解析几何笔记】8.向量的投影与内积

8. 向量的投影与内积 复习前面的知识:,若BCE三点共线,则 A E ⃗ ( 1 − s ) A B ⃗ s A C ⃗ , ( B , C , E ) μ ⇒ s μ 1 μ , 1 − s 1 1 μ \vec{AE}(1-s)\vec{AB}s\vec{AC},(B,C,E)\mu\Rightarrow s\frac{\mu}{1\mu},1-s\frac…

【学习笔记】时间序列模型(ARIMA)

文章目录 前言一、时间序列时间序列数据 二、ARIMA 模型大纲模型前提平稳性检验 差分整合移动平均自回归模型 ARIMA(p,q,d)自回归模型 (AR( p ))移动平均模型 (MA( q ))自回归移动平均模型(ARMA(p,q))差分自回归移动平均模型 ARIMA(p,d,q) 确定 p,q结果分析和模型检…

EVE-NG安装部署使用

EVE-NG安装部署使用 一、EVE的虚拟化安装1、下载EVE-NG(社区版)2、导入虚拟机-配置-登录二、EVE中设备的连接sercureCRT连接wireshark连接一、EVE的虚拟化安装 1、下载EVE-NG(社区版) 官网下载地址(科学上网): https://www.eve-ng.net/index.php/download/ 中文网下载…

运用Archimate为 智慧文旅搭建 数字化架构体系【系统架构】

ArchiMate是一种用于企业架构建模的开放、独立且详细的语言,它提供了一套丰富的概念和关系来描述、分析和可视化企业架构的不同领域。以下是ArchiMate建模的一些关键功能: 多视图建模:ArchiMate定义了23个示例视图,分为四类&#…

VMware-Ubuntu共享文件找不到

正常的流程我们实现设置共享目录 然后安装vmware-tool工具 我们先看一下vmware-tool的获取方式,系统安装好了以后,关闭系统将虚拟机设置改成图中配置,然后重启 鼠标右键会看到重新安装vmware-tool不再是灰色,点击重新安装 以1…

OpenCV几何图像变换(5)旋转和缩放计算函数getRotationMatrix2D()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算二维旋转的仿射矩阵。 该函数计算以下矩阵: [ α β ( 1 − α ) ⋅ center.x − β ⋅ center.y − β α β ⋅ center.x ( …

【TB作品】MSP430F149单片机,数字时钟万年历程序,滚动显示特效

一、 万年历 任务要求: 制作一个万年历,具有显示时间、日期、温度、湿度、闹钟功能。 1、OLED显示屏上显示日期和时钟(显示到秒,时间可走动);(20分) 2、通过开发板上的温度传感器采集…

8月25日笔记

IOX的使用 iox是一款功能强大的端口转发&内网代理工具,该工具的功能类似于lcx和ew,但是iox的功能和性能都更加强大。 实际上,lcx和ew都是非常优秀的工具,但还是有地方可以提升的。在一开始使用这些工具的一段时间里&#xff…

前端常见**MS题 [3]

css部分 1、简单说明一下盒模型 CSS盒模型定义了盒的每个部分包含: margin, border, padding, content 。根据盒子大小的计算方式不同盒模型分成了两种,标准盒模型和怪异盒模型。 标准模型,给盒设置 width 和 height,实际设置的是…

C语言 | Leetcode C语言题解之第373题查找和最小的K对数字

题目&#xff1a; 题解&#xff1a; #define MIN(a, b) ((a) > (b) ? (b) : (a))int** kSmallestPairs(int* nums1, int nums1Size, int* nums2, int nums2Size, int k, int* returnSize, int** returnColumnSizes) {if (nums1Size 0 || nums2Size 0 || k < 0) {*ret…

Gerapy 分布式爬虫管理框架

什么是 Gerapy Gerapy 是一个基于 Scrapy 的分布式爬虫管理框架。它提供了一个图形化的用户界面&#xff0c;使得用户可以更方便地进行 Scrapy 项目的管理和调度。Gerapy 支持项目的创建、编辑、部署以及调度任务的管理。 功能作用 项目管理&#xff1a;Gerapy 允许用户通过 W…

数据结构系列-归并排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 归并排序 递归版本 首先&#xff0c;我们来看一下归并的示意图&#xff1a; 这是归并排序当中分解的过程。 然后便是两个两个进行排序&#xff0c;组合的过程。 归并完美的诠释…

C++类和对象(2)——拷贝构造函数

拷贝构造函数的语法 拷贝构造函数是构造函数的重载&#xff0c; 用于这种情况&#xff1a;用已经构造好的对象去给另一个对象初始化。 int main() {Date d1(2024, 8, 1);Date d2(d1);//用d1初始化d2return 0; } 我们以Date类为例子讲解一下。 class Date { public://全缺省…

【计算机网络】计算机网络的概念

什么是计算机网络&#xff1f; 计算机网络&#xff08;Computer networking&#xff09;是一个将众多分散的、自治的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 计算机网络、互连网、互联网的区别 计算机…

OpenCV几何图像变换(4)亚像素图像截取函数getRectSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从图像中以亚像素精度检索像素矩形。 getRectSubPix 函数从 src 中提取像素&#xff1a; p a t c h ( x , y ) s r c ( x center.x − ( dst.…

指针之旅(1)—— 指针基础概念知识(详细解析)

前言&#xff1a;该篇我将详细讲解指针当中的一些基本概念&#xff0c;有内存和地址的部分硬件知识&#xff0c;有专门服务于指针的操作符&和*&#xff0c;有指针大小固定不变的原因&#xff0c;还有专属于指针的运算规则。 目录 1. 内存和地址 1.1 内存地址的概念&…

<数据集>非洲动物识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1504张 标注数量(xml文件个数)&#xff1a;1504 标注数量(txt文件个数)&#xff1a;1504 标注类别数&#xff1a;4 标注类别名称&#xff1a;[buffalo, elephant, rhino, zebra] 序号类别名称图片数框数1buffalo3…

水凝胶与柔性电子啥关系?能用来干啥?

大家好&#xff0c;今天我们来聊一聊一篇关于水凝胶在柔性电子领域应用的文章——《Smart materials for flexible electronics and devices: hydrogel》发表于《RSC Advances》。随着科技的不断发展&#xff0c;柔性电子设备越来越受到关注&#xff0c;而水凝胶作为一种具有独…

Apache Flink内存模型

Flink 内存模型 大数据中所有开源的框架都会使用到JVM&#xff0c;不如&#xff0c;MapReduce&#xff0c;Storm&#xff0c;Spark等&#xff0c;这些计算框架处理数据过程中涉及到将大量数据存储到内存中&#xff0c;此时如果内存管理过渡依赖JVM&#xff0c;会出现java对象存…