基于LSTM的多变量温度预测(python从入门到入坑)

一篇针对初学者的LSTM多变量温度预测教程,介绍了如何使用Python从数据预处理到构建LSTM模型的过程,包括Anaconda环境搭建、数据相关性分析、数据切分、模型训练及精度达到99%的预测结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于LSTM的多变量温度预测(python)

——我保证他能够运行,而且结果能够让你满意(如果你和我一样都是一个新手的话)

一、我为什么要写这些?

因为让人抓狂的课程大作业,我小组选择了一个多变量预测方面的课题,在我这个大三基本上还没接触过Python数据处理,甚至对神经网络什么的都只是仅限于听过的情况下,这个东西简直难如登天。

然后值得高兴的是网上有很多现成的值得快速模拟入门的代码,但是令人痛苦的是:杂乱无章而且缺乏解释,最后得出的结果也不能说明问题(结果很糟糕,不知道是什么原因)。

因此,我集网上多变量实例代码,结合自己的浅薄之见,做出如下总结,同时也是方便提醒自己——毕竟一星期速成的东西…希望能够支持我完成课程作业。

二、具体做了什么?

结合了多方经验,主要有

  • B站唐国梁老师的——TensoFlow2基于LSTM多变量共享单车使用预测(通过这个我快速入门了一些概念)
  • 本文链接:https://blog.csdn.net/weixin_39653948/article/details/105927085(tf.keras 11: 时间序列预测之LSTM天气预测)网上大部分都是这个示例
  • 以及该文章-本文链接:https://blog.csdn.net/weixin_38346042/article/details/119983658(基于LSTM温度时间序列预测,较于上面那个例子更深入,对特征进行了一些筛选)

然后我根据这些大佬的例子结合一些粗浅的理解——

  1. 学会使用Anaconda(下载python库的)和Jyputer(允许单步执行代码块)
  2. 通过python强大的绘图,肉眼扫描提取相关性特征(最有可能影响温度变化的东西)
  3. 实现了从零到有切分处理csv数据集
  4. 单手建立一个啥参数都不调的(或者叫照抄)的神经网络结构3层LSTM——单手是因为我使用cv大法的时候在吃东西
  5. 成功训练出了一个利用前3小时数据,精确预测下一小时温度的模型,精度达到了99%(可能是因为时间跨度短,我还不懂,不过确实能运行出结果了)
    在训练集上的预测值和真实值结果曲线图片

三、源代码切块加注释,恳请批评指正(●’◡’●)ノ

PS:代码是在Jyputer上运行的,使用的库是利用Anaconda下载的
如果有知道这个的小可爱,建议去知道一下,不要乱copy代码然后没有库然后在配置的时候因为tensorflow和python版本问题,相关库更新问题,还有莫名其妙的报错而愤怒摔键盘。

1. block1导入相关包

import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import r2_score
from tensorflow.keras import utils,losses,layers,Sequential
from tensorflow.keras.callbacks import ModelCheckpoint,TensorBoard

2.读取csv数据集,搜索jena_climate_2009_2016数据集,需要的自己去下载

data_path="D:\WorkSpace\jena_climate_2009_2016.csv"
dataset=pd.read_csv(data_path,parse_dates=['Date Time'],index_col=['Date Time'])

dataset.shape#输出数组形状(420551, 14)(行,列)
dataset.tail()#输出尾5个列
dataset.head()#数据结构如下,输出头5个列
dataset.info()

在这里插入图片描述

3.画图看相关性,提取有效特征集

#肉眼观察法————下面三块可以不要
plt.figure(figsize=(16,8))
#作图辅助库
sns.lineplot(x='p (mbar)',y='T (degC)',data=dataset[:10000])
plt.show()

plt.figure(figsize=(16,8))
sns.lineplot(x='Tdew (degC)',y='T (degC)',data=dataset[:10000])
plt
以下是一个使用Python手动实现LSTM多变量预测的基本源代码: ``` import numpy as np # 定义LSTM类 class LSTM: def __init__(self, input_size, hidden_size, output_size): self.input_size = input_size self.hidden_size = hidden_size self.output_size = output_size # 初始化权重和偏置 self.Wf = np.random.randn(hidden_size, input_size + hidden_size) self.Wi = np.random.randn(hidden_size, input_size + hidden_size) self.Wo = np.random.randn(hidden_size, input_size + hidden_size) self.Wc = np.random.randn(hidden_size, input_size + hidden_size) self.Wy = np.random.randn(output_size, hidden_size) self.bf = np.zeros((hidden_size, 1)) self.bi = np.zeros((hidden_size, 1)) self.bo = np.zeros((hidden_size, 1)) self.bc = np.zeros((hidden_size, 1)) self.by = np.zeros((output_size, 1)) # 定义激活函数 def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def tanh(self, x): return np.tanh(x) # 定义前向传播函数 def forward(self, xt, ht_minus_one, ct_minus_one): self.concat = np.vstack((ht_minus_one, xt)) ft = self.sigmoid(np.dot(self.Wf, self.concat) + self.bf) it = self.sigmoid(np.dot(self.Wi, self.concat) + self.bi) ot = self.sigmoid(np.dot(self.Wo, self.concat) + self.bo) ctilde_t = self.tanh(np.dot(self.Wc, self.concat) + self.bc) ct = ft * ct_minus_one + it * ctilde_t ht = ot * self.tanh(ct) yt = np.dot(self.Wy, ht) + self.by return yt, ht, ct def train(self, X, y, lr=0.01, epochs=100): for epoch in range(epochs): for i in range(len(X)): xt = X[i] yt = y[i] yt_pred, ht, ct = self.forward(xt, ht_minus_one, ct_minus_one) # 计算梯度 dWy = np.dot((yt_pred - yt), ht) dby = yt_pred - yt delta = np.dot(self.Wy.T, yt_pred - yt) * (1 - ht**2) dWo = delta * self.sigmoid(np.dot(self.Wo, self.concat) + self.bo) * (1 - self.sigmoid(np.dot(self.Wo, self.concat) + self.bo)) dWi = delta * self.sigmoid(np.dot(self.Wi, self.concat) + self.bi) * (1 - self.sigmoid(np.dot(self.Wi, self.concat) + self.bi)) dWf = delta * self.sigmoid(np.dot(self.Wf, self.concat) + self.bf) * (1 - self.sigmoid(np.dot(self.Wf, self.concat) + self.bf)) dWc = delta * (1 - ctilde_t**2) * self.sigmoid(np.dot(self.Wc, self.concat) + self.bc) * (1 - self.sigmoid(np.dot(self.Wc, self.concat) + self.bc)) # 更新权重和偏置 self.Wy -= lr * dWy self.by -= lr * dby self.Wo -= lr * dWo self.bo -= lr * dby self.Wi -= lr * dWi self.bi -= lr * dby self.Wf -= lr * dWf self.bf -= lr * dby self.Wc -= lr * dWc self.bc -= lr * dby # 定义输和输出数据 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) # 初始化LSTM模型 lstm = LSTM(2, 4, 1) # 训练模型 lstm.train(X, y) # 进行预测 for i in range(len(X)): xt = X[i] yt_pred, _, _ = lstm.forward(xt, ht_minus_one, ct_minus_one) print(f"Input: {xt}, Predicted Output: {yt_pred}") ``` 这是一个简单的LSTM模型,用于进行逻辑异或运算的预测。输数据`X`是一个4x2的数组,输出数据`y`是一个4x1的数组。模型使用一个4维的隐藏状态并输出一个预测值。以上代码只是一个基本的框架,可以根据需要进行进一步的优化和改进。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码之狐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值