news 2026/8/10 3:33:15

lstm优化算法组合模型_python 基于python的lstm时间预测模型,包括cnn、ssa、vmd、woa等多种优化算法组合模型,可用于各种数据的预测。

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
lstm优化算法组合模型_python 基于python的lstm时间预测模型,包括cnn、ssa、vmd、woa等多种优化算法组合模型,可用于各种数据的预测。

lstm优化算法组合模型/python

基于python的lstm时间预测模型,包括cnn、ssa、vmd、woa等多种优化算法组合模型,可用于各种数据的预测。
1、单变量,多变量输入,自由切换
2、单步预测,多步预测,自动切换
3、基于TensorFlow框架,单输出
4、多个评估指标(MAE,MSE,R2等)
保姆级教程,每行代码都有详细注释

以下代码仅供参考

以下是一个基于 Python + TensorFlow 的 LSTM 多算法融合预测模型,支持:

✅ 单变量 / 多变量输入
✅ 单步 / 多步预测
✅ 集成CNN-LSTM、SSA(麻雀搜索算法)、VMD(变分模态分解)、WOA(鲸鱼优化算法)等优化模块
✅ 完整评估指标(MAE, MSE, RMSE, MAPE, R²)
保姆级注释,每行代码清晰可读


📦 一、环境依赖

pipinstallnumpy pandas matplotlib scikit-learn tensorflow pywt vmdpy# 注意:SSA 和 WOA 为自定义实现,无需额外安装

⚠️vmdpy安装(若未安装):

pipinstallvmdpy

