【Python TensorFlow】 VMD-LSTM时序预测 基于VMD分解的长短期记忆神经网络模型(附代码)
资源下载:https://download.csdn.net/download/vvoennvv/92404484
目录
一,概述
传统的LSTM神经网络在处理复杂的非线性时间序列数据时,虽然具有强大的序列学习能力,但对于包含多尺度特征和噪声的时序数据,其预测精度往往受到限制。为了解决这些问题,我们引入了VMD(变分模态分解)方法作为数据预处理手段,将其与LSTM神经网络相结合,提出了VMD-LSTM算法。
首先,我们来了解一下VMD算法。VMD(Variational Mode Decomposition,变分模态分解)是一种自适应的信号分解方法,它能够将复杂的非平稳时间序列信号自适应地分解为若干个具有不同中心频率和有限带宽的本征模态函数(IMF)。相比传统的EMD等分解方法,VMD具有更好的数学理论基础,能够有效抑制模态混叠现象。在VMD-LSTM算法中,我们将VMD算法应用于原始时序数据的预处理过程中,将复杂信号分解为多个相对简单的子序列,然后分别对每个子序列建立LSTM预测模型,最后将各个子序列的预测结果进行累加重构,以提高整体预测性能。
VMD-LSTM算法的流程如下:
(1)数据准备:首先,我们需要准备历史数据作为训练集。
(2)VMD信号分解:对原始时序数据中的目标变量进行VMD分解,分解为多个本征模态函数(IMF),每个IMF代表不同频率尺度的信号分量。
(3)数据预处理:将每个VMD分解得到的IMF分量与原始数据的特征列组合,构成新的训练数据集,然后进行一些预处理操作,比如去除异常值、归一化等,以提高预测模型的准确性。
(4)网络构建:根据预处理后的训练集,我们构建VMD-LSTM网络模型。该模型包括输入层、LSTM层和输出层。
(5)模型训练:采用 MSE 作为回归损失,Adam 优化器提升收敛速度与鲁棒性,同时监控 MAE 作为评估指标。
(6)预测结果重构:将各个IMF分量的LSTM模型预测结果进行累加重构,得到最终的预测值。这个过程对应VMD分解的逆过程,通过将各个频率分量的预测结果叠加,还原出原始信号的完整预测。
(7)模型评估:在训练完成后,我们需要对模型进行评估。这可以通过将训练集中的一部分数据作为测试集,来计算模型的预测误差和准确率。
二,代码
代码中文注释非常清晰,按照示例数据修改格式,替换数据集即可运行,数据集可以是csv或者excel表格。
部分代码如下:
if __name__ == "__main__":
warnings.filterwarnings("ignore") # 取消警告
# 使用pandas模块的read_csv函数读取名为"电力负荷预测数据.csv"的文件。
# 参数 'encoding' 设置为 'gb2312',这通常用于读取中文字符,确保文件中的中文字符能够正确读取。
# 读取的数据被存储在名为 'dataset' 的DataFrame变量中。
dataset = pd.read_csv("电力负荷预测数据.csv", encoding='gb2312')
# 下面是读取xlsx的方式,根据实际数据集文件选择是read_csv还是read_excel
# dataset = pd.read_excel("数据集.xlsx", sheet_name='Sheet1', header=0)
print(dataset) # 显示dataset数据
# 从dataset DataFrame中提取数据。
# dataset.values将DataFrame转换为numpy数组。
# [:,1:],逗号前是行,逗号之后是列。这个表示选择所有行(:)和从第二列到最后一列(1:)的数据。
# 这样做通常是为了去除第一列,这在第一列是索引或不需要的数据时很常见。
# 只取第2列数据,要写成1:2;只取第3列数据,要写成2:3,取第2列之后(包含第二列)的所有数据,写成 1:
# 单输入单步预测,就让values等于某一列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
# 单输入多步预测,就让values等于某一列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
# 多输入单步预测,就让values等于多列数据,n_out = 1,n_in, num_samples, scroll_window 根据自己情况来
# 多输入多步预测,就让values等于多列数据,n_out > 1,n_in, num_samples, scroll_window 根据自己情况来
values = dataset.values[:, 1:]
# 如果第一列不是索引,需保留全部列的数据时,则使用下面这句代码,并把上面那句代码屏蔽
# values = dataset.values[:, :]
# 确保所有数据是浮点数
# 将values数组中的数据类型转换为float32。
# 这通常用于确保数据类型的一致性,特别是在准备输入到神经网络模型中时。
values = values.astype('float32')
# 加载VMD分解数据
dataset_vmd = pd.read_excel("VMD.xlsx")
values_vmd = dataset_vmd.values
values_vmd = values_vmd.astype('float32')
print(f"\n{'='*60}")
print(f"数据加载完成:")
print(f" - 原始数据shape: {values.shape} (特征数: {values.shape[1]})")
print(f" - VMD数据shape: {values_vmd.shape} (分量数: {values_vmd.shape[1]})")
print(f" - 数据长度匹配: {len(values) == len(values_vmd)}")
if len(values) != len(values_vmd):
print(f" ⚠ 警告: 数据长度不匹配! 原始:{len(values)}, VMD:{len(values_vmd)}")
print(f"{'='*60}")
#定义输入和输出
n_in = 5 # 输入前5行的数据
n_out = 2 # 预测未来2步的数据
or_dim = values.shape[1] # 记录特征数据维度
# 默认是全部数据用于本次网络的训练与测试,也可以设定具体是数值,比如2000,这个数值不能超过实际的数据点
num_samples = values.shape[0] - n_in - n_out
# num_samples = 2000
#如果等于1,下一个数据从第二行开始取。如果等于2,下一个数据从第三行开始取
scroll_window = 1
#取出85%作为训练集,剩余的为测试集
n_train_number = int(num_samples * 0.85)
#测试集数量
n_test_number = num_samples - n_train_number
predicted_data =[]
actual_data = []
# 验证VMD分解的正确性
print(f"\n原始目标变量前5个值:\n{values[-5:, -1]}")
print(f"VMD所有分量相加前5个值:\n{values_vmd[-5:, :].sum(axis=1)}")
vmd_reconstruction_error = np.mean(np.abs(values[:len(values_vmd), -1] - values_vmd.sum(axis=1)))
print(f"VMD重构误差(MAE): {vmd_reconstruction_error:.4f}")
。。。。。。
三,运行结果




更多推荐
所有评论(0)