news 2026/5/30 11:21:55

Python实现基于GA -FCM遗传算法(GA)优化FCM模糊C均值聚类进行多变量时间序列预测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python实现基于GA -FCM遗传算法(GA)优化FCM模糊C均值聚类进行多变量时间序列预测

以下是一个完整的 Python 实现:基于遗传算法(GA)优化模糊 C 均值聚类(FCM)的多变量时间序列预测模型。该方法结合:

  • FCM 聚类:对历史时间序列模式进行软聚类,提取典型模式;
  • 遗传算法(GA):自动优化 FCM 的关键参数(如聚类数 (c)、模糊指数 (m))以及预测模型的超参数;
  • 模式匹配 + 加权预测:利用聚类中心进行未来值预测。

✅ 适用于电力负荷、光伏功率、交通流量等多变量时间序列
✅ 提供端到端可运行代码(含模拟数据)
✅ 使用skfuzzy(scikit-fuzzy)和DEAP(GA 库)


📦 依赖库安装

pipinstallnumpy pandas scikit-fuzzy deap matplotlib scikit-learn

🧠 方法原理简述

  1. 滑动窗口构造样本:将多变量时间序列转为监督学习格式。
  2. FCM 聚类:对历史样本(输入窗口)进行聚类,得到 (c) 个聚类中心。
  3. 预测机制
    • 对新输入窗口,计算其到各聚类中心的隶属度;
    • 用隶属度加权对应“未来输出”的平均值作为预测。
  4. GA 优化目标
    • 决策变量:聚类数 (c \in [2,10]),模糊指数 (m \in [1.1, 5.0])
    • 目标函数:验证集上的均方误差(MSE)

📜 完整 Python 源码

importnumpyasnpimportpandasaspdfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportmean_squared_errorimportskfuzzyasfuzzfromdeapimportbase,creator,tools,algorithmsimportrandomimportmatplotlib.pyplotasplt# ----------------------------# 1. 数据生成(可替换为真实数据)# ----------------------------defgenerate_multivariate_time_series(n_samples=1000):t=np.arange(n_samples)# 多变量:温度、湿度、风速、负荷(目标)temp=20+10*np.sin(2*np.pi*t/24)+np.random.normal(0,1,n_samples)humidity=60+20*np.cos(2*np.pi*t/24)+np.random.normal(0,3,n_samples)wind=5+3*np.sin(2*np.pi*t/12)+np.random.normal(0,0.5,n_samples)load=(temp*0.8+humidity*(-0.2)+wind*(-0.5)+50*np.sin(2*np.pi*t/24)+np.random.normal(0,2,n_samples))load=np.clip(load,0,None)# 负荷非负returnnp.column_stack([temp,humidity,wind,load])# ----------------------------# 2. 构造监督学习数据集# ----------------------------defcreate_dataset(data,lookback,horizon=1):X,Y=[],[]foriinrange(len(data)-lookback-horizon+1):X.append(data[i:i+lookback].flatten())# 展平多变量窗口Y.append(data[i+lookback:i+lookback+horizon,-1])# 预测最后一列(负荷)returnnp.array(X),np.array(Y).squeeze()# ----------------------------# 3. FCM 预测器类# ----------------------------classFCMForecaster:def__init__(self,c,m,lookback,n_features):self.c=int(c)self.m=m self.lookback=lookback self.n_features=n_features self.centers_=Noneself.future_means_=Nonedeffit(self,X_train,Y_train):# X_train: [N, lookback * n_features]# 执行 FCM 聚类cntr,u,_,_,_,_,_=fuzz.cmeans(data=X_train.T,c=self.c,m=self.m,error=1e-5,maxiter=1000,init=None)self.centers_=cntr# [c, D]# 计算每个簇对应的未来值均值future_means=np.zeros(self.c)foriinrange(self.c):# 隶属度 > 0.5 视为属于该簇(或加权平均)weights=u[i,:]ifnp.sum(weights)>1e-6:future_means[i]=np.average(Y_train,weights=weights)else:future_means[i]=np.mean(Y_train)self.future_means_=future_meansdefpredict(self,X_test):# 计算测试样本到各中心的隶属度u,_,_,_,_,_=fuzz.cmeans_predict(test_data=X_test.T,cntr_trained=self.centers_,m=self.m,error=1e-5,maxiter=1000)# 加权预测pred=np.dot(u.T,self.future_means_)returnpred# ----------------------------# 4. GA 评估函数# ----------------------------defevaluate_ga(individual,X_train,Y_train,X_val,Y_val,lookback,n_features):c,m=individual c=int(round(c))c=max(2,min(10,c))# 约束聚类数m=max(1.1,min(5.0,m))try:model=FCMForecaster(c=c,m=m,lookback=lookback,n_features=n_features)model.fit(X_train,Y_train)y_pred=model.predict(X_val)mse=mean_squared_error(Y_val,y_pred)return(mse,)exceptExceptionase:return(float('inf'),)# ----------------------------# 5. 主程序# ----------------------------if__name__=="__main__":# --- 数据准备 ---data=generate_multivariate_time_series(1200)lookback=24# 使用前24小时预测下一小时X,Y=create_dataset(data,lookback,horizon=1)# 划分训练/验证/测试split1=int(0.7*len(X))split2=int(0.85*len(X))X_train,Y_train=X[:split1],Y[:split1]X_val,Y_val=X[split1:split2],Y[split1:split2]X_test,Y_test=X[split2:],Y[split2:]# 标准化(仅对输入X)scaler_X=StandardScaler()X_train=scaler_X.fit_transform(X_train)X_val=scaler_X.transform(X_val)X_test=scaler_X.transform(X_test)n_features=data.shape[1]# --- GA 设置 ---creator.create("FitnessMin",base.Fitness,weights=(-1.0,))creator.create("Individual",list,fitness=creator.FitnessMin)toolbox=base.Toolbox()toolbox.register("c",random.randint,2,10)toolbox.register("m",random.uniform,1.1,5.0)toolbox.register("individual",tools.initCycle,creator.Individual,(toolbox.c,toolbox.m),n=1)toolbox.register("population",tools.initRepeat,list,toolbox.individual)# 评估函数绑定数据toolbox.register("evaluate",evaluate_ga,X_train=X_train,Y_train=Y_train,X_val=X_val,Y_val=Y_val,lookback=lookback,n_features=n_features)toolbox.register("mate",tools.cxBlend,alpha=0.5)toolbox.register("mutate",tools.mutGaussian,mu=0,sigma=0.5,indpb=0.2)toolbox.register("select",tools.selTournament,tournsize=3)# --- 运行 GA ---pop=toolbox.population(n=20)hof=tools.HallOfFame(1)stats=tools.Statistics(lambdaind:ind.fitness.values)stats.register("avg",np.mean)stats.register("min",np.min)print("🚀 开始遗传算法优化 FCM 参数...")algorithms.eaSimple(pop,toolbox,cxpb=0.7,mutpb=0.2,ngen=15,stats=stats,halloffame=hof,verbose=True)best_c,best_m=hof[0]best_c=int(round(best_c))best_m=max(1.1,min(5.0,best_m))print(f"\n✅ 最优参数: c={best_c}, m={best_m:.2f}")# --- 最终模型训练与测试 ---final_model=FCMForecaster(c=best_c,m=best_m,lookback=lookback,n_features=n_features)final_model.fit(X_train,Y_train)y_pred_test=final_model.predict(X_test)test_mse=mean_squared_error(Y_test,y_pred_test)test_mae=np.mean(np.abs(Y_test-y_pred_test))print(f"\n📊 测试集性能:")print(f" MSE ={test_mse:.4f}")print(f" MAE ={test_mae:.4f}")# --- 可视化 ---plt.figure(figsize=(12,5))plt.plot(Y_test[:200],label='Actual',linewidth=1.5)plt.plot(y_pred_test[:200],'--',label='Predicted (GA-FCM)',linewidth=1.5)plt.title(f'GA-FCM Time Series Prediction (MAE={test_mae:.2f})')plt.xlabel('Time Step')plt.ylabel('Target Value')plt.legend()plt.grid(True)plt.tight_layout()plt.show()