📁 二、完整代码(保存为lstm_optimized_forecast.py

# -*- coding: utf-8 -*-""" LSTM 多算法融合时间序列预测模型 支持:单/多变量输入、单/多步预测、CNN-LSTM、VMD、SSA、WOA 优化 作者:AI助手 日期:2026年1月 """importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportMinMaxScalerfromsklearn.metricsimportmean_absolute_error,mean_squared_error,r2_scoreimporttensorflowastffromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDense,LSTM,Conv1D,MaxPooling1D,Dropout,RepeatVectorfromtensorflow.keras.optimizersimportAdamfromtensorflow.keras.callbacksimportEarlyStoppingimportwarnings warnings.filterwarnings('ignore')# -----------------------------# 第一部分:数据预处理工具函数# -----------------------------defcreate_dataset(data,look_back,look_forward=1):""" 创建时间序列滑动窗口数据集 :param data: 输入数据 (numpy array, shape=[n_samples, n_features]) :param look_back: 输入时间步长(过去多少步) :param look_forward: 输出时间步长(预测未来多少步) :return: X (输入), y (输出) """X,y=[],[]foriinrange(len(data)-look_back-look_forward+1):X.append(data[i:(i+look_back)])# 多步预测:取未来 look_forward 步y.append(data[(i+look_back):(i+look_back+look_forward),0])# 默认预测第0列(主目标)returnnp.array(X),np.array(y)defnormalize_data(data,scaler=None):"""归一化数据到 [0,1] 区间"""ifscalerisNone:scaler=MinMaxScaler(feature_range=(0,1))data_scaled=scaler.fit_transform(data)else:data_scaled=scaler.transform(data)returndata_scaled,scaler# -----------------------------# 第二部分:VMD 变分模态分解(用于信号去噪/分解)# -----------------------------defapply_vmd(data,alpha=2000,tau=0.0,K=5,DC=0,init=1,tol=1e-7):""" 对单变量时间序列进行 VMD 分解 :param data: 一维时间序列 (shape=[n,]) :return: 分解后的 IMF 分量列表 """try:fromvmdpyimportVMD u,u_hat,omega=VMD(data,alpha,tau,K,DC,init,tol)returnu# shape = [K, len(data)]exceptExceptionase:print(f"⚠️ VMD 分解失败,跳过:{e}")returnNone# -----------------------------# 第三部分:优化算法(WOA + SSA)# -----------------------------classWOA:"""鲸鱼优化算法(Whale Optimization Algorithm)"""def__init__(self,obj_func,bounds,n_whales=10,max_iter=20):self.obj_func=obj_func self.bounds=bounds# [(min1, max1), (min2, max2), ...]self.n_whales=n_whales self.max_iter=max_iter self.dim=len(bounds)defoptimize(self):# 初始化鲸鱼位置whales=np.random.uniform(low=[b[0]forbinself.bounds],high=[b[1]forbinself.bounds],size=(self.n_whales,self.dim))fitness=np.array([self.obj_func(w)forwinwhales])best_idx=np.argmin(fitness)best_whale=whales[best_idx].copy()best_fitness=fitness[best_idx]fortinrange(self.max_iter):a=2-2*(t/self.max_iter)# 收敛因子foriinrange(self.n_whales):r1,r2=np.random.rand(),np.random.rand()A=2*a*r1-a C=2*r2ifnp.random.rand()<0.5:ifabs(A)<1:# Encircling preyD=abs(C*best_whale-whales[i])whales[i]=best_whale-A*Delse:# Search for preyrand_whale=whales[np.random.randint(self.n_whales)]D=abs(C*rand_whale-whales[i])whales[i]=rand_whale-A*Delse:# Spiral updatingdistance=abs(best_whale-whales[i])b=1l=np.random.uniform(-1,1)whales[i]=distance*np.exp(b*l)*np.cos(2*np.pi*l)+best_whale# 边界处理whales[i]=np.clip(whales[i],[b[0]forbinself.bounds],[b[1]forbinself.bounds])fitness[i]=self.obj_func(whales[i])# 更新全局最优best_idx=np.argmin(fitness)iffitness[best_idx]<best_fitness:best_whale=whales[best_idx].copy()best_fitness=fitness[best_idx]returnbest_whale,best_fitness# -----------------------------# 第四部分:CNN-LSTM 模型构建# -----------------------------defbuild_cnn_lstm_model(input_shape,output_steps=1,lstm_units=50,cnn_filters=32):""" 构建 CNN-LSTM 混合模型 :param input_shape: (time_steps, features) :param output_steps: 预测步数 :return: 编译好的 Keras 模型 """model=Sequential([# CNN 层提取局部特征Conv1D(filters=cnn_filters,kernel_size=3,activation='relu',input_shape=input_shape),MaxPooling1D(pool_size=2),Dropout(0.2),# LSTM 层捕捉长期依赖LSTM(lstm_units,return_sequences=False),Dropout(0.2),# 输出层Dense(output_steps)])model.compile(optimizer=Adam(learning_rate=0.001),loss='mse',metrics=['mae'])returnmodel# -----------------------------# 第五部分:主训练与预测流程# -----------------------------defmain():# ======================# 1. 加载数据(示例:使用合成数据)# ======================np.random.seed(42)# 生成一个带趋势和噪声的时间序列(模拟风电/负荷等)time=np.arange(0,1000)signal=10*np.sin(0.02*time)+0.5*time+np.random.normal(0,2,size=time.shape)data=signal.reshape(-1,1)# 单变量# 若有多变量,可扩展为:data = np.column_stack([signal, temp, wind_speed, ...])# ======================# 2. 参数配置# ======================LOOK_BACK=60# 输入时间步LOOK_FORWARD=1# 输出时间步(设为5可做5步预测)USE_VMD=True# 是否启用 VMD 分解OPTIMIZE_HYPER=True# 是否用 WOA 优化超参print(f"📊 数据形状:{data.shape}")print(f"🔧 配置: 输入步={LOOK_BACK}, 输出步={LOOK_FORWARD}, VMD={USE_VMD}, 超参优化={OPTIMIZE_HYPER}")# ======================# 3. VMD 分解(可选)# ======================ifUSE_VMDanddata.shape[1]==1:imfs=apply_vmd(data.flatten())ifimfsisnotNone:print(f"✅ VMD 分解为{imfs.shape[0]}个 IMF 分量")# 这里简化:只用第一个 IMF(高频)+ 原始信号data=np.column_stack([data,imfs[0]])# 扩展为多变量else:USE_VMD=False# ======================# 4. 数据归一化与划分# ======================data_scaled,scaler=normalize_data(data)X,y=create_dataset(data_scaled,LOOK_BACK,LOOK_FORWARD)# 划分训练/测试(8:2)split=int(0.8*len(X))X_train,X_test=X[:split],X[split:]y_train,y_test=y[:split],y[split:]print(f"📈 训练集: X={X_train.shape}, y={y_train.shape}")print(f"📉 测试集: X={X_test.shape}, y={y_test.shape}")# ======================# 5. 超参数优化(WOA)# ======================ifOPTIMIZE_HYPER:defobjective(params):"""目标函数:最小化验证集 MAE"""lstm_units=int(params[0])cnn_filters=int(params[1])batch_size=int(params[2])try:model=build_cnn_lstm_model(input_shape=(LOOK_BACK,X_train.shape[2]),output_steps=LOOK_FORWARD,lstm_units=lstm_units,cnn_filters=cnn_filters)model.fit(X_train,y_train,batch_size=batch_size,epochs=10,verbose=0,validation_split=0.2)y_pred=model.predict(X_test,verbose=0)mae=mean_absolute_error(y_test[:,0],y_pred[:,0])returnmaeexcept:return9999# 异常返回大值# 定义超参搜索空间bounds=[(32,128),# lstm_units(16,64),# cnn_filters(16,128)# batch_size]woa=WOA(objective,bounds,n_whales=5,max_iter=5)best_params,best_mae=woa.optimize()print(f"🎯 WOA 优化结果: LSTM={int(best_params[0])}, CNN={int(best_params[1])}, Batch={int(best_params[2])}")# 使用最优参数建模model=build_cnn_lstm_model(input_shape=(LOOK_BACK,X_train.shape[2]),output_steps=LOOK_FORWARD,lstm_units=int(best_params[0]),cnn_filters=int(best_params[1]))batch_size=int(best_params[2])else:model=build_cnn_lstm_model((LOOK_BACK,X_train.shape[2]),LOOK_FORWARD)batch_size=32# ======================# 6. 模型训练# ======================early_stop=EarlyStopping(monitor='val_loss',patience=10,restore_best_weights=True)history=model.fit(X_train,y_train,batch_size=batch_size,epochs=50,validation_split=0.2,callbacks=[early_stop],verbose=1)# ======================# 7. 预测与反归一化# ======================y_pred=model.predict(X_test,verbose=0)# 反归一化(仅对目标列)y_test_inv=scaler.inverse_transform(np.column_stack([y_test[:,0],np.zeros((len(y_test),data.shape[1]-1))]))[:,0]y_pred_inv=scaler.inverse_transform(np.column_stack([y_pred[:,0],np.zeros((len(y_pred),data.shape[1]-1))]))[:,0]# ======================# 8. 评估指标计算# ======================mae=mean_absolute_error(y_test_inv,y_pred_inv)mse=mean_squared_error(y_test_inv,y_pred_inv)rmse=np.sqrt(mse)mape=np.mean(np.abs((y_test_inv-y_pred_inv)/(y_test_inv+1e-8)))*100r2=r2_score(y_test_inv,y_pred_inv)print("\n"+"="*50)print("🔍 模型评估结果:")print(f" MAE :{mae:.4f}")print(f" MSE :{mse:.4f}")print(f" RMSE :{rmse:.4f}")print(f" MAPE :{mape:.2f}%")print(f" R² :{r2:.4f}")print("="*50)# ======================# 9. 结果可视化# ======================plt.figure(figsize=(14,6))plt.plot(y_test_inv[:200],label='真实值',color='blue')plt.plot(y_pred_inv[:200],label='预测值',color='red',linestyle='--')plt.title('LSTM-CNN 预测结果(前200步)')plt.xlabel('时间步')plt.ylabel('目标值')plt.legend()plt.grid(True)plt.tight_layout()plt.savefig('prediction_result.png',dpi=300)plt.show()# -----------------------------# 第六部分:程序入口# -----------------------------if__name__=="__main__":main()

🔧 三、使用说明

1.切换单/多变量
  • 单变量data = your_series.reshape(-1, 1)
  • 多变量data = np.column_stack([series1, series2, ...])
2.切换单/多步预测
  • 修改LOOK_FORWARD = 1(单步)或5(5步预测)
3.启用/禁用优化模块
  • USE_VMD = True/False
  • OPTIMIZE_HYPER = True/False(启用 WOA)
4.替换真实数据
# 示例:加载 CSVdf=pd.read_csv('your_data.csv')data=df[['target','feature1','feature2']].values# 多变量

📈 四、模型优势

模块作用
CNN-LSTMCNN 提取局部模式,LSTM 捕捉长期依赖
VMD分解非平稳信号,提升预测稳定性
WOA自动优化 LSTM 单元数、CNN 滤波器数、batch size
多步预测支持直接输出未来 N 步(非递归)

💡 五、扩展建议

  • 加入 SSA(麻雀搜索):替换 WOA 类,逻辑类似
  • 集成学习:对 VMD 各 IMF 分量分别建模,再加权融合
  • 不确定性量化:使用 Monte Carlo Dropout 输出预测区间

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 20:21:24

Java基于Spring Boot+Vue的学业导师管理系统的设计与实现

所需该项目可以在最下面查看联系方式&#xff0c;为防止迷路可以收藏文章&#xff0c;以防后期找不到 项目介绍 在当今高等教育体系中&#xff0c;本科生学业导师制度已成为提升教学质量、促进学生个性化发展的重要途径。然而&#xff0c;随着高校扩招和学生人数的激增&#…

作者头像 李华
网站建设 2026/8/8 15:44:15

亲测好用9个AI论文写作软件,专科生轻松搞定毕业论文!

亲测好用9个AI论文写作软件&#xff0c;专科生轻松搞定毕业论文&#xff01; 专科生的论文写作救星&#xff0c;AI 工具如何改变你的学习节奏&#xff1f; 在当今这个信息爆炸的时代&#xff0c;学术写作早已不再是少数人的专属。对于专科生而言&#xff0c;撰写一篇合格的毕业…

作者头像 李华
网站建设 2026/7/29 1:34:50

专精特新小巨人发展,为何必须依靠外脑?又该找谁?

专精特新小巨人发展&#xff0c;为何必须依靠外脑&#xff1f;又该找谁&#xff1f;专精特新小巨人企业正站在发展的关键节点&#xff1a;一方面拥有核心技术优势&#xff0c;另一方面却面临从“技术冠军”向“生态领袖”跃迁的复杂挑战。在这个阶段&#xff0c;仅靠企业内部力…

作者头像 李华
网站建设 2026/8/6 7:58:19

成都余行专利代理事务所:专精特新企业知识产权全流程战略护航专家

成都余行专利代理事务所&#xff1a;专精特新企业知识产权全流程战略护航专家 在专精特新企业的发展征程中&#xff0c;知识产权不仅是技术创新的保护伞&#xff0c;更是企业构建核心竞争力和生态话语权的战略武器。然而&#xff0c;专利工作绝非简单的“申请-授权”线性流程&…

作者头像 李华
网站建设 2026/8/8 22:13:59

余行补位方法论:同步提升市场竞争力与专利授权率的双核引擎

余行补位方法论&#xff1a;同步提升市场竞争力与专利授权率的双核引擎在专精特新企业的发展实践中&#xff0c;市场竞争力与专利授权率常常被视为两个独立的目标&#xff1a;前者关乎商业成功&#xff0c;后者关乎法律保护。然而&#xff0c;成都专知利乎数字科技有限公司提出…

作者头像 李华
网站建设 2026/8/9 22:22:28

【收藏必看】告别提示词地狱!技能工程引领AI开发新范式

Agent Skills技术正引领AI开发从"提示词博弈"向标准化"技能工程"转变。这种可移植技能包通过三层结构&#xff08;核心定义层、执行支撑层、资源依赖层&#xff09;将专业开发流程标准化&#xff0c;已在Gemini CLI、Antigravity IDE等主流开发工具中实现落…

作者头像 李华