本项目旨在使用PyTorch框架构建一个基于XLSTM和Transformer的新模型,用于多变量时间序列预测。XLSTM是LSTM的一种改进版本,通过引入新的门控机制和记忆结构来提高计算精度。结合T

 XLSTM+transformer新模型序列时间序列预测


XLSTM结合transformer进行特征提取
用slstm或mlstm提取融合
纯个人手打代码,自己研究的创新点,超级新。可以发刊,先发先的,高精度代码。

需知:好的创新性模型可以事半功倍。目前太多流水paper,都是旧模型,老师已经审美疲劳,很难发好一点的刊,这种模型很新,让paper审核老师眼睛一亮,老师就会觉得你有水平,关注顶会前沿热点,非常好中稿。python代码,pytorch架构

适合功率预测,风电光伏预测,负荷预测,流量预测,浓度预测,机械领域预测等等各种时间序列直接预测。

XLSTM是LSTM原作者在2024年5月顶会提出的一个改进版本,创新性非常高,改都不改发3区以上完全够用,效果也不错。代码可以继续添加优化方法,改其他former模型,分解机制,注意力机制等等,

xLSTM 是对传统 LSTM 的一种扩展,它通过引入新的门控机制和记忆结构来改进 LSTM。XLSTM 的核心是对传统 LSTM 框架的两项主要修改:指数门控和新颖的记忆结构。这些增强引入了两种新的 LSTM 变体,即 sLSTM (标量 LSTM)和 mLSTM (矩阵 LSTM)。计算精度相比lstm提高了很多。与Transformers 和状态空间模型相比,无论是在性能还是扩展方面,都表现出色。(代码里也有pdf理论知识和注释方便理解)
功能如下:
1.多变量输入,单变量输出

2.多时间步预测,单时间步预测

3.评价指标:R方 RMSE MAE MAPE对比图

4.数据从excel/csv文件中读取代码带数据,注释清晰

项目特点
  • 高创新性:结合了最新的XLSTM和Transformer技术,具有很强的创新性和前沿性。
  • 高精度:相比传统LSTM,计算精度显著提高。
  • 多功能:支持多变量输入、单变量输出,多时间步预测和单时间步预测。
  • 详细注释:代码中包含详细的注释和理论知识说明,便于理解和修改。
  • 适用广泛:适用于功率预测、风电光伏预测、负荷预测、流量预测、浓度预测、机械领域预测等多种时间序列预测任务。
  • 易上手:适合新手小白快速入门,也适合有经验的研究者进行进一步优化。
项目结构
XLSTM_Transformer_Time_Series_Prediction/
├── data/                               # 数据文件夹
│   ├── power_data.csv                  # 功率数据示例
│   └── wind_data.csv                   # 风电数据示例
├── src/                                # 源代码文件夹
│   ├── data_preprocessing.py           # 数据预处理
│   ├── model.py                        # XLSTM+Transformer模型定义
│   ├── train.py                        # 训练脚本
│   ├── test.py                         # 测试脚本
│   ├── visualize.py                    # 可视化脚本
│   └── main.py                         # 主程序
├── utils/                              # 工具函数
│   ├── plot_utils.py                   # 绘图工具
│   └── config.py                       # 配置文件
├── docs/                               # 文档文件夹
│   ├── xlstm_theory.pdf                # XLSTM理论知识
│   └── transformer_theory.pdf          # Transformer理论知识
├── README.md                           # 项目说明文档
└── requirements.txt                    # 依赖库文件
项目内容
  1. 数据处理

    • 从Excel或CSV文件中读取数据。
    • 对数据进行预处理,包括归一化、分割为训练集和测试集等。
  2. 模型构建

    • 定义XLSTM(sLSTM和mLSTM)和Transformer的组合模型。
    • 使用XLSTM进行特征提取和时间序列建模,结合Transformer的注意力机制增强模型性能。
  3. 训练

    • 设置训练参数,如学习率、批次大小、训练轮数等。
    • 使用训练集数据训练模型,并在验证集上评估性能。
  4. 测试

    • 使用测试集数据测试模型,计算R方、RMSE、MAE、MAPE等评价指标。
    • 绘制预测结果与真实值的对比图,直观展示模型性能。
  5. 可视化

    • 可视化数据预处理后的信号波形。
    • 绘制训练过程中的损失曲线和评价指标曲线。
    • 显示最终的测试结果和对比图。