🔍 关键说明

1.为什么用 FCM 做预测?

  • FCM 提供软聚类,每个样本属于多个模式,适合时间序列的模糊性;
  • 聚类中心代表“典型历史模式”,其对应的未来值可作为预测依据。

2.GA 优化什么?

  • 聚类数 (c):太少欠拟合,太多过拟合;
  • 模糊指数 (m):控制隶属度模糊程度((m \to 1):硬聚类;(m \to \infty):均匀隶属)。

3.预测机制细节

  • 训练时:记录每个簇的未来值加权平均
  • 预测时:用新样本的隶属度加权这些平均值。

4.局限性与改进方向

问题改进方案
仅用聚类中心,忽略时序动态结合 LSTM/Transformer 提取特征后再聚类
预测单步扩展为多步(递归预测或 seq2seq)
无不确定性量化输出隶属度作为置信度

📚 参考文献

  1. Bezdek, J. C. (1981).Pattern Recognition with Fuzzy Objective Function Algorithms.
  2. Goldberg, D. E. (1989).Genetic Algorithms in Search, Optimization, and Machine Learning.
  3. Chen, Y., et al. (2020).Short-term load forecasting using FCM and GA. Energy Reports.

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

移动应用UI测试性能基准实战指南:效率翻倍不是梦

移动应用UI测试性能基准实战指南:效率翻倍不是梦 【免费下载链接】maestro Painless Mobile UI Automation 项目地址: https://gitcode.com/gh_mirrors/ma/maestro 想要让你的移动应用UI测试跑得飞快又稳定可靠?性能基准建立就是你的秘密武器。在…

作者头像 李华
网站建设 2026/5/29 19:19:51

Feast特征存储终极指南:从入门到生产部署的完整实践

Feast特征存储终极指南:从入门到生产部署的完整实践 【免费下载链接】feast Feature Store for Machine Learning 项目地址: https://gitcode.com/GitHub_Trending/fe/feast Feast是一个开源的机器学习特征存储平台,专为现代数据团队设计&#xf…

作者头像 李华
网站建设 2026/5/30 10:41:03

Git版本控制在测试项目管理中的应用

在当今快速迭代的软件开发环境中,软件测试已成为确保产品稳定性和用户满意度的核心环节。测试项目管理涉及测试用例设计、脚本编写、环境配置以及缺陷跟踪等多个方面,任何变更的失控都可能导致测试覆盖不全或回归错误。Git,作为业界领先的版本…

作者头像 李华
网站建设 2026/5/29 20:55:12

终极BERT安装配置指南:从零开始快速上手

终极BERT安装配置指南:从零开始快速上手 【免费下载链接】bert TensorFlow code and pre-trained models for BERT 项目地址: https://gitcode.com/gh_mirrors/be/bert BERT(双向编码器表示转换器)是Google推出的革命性自然语言处理模…

作者头像 李华
网站建设 2026/5/29 19:55:57

Zephyr RTOS实战:30分钟打造多功能USB复合设备

Zephyr RTOS实战:30分钟打造多功能USB复合设备 【免费下载链接】zephyr Primary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures. 项目地址: https://gitcode.com/G…

作者头像 李华