对时间序列数据(牛仔裤销售数据集)进行LSTM预测(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客 

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🌈3 Matlab代码实现

🎉4 参考文献


💥1 概述

LSTM模型的一个常见用途是对长时间序列数据进行学习预测,例如得到了某商品前一年的日销量数据,我们可以用LSTM模型来预测未来一段时间内该商品的销量。但对于不熟悉神经网络或者对没有了解过RNN模型的人来说,想要看懂LSTM模型的原理是非常困难的,但有些时候我们不得不快速上手搭建一个LSTM模型来完成预测任务。本文分析在线产品价格数据以预测当前产品价格。

首先建立模型,确定每个因素对定价的影响程度,并且能够预测出在不同变量组合下的价格;从而根据特定的价格水平,对产品进行设计,制定商业策略。

📚2 运行结果

 

 

主函数部分代码:

jean_data = readtable('jean_sales.xlsx');

%    Fill the NaN value with the Nearest value.
jean_data.sales_price = fillmissing(jean_data.sales_price, 'nearest');
lenofdata = length(jean_data.sales_price);


for i=1 : length(jean_data.collect_day)
    jean_data.collect_day(i) = strip(jean_data.collect_day(i),"'");
end

Y = jean_data.sales_price;
data = Y';

numTimeStepsTrain = floor(0.9*numel(data));
dataTrain = data(1:numTimeStepsTrain+1);
dataTest = data(numTimeStepsTrain+1:end);

%   Normalize sales_price to a value between 0 and 1 (Training Data Set)
mu = mean(dataTrain);
sig = std(dataTrain);
dataTrainStandardized = (dataTrain - mu) / sig;
XTrain = dataTrainStandardized(1:end-1);
YTrain = dataTrainStandardized(2:end);

%LSTM Net Architecture Def
numFeatures = 1;
numResponses = 1;
numHiddenUnits = 200;
layers = [ ...
    sequenceInputLayer(numFeatures)
    lstmLayer(numHiddenUnits)
    fullyConnectedLayer(numResponses)
    regressionLayer];
options = trainingOptions('adam', ...
    'MaxEpochs',500, ...
    'GradientThreshold',1, ...
    'InitialLearnRate',0.005, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropPeriod',125, ...
    'LearnRateDropFactor',0.2, ...
    'Verbose',0, ...
    'Plots','training-progress');
    
%    Train LSTM Net
net = trainNetwork(XTrain,YTrain,layers,options);

%    Normalize sales_price to a value between 0 and 1 (Testing Data Set)
dataTestStandardized = (dataTest - mu) / sig;
XTest = dataTestStandardized(1:end-1);
net = predictAndUpdateState(net,XTrain);
[net,YPred] = predictAndUpdateState(net,YTrain(end));

%   Predict as long as the test period (2019.05.07 ~ 2019.10.31)
numTimeStepsTest = numel(XTest);
for i = 2:numTimeStepsTest
    [net,YPred(:,i)] = predictAndUpdateState(net,YPred(:,i-1),'ExecutionEnvironment','cpu');
end

🌈3 Matlab代码实现

🎉4 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]杨青,王晨蔚.基于深度学习LSTM神经网络的全球股票指数预测研究[J].统计研究,2019,36(03):65-77.DOI:10.19343/j.cnki.11-1302/c.2019.03.006.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
非常抱歉,我误解了你的问题。如果你想在时间序列数据上使用LSTM模型进行预测之前对数据进行分解,你可以使用一些时间序列分解方法,如季节性分解或趋势分解。在Python中,可以使用statsmodels库中的seasonal_decompose函数对时间序列进行分解。以下是一个修改后的示例代码: ```python import torch import torch.nn as nn import numpy as np from statsmodels.tsa.seasonal import seasonal_decompose class TimeSeriesLSTM(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(TimeSeriesLSTM, self).__init__() self.hidden_size = hidden_size self.lstm = nn.LSTM(input_size, hidden_size) self.fc = nn.Linear(hidden_size, output_size) def forward(self, input_seq): lstm_out, _ = self.lstm(input_seq.view(len(input_seq), 1, -1)) predictions = self.fc(lstm_out.view(len(input_seq), -1)) return predictions[-1] # 示例用法 input_size = 1 hidden_size = 32 output_size = 1 # 创建模型实例 model = TimeSeriesLSTM(input_size, hidden_size, output_size) # 创建输入序列 input_seq = np.array([0.2, 0.4, 0.6, 0.8, 1.0, 1.2]) # 示例数据 # 对时间序列进行分解 decomposition = seasonal_decompose(input_seq) # 获取分解后的趋势项 trend = decomposition.trend # 创建训练数据 train_data = torch.tensor(trend[:-1], dtype=torch.float32) train_labels = torch.tensor(trend[1:], dtype=torch.float32) # 训练模型 criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) for epoch in range(100): optimizer.zero_grad() # 前向传播 outputs = model(train_data) loss = criterion(outputs, train_labels) # 反向传播和优化 loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch: {epoch+1}, Loss: {loss.item()}') # 使用模型进行预测 prediction = model(train_data) print(prediction) ``` 在这个示例中,我们首先使用seasonal_decompose函数对输入序列进行分解,提取出趋势项作为训练数据。然后,我们使用提取的趋势项作为训练数据和标签,使用LSTM模型进行训练和预测。 请注意,这只是一个简单的示例,实际应用中可能需要更复杂的预处理和模型调整。此外,还可以根据需要使用其他时间序列分解方法或调整模型结构。 希望这次能满足你的需求,如有任何问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

荔枝科研社

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

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

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

打赏作者

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

抵扣说明:

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

余额充值