TimeSeriesHomework1_2 / src /lab5_functions.py
Kolesnikov Dmitry
feat: Sarima и VAR для третей лабораторки
b34a74f
# lab5_functions.py
"""
Минимальный LSTM example для ЛР №5 (PyTorch).
Если у вас нет torch — функции выбросят понятную ошибку.
"""
import numpy as np
import pandas as pd
try:
import torch
import torch.nn as nn
TORCH_AVAILABLE = True
except Exception:
TORCH_AVAILABLE = False
if TORCH_AVAILABLE:
class SimpleLSTM(nn.Module):
def __init__(self, input_size, hidden_size=64, num_layers=1, out_size=1):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, out_size)
def forward(self, x):
out, _ = self.lstm(x)
return self.fc(out[:, -1, :])
def create_sequences(series, lookback=30, horizon=1):
X, y = [], []
for i in range(len(series) - lookback - horizon + 1):
X.append(series[i:i+lookback])
y.append(series[i+lookback:i+lookback+horizon])
return np.array(X), np.array(y)
def train_lstm(series, lookback=30, epochs=20, lr=1e-3):
X, y = create_sequences(series, lookback=lookback, horizon=1)
X = torch.from_numpy(X).float().unsqueeze(-1) # (N, L, 1)
y = torch.from_numpy(y).float().squeeze(-1)
model = SimpleLSTM(input_size=1)
opt = torch.optim.Adam(model.parameters(), lr=lr)
loss_fn = nn.MSELoss()
model.train()
for ep in range(epochs):
pred = model(X)
loss = loss_fn(pred.squeeze(), y)
opt.zero_grad(); loss.backward(); opt.step()
return model
else:
def train_lstm(*args, **kwargs):
raise ImportError("PyTorch не установлен. Установите torch, чтобы использовать LSTM.")