代码示例
1. 数据预处理 src/data_preprocessing.py
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

def load_data(file_path, window_size=60):
    df = pd.read_csv(file_path)
    data = df.values
    
    X, y = [], []
    for i in range(len(data) - window_size):
        X.append(data[i:i + window_size, :-1])
        y.append(data[i + window_size, -1])
    
    X = np.array(X)
    y = np.array(y)
    
    return X, y

def preprocess_data(X, y, train_ratio=0.8):
    scaler = MinMaxScaler()
    X = scaler.fit_transform(X.reshape(-1, X.shape[-1])).reshape(X.shape)
    y = scaler.fit_transform(y.reshape(-1, 1)).reshape(-1)
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1 - train_ratio, shuffle=False)
    
    return X_train, X_test, y_train, y_test, scaler

# 示例调用
file_path = 'data/power_data.csv'
X, y = load_data(file_path)
X_train, X_test, y_train, y_test, scaler = preprocess_data(X, y)
2. 模型定义 src/model.py
import torch
import torch.nn as nn

class sLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_layers=2):
        super(sLSTM, self).__init__()
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)
    
    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)
        out, _ = self.lstm(x, (h0, c0))
        return out[:, -1, :]

class mLSTM(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_layers=2):
        super(mLSTM, self).__init__()
        self.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)
    
    def forward(self, x):
        h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)
        c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).to(x.device)
        out, _ = self.lstm(x, (h0, c0))
        return out[:, -1, :]

class TransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1):
        super(TransformerEncoderLayer, self).__init__()
        self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout)
        self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.linear2 = nn.Linear(dim_feedforward, d_model)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout1 = nn.Dropout(dropout)
        self.dropout2 = nn.Dropout(dropout)
        self.activation = nn.ReLU()

    def forward(self, src):
        src2 = self.self_attn(src, src, src)[0]
        src = src + self.dropout1(src2)
        src = self.norm1(src)
        src2 = self.linear2(self.dropout(self.activation(self.linear1(src))))
        src = src + self.dropout2(src2)
        src = self.norm2(src)
        return src

class XLSTM_Transformer(nn.Module):
    def __init__(self, input_dim, hidden_dim, num_layers, nhead, d_model, output_dim=1):
        super(XLSTM_Transformer, self).__init__()
        self.s_lstm = sLSTM(input_dim, hidden_dim, num_layers)
        self.m_lstm = mLSTM(input_dim, hidden_dim, num_layers)
        self.transformer_encoder = TransformerEncoderLayer(d_model, nhead)
        self.fc = nn.Linear(hidden_dim * 2, output_dim)

    def forward(self, x):
        s_out = self.s_lstm(x)
        m_out = self.m_lstm(x)
        combined_out = torch.cat((s_out, m_out), dim=1)
        transformed_out = self.transformer_encoder(combined_out.unsqueeze(0)).squeeze(0)
        output = self.fc(transformed_out)
        return output
3. 训练脚本 src/train.py
import torch
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from src.model import XLSTM_Transformer
from src.data_preprocessing import preprocess_data
import matplotlib.pyplot as plt

