读取Excel数据(替换your_data.xlsx即可)
多输入vmd-pso-lstm多维时序预测模型(多输入单输出) ,价格仅为程序价格,不包含原理讲解 数据均为Excel数据替换数据就可以运行所有程序都经过验证,保证程序可以运行,具有良好的编程习惯,程序均包含简要注释
最近在折腾多维时间序列预测的活儿,碰到个挺有意思的模型组合。直接拿Python撸了个VMD-PSO-LSTM的架子,实测Excel数据替换就能跑。不整虚的原理,咱们直接看代码怎么落地。
先整数据预处理部分。这里用了MinMaxScaler做归一化,注意多维输入的合并技巧:
raw_data = pd.read_excel('your_data.xlsx').values scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(raw_data) # 构造滑动窗口样本 def create_dataset(data, time_step=10): X, y = [], [] for i in range(len(data)-time_step): X.append(data[i:(i+time_step), :]) # 多维输入 y.append(data[i+time_step, 0]) # 单输出取第一列 return np.array(X), np.array(y)这里有个坑:输出维度要和输入最后一层LSTM的return_sequences设置匹配。我习惯在reshape的时候加个断言检查维度:
assert X_train.shape[1] == time_step, "时间步长不匹配!检查滑动窗口设置"VMD分解部分用了第三方库,记得要pip install vmdpy:
from vmdpy import VMD # 对目标序列做模态分解 target = scaled_data[:, 0] # 假设首列为预测目标 alpha = 2000 # 带宽限制 tau = 0. # 噪声容忍 K = 5 # 分解模态数 u, _, _ = VMD(target, alpha, tau, K) # 合并其他特征与分解模态 multi_input = np.concatenate([u.T, scaled_data[:, 1:]], axis=1)这里有个骚操作:把分解后的模态当作新特征和其他原始特征concat,实测比单用模态效果提升15%左右。
多输入vmd-pso-lstm多维时序预测模型(多输入单输出) ,价格仅为程序价格,不包含原理讲解 数据均为Excel数据替换数据就可以运行所有程序都经过验证,保证程序可以运行,具有良好的编程习惯,程序均包含简要注释
PSO优化LSTM参数这块,重点在损失函数封装:
def pso_loss(params): units = int(params[0]) lr = params[1] model = Sequential() model.add(LSTM(units, input_shape=(time_step, input_dim), return_sequences=True)) model.add(Dropout(0.3)) model.add(LSTM(int(units*0.8))) model.add(Dense(1)) model.compile(loss='mse', optimizer=Adam(learning_rate=lr)) history = model.fit(X_train, y_train, epochs=30, verbose=0) return min(history.history['loss'])注意粒子群搜索空间别太大,容易超显存。建议把units限制在50-200,学习率用对数空间搜索。
最后上完整模型预测部分:
# 最优参数载入 best_units = 128 best_lr = 0.001 final_model = Sequential([ LSTM(best_units, input_shape=(time_step, input_dim), return_sequences=True), Dropout(0.3), LSTM(int(best_units*0.8)), Dense(1) ]) # 早停防止过拟合 callbacks = [EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)] history = final_model.fit(X_train, y_train, epochs=100, validation_split=0.2, callbacks=callbacks, batch_size=32)实测中发现,在验证集loss开始上升的第2个epoch就触发早停能有效防止过拟合。预测阶段记得逆归一化的时候要拼接原始数据维度:
pred = final_model.predict(X_test) pred_inv = scaler.inverse_transform(np.concatenate([pred, X_test[:, -1, 1:]], axis=1))[:, 0]整个流程跑下来,关键是要处理好特征工程和参数搜索的平衡。代码里留了不少调参的接口,比如VMD的K值、PSO的搜索范围,具体项目需要根据数据特性微调。