def train_model(X_train, y_train, X_val, y_val, num_epochs=100, batch_size=32, learning_rate=0.001):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    # 转换为Tensor
    X_train = torch.tensor(X_train, dtype=torch.float32).to(device)
    y_train = torch.tensor(y_train, dtype=torch.float32).to(device)
    X_val = torch.tensor(X_val, dtype=torch.float32).to(device)
    y_val = torch.tensor(y_val, dtype=torch.float32).to(device)
    
    train_dataset = TensorDataset(X_train, y_train)
    train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
    
    model = XLSTM_Transformer(input_dim=X_train.shape[2], hidden_dim=64, num_layers=2, nhead=4, d_model=128).to(device)
    criterion = nn.MSELoss()
    optimizer = optim.Adam(model.parameters(), lr=learning_rate)
    
    train_losses = []
    val_losses = []
    
    for epoch in range(num_epochs):
        model.train()
        running_loss = 0.0
        
        for inputs, labels in train_loader:
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            
            running_loss += loss.item()
        
        train_loss = running_loss / len(train_loader)
        train_losses.append(train_loss)
        
        # 验证
        model.eval()
        with torch.no_grad():
            val_outputs = model(X_val)
            val_loss = criterion(val_outputs, y_val).item()
        
        val_losses.append(val_loss)
        
        print(f'Epoch [{epoch+1}/{num_epochs}], Train Loss: {train_loss:.4f}, Val Loss: {val_loss:.4f}')
    
    # 绘制训练曲线
    plt.figure(figsize=(10, 5))
    plt.plot(train_losses, label='Train Loss')
    plt.plot(val_losses, label='Val Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()
    plt.show()
    
    return model

# 示例调用
file_path = 'data/power_data.csv'
X, y = load_data(file_path)
X_train, X_val, y_train, y_val, scaler = preprocess_data(X, y)
model = train_model(X_train, y_train, X_val, y_val)
4. 测试脚本 src/test.py
import torch
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, mean_absolute_percentage_error
import matplotlib.pyplot as plt

def evaluate_model(model, X_test, y_test, scaler):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    X_test = torch.tensor(X_test, dtype=torch.float32).to(device)
    y_test = torch.tensor(y_test, dtype=torch.float32).to(device)
    
    model.eval()
    with torch.no_grad():
        predictions = model(X_test)
    
    # 反归一化
    y_test = scaler.inverse_transform(y_test.cpu().numpy().reshape(-1, 1)).flatten()
    predictions = scaler.inverse_transform(predictions.cpu().numpy().reshape(-1, 1)).flatten()
    
    r2 = r2_score(y_test, predictions)
    rmse = np.sqrt(mean_squared_error(y_test, predictions))
    mae = mean_absolute_error(y_test, predictions)
    mape = mean_absolute_percentage_error(y_test, predictions)
    
    print(f'R^2: {r2:.4f}')
    print(f'RMSE: {rmse:.4f}')
    print(f'MAE: {mae:.4f}')
    print(f'MAPE: {mape:.4f}')
    
    # 绘制对比图
    plt.figure(figsize=(10, 5))
    plt.plot(y_test, label='True Values')
    plt.plot(predictions, label='Predictions', linestyle='--')
    plt.xlabel('Time Steps')
    plt.ylabel('Value')
    plt.legend()
    plt.show()

# 示例调用
evaluate_model(model, X_test, y_test, scaler)
使用说明
  1. 环境准备

    • 安装依赖库:
      pip install -r requirements.txt
  2. 数据加载

    • 将时间序列数据保存为CSV文件,并放置在data/目录下。
  3. 运行主程序

    • 在Python环境中运行main.py脚本。
    • 查看控制台输出的训练进度、测试结果和生成的图表。
注意事项
  • 数据格式:确保你的数据格式正确,且每条时间序列长度一致。
  • 超参数调整:根据实际情况调整网络层数、隐藏层维度、学习率等超参数。
  • 硬件要求:建议使用GPU进行训练和推理,以加快处理速度。如果没有足够的计算资源,可以考虑使用云服务提供商的GPU实例。

通过上述步骤,你可以轻松地使用PyTorch和XLSTM+Transformer新模型进行时间序列预测,并获得详细的评估结果。希望这个项目能帮助你更好地理解和应用深度学习技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值