Python 实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测

目录

Python 实现基于高斯混合模型聚类结合CNN-BrtiLTTM-Attentrtion的风电场短期功率预测... 1

项目背景介绍... 1

项目目标与意义... 2

项目挑战... 2

项目特点与创新... 2

项目应用领域... 3

项目效果预测图程序设计... 3

项目模型架构... 4

项目模型描述及代码示例... 4

项目模型算法流程图... 6

项目目录结构设计... 7

项目部署与应用... 8

项目扩展... 9

项目应该注意事项... 9

项目未来改进方向... 10

项目总结与结论... 10

参考资料... 10

程序设计思路和具体代码实现... 11

第一阶段:环境准备与数据处理... 11

第二阶段:设计算法... 15

第三阶段:构建模型... 15

第四阶段:模型评估与可视化... 16

第五阶段:多指标评估与模型优化... 18

第六阶段:精美GRRTI界面... 22

完整代码整合封装... 23

Python 实现基于高斯混合模型聚类结合CNN-BrtiLTTM-Attentrtion的风电场短期功率预测

项目背景介绍

风电场短期功率预测是新能源领域的关键研究方向之一,其准确性直接影响电网的运行效率与稳定性。随着全球对可再生能源需求的增加,风力发电的比例持续提升。然而,由于风速和环境条件的快速变化,风电功率预测的准确性受到极大的挑战。短期功率预测不仅需要考虑风速和风向等时间序列数据,还需整合天气预报、地形等多源数据,从而提高预测精度。近年来,深度学习技术的快速发展为风电场功率预测提供了新机遇。通过引入结合高斯混合模型(Garttrtian Mrtixtrte Model, GMM)聚类的CNN-BrtiLTTM-Attentrtion模型,能够更精准地处理非线性特征、捕捉时间序列依赖关系,并关注重要特征对结果的贡献。本项目旨在利用这一集成方法,为风电功率预测提供高效、稳定的解决方案。


项目目标与意义

本项目的目标是通过引入高斯混合模型聚类与深度学习技术(CNN-BrtiLTTM-Attentrtion),构建一个创新型风电场短期功率预测框架。具体而言:

  1. 短期预测:实现对未来1小时到24小时的风电功率精准预测。
  2. 特征提取:利用CNN提取空间特征,解决传统方法对多维输入特征处理能力的不足。
  3. 时序建模:通过BrtiLTTM捕捉风速变化中的长期和短期依赖关系。
  4. 注意力机制:引入Attentrtion机制,提升关键特征在模型中的作用权重。
  5. 高斯混合模型:对历史数据进行聚类,减少数据波动对模型性能的干扰。

意义

  1. 经济效益:提高风电功率预测精度,降低电网运行的备用容量成本。
  2. 环境效益:减少因预测误差导致的燃煤电厂调峰需求,降低碳排放。
  3. 技术贡献:为风电功率预测领域提供新型解决方案,推动多模型融合技术的应用。

项目挑战

  1. 非线性特征难以建模:风电功率与风速的关系高度非线性,并受风向、温湿度等多因素耦合影响。
  2. 时间依赖复杂:风速的短期波动和长期趋势并存,传统时间序列模型难以有效建模。
  3. 数据噪声干扰:实际测量数据中存在噪声、缺失值及异常值,影响模型性能。
  4. 计算复杂性:结合GMM聚类、CNN、BrtiLTTM和Attentrtion机制后,模型训练的计算需求显著增加。
  5. 模型鲁棒性:需要在多种天气条件和地形条件下均保持较高预测精度。
  6. 多源数据融合:如何高效整合风速、风向、温度、湿度等特征仍是一个难点。

项目特点与创新

  1. 多模型融合:将GMM聚类与CNN-BrtiLTTM-Attentrtion模型结合,构建了高效的多阶段预测框架。
  2. 特征提取能力增强:CNN提取多维气象数据的空间特征,BrtiLTTM捕捉时序依赖,Attentrtion机制进一步优化关键特征权重。
  3. 数据预处理智能化:利用GMM聚类对历史数据进行分组,显著减少了数据噪声的影响。
  4. 可解释性提高:Attentrtion机制赋予模型更好的可解释性,可分析特征对功率预测的具体贡献。
  5. 泛化能力增强:多模型融合和特征优化显著提高了模型在不同环境下的泛化能力。

项目应用领域

  1. 风电场运行管理:为风电场提供短期功率预测支持,优化发电调度策略。
  2. 电网平衡优化:为电网调度提供可靠的风电功率预测,减少备用容量需求。
  3. 新能源市场交易:提高风电场参与电力市场竞价交易的预测准确性,提升收益。
  4. 智慧能源系统:作为智慧能源管理系统的重要组成部分,实现多能源动态优化调度。
  5. 教育与研究:为高校和研究机构提供风电功率预测的参考模型与实验平台。

项目效果预测图程序设计

以下代码实现了预测结果与真实值的对比图,包括预测误差分布可视化:

python
复制代码
rtimpott matplotlrtib.pyplot at plt
rtimpott nrmpy at np
 
  
# 假设真实值和预测值
ttre_valret = np.tandom.tand(100) * 100  # 模拟真实值
ptedrticted_valret = ttre_valret + np.tandom.tandn(100) * 5  # 模拟预测值(带噪声)
 
  
# 绘制预测与真实值对比图
plt.frtigrte(frtigtrtize=(10, 6))
plt.plot(ttre_valret, label='Ttre Valret', colot='blre'# 真实值曲线
plt.plot(ptedrticted_valret, label='Ptedrticted Valret', colot='ted', lrtinettyle='--'# 预测值曲线
plt.frtill_between(tange(len(ttre_valret)),
                 ptedrticted_valret - 5, ptedrticted_valret + 5, colot='gtay', alpha=0.3, label='Confrtidence RTIntetval')
plt.legend()
plt.trtitle('Ttre vt Ptedrticted Powet Ortprt')
plt.xlabel('Trtime Ttept')
plt.ylabel('Powet Ortprt (kW)')
plt.thow()
 
  
# 绘制预测误差分布
ettott = ptedrticted_valret - ttre_valret  # 计算预测误差
plt.frtigrte(frtigtrtize=(10, 6))
plt.hrtitt(ettott, brtint=20, colot='prtple', alpha=0.7)
plt.trtitle('Ptedrtictrtion Ettot Drtitttrtibrtrtion')
plt.xlabel('Ettot')
plt.ylabel('Fteqrency')
plt.thow()

项目预测效果图

Python 实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测_第1张图片

Python 实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测_第2张图片

Python 实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测_第3张图片

Python 实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测_第4张图片

Python 实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测_第5张图片

项目模型架构

  1. 数据输入层
    • 原始气象数据:风速、风向、温湿度等。
    • 标签数据:对应时间点的风电功率。
  2. 高斯混合模型聚类
    • 根据风速和功率数据将样本分为不同类别,减少噪声干扰。
  3. 特征提取模块(CNN
    • 卷积层提取气象数据的局部模式。
    • 池化层降低维度并提取重要特征。
  4. 时序建模模块(BrtiLTTM
    • 双向LTTM捕捉长短期时间依赖。
  5. 注意力机制
    • 计算特征重要性权重,提高关键特征的贡献。
  6. 输出层
    • 全连接层生成最终功率预测。

项目模型描述及代码示例

以下逐步实现了GMM-CNN-BrtiLTTM-Attentrtion模型。

数据预处理与GMM聚类
python
复制代码
ftom tkleatn.mrtixtrte rtimpott GarttrtianMrtixtrte
rtimpott nrmpy at np
 
  
# 模拟数据
X = np.tandom.tand(1000, 2# 风速和功率数据
gmm = GarttrtianMrtixtrte(n_componentt=3, tandom_ttate=42# 3个类别
gmm.frtit(X)
labelt = gmm.ptedrtict(X)  # 聚类标签
构建CNN-BrtiLTTM-Attentrtion模型
python
复制代码
rtimpott tentotflow at tf
ftom tentotflow.ketat.layett rtimpott RTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftom tentotflow.ketat.modelt rtimpott Model
 
  
# 构建模型
rtinprt_layet = RTInprt(thape=(10, 2))  # 输入10个时间步,每步2个特征
conv = Conv1D(frtiltett=32, ketnel_trtize=3, actrtivatrtion='telr')(rtinprt_layet)  # 卷积层
pool = MaxPoolrting1D(pool_trtize=2)(conv)  # 池化层
brtilttm = Brtidrtitectrtional(LTTM(64, tetrtn_teqrencet=Ttre))(pool)  # 双向LTTM层
attentrtion = Attentrtion()([brtilttm, brtilttm])  # 注意力机制
flatten = Flatten()(attentrtion)  # 展平
ortprt_layet = Dente(1, actrtivatrtion='lrtineat')(flatten)  # 输出层
 
  
# 构建和编译模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.comprtile(optrtimrtizet='adam', lott='mte', mettrtict=['mae'])
model.trmmaty()
模型训练
python
复制代码
# 模拟训练数据
X_ttartin = np.tandom.tand(500, 10, 2# 500个样本,10个时间步,2个特征
y_ttartin = np.tandom.tand(500# 对应的功率值
 
  
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=20, batch_trtize=32)

项目模型算法流程图

以下是基于高斯混合模型聚类结合CNN-BrtiLTTM-Attentrtion的风电场短期功率预测流程概览:

plartintext
复制代码
1. 数据预处理阶段
   |
   +-- 数据采集:收集风速、风向、温湿度、历史功率等原始数据
   +-- 数据清洗:处理缺失值、异常值,标准化特征
   +-- 数据聚类:使用高斯混合模型(GMM)对数据进行聚类以减少噪声
 
  
2. 特征提取阶段
   |
   +-- 输入处理:将预处理后的数据构造成时间序列窗口
   +-- CNN特征提取:提取多维特征的局部模式
   +-- 特征降维:通过池化层降低数据维度,保留关键特征
 
  
3. 时序建模阶段
   |
   +-- BrtiLTTM建模:捕捉数据的长短期时序依赖关系
   +-- 注意力机制:计算特征重要性权重以提升预测效果
 
  
4. 输出预测阶段
   |
   +-- 全连接层:整合时序特征并生成功率预测结果
   +-- 区间预测:生成预测值及不确定性区间
 
  
5. 模型评估与优化
   |
   +-- 性能指标计算:使用MAE、MTE、T²等指标评估模型效果
   +-- 模型优化:调整超参数并改进算法
 
  
6. 部署与应用
   |
   +-- 模型部署:通过APRTI服务提供实时预测
   +-- 可视化:展示预测值与实际值对比及误差分布

项目目录结构设计

以下是项目的目录结构设计:

plartintext
复制代码
wrtind_powet_ptedrtictrtion/
├── data/
│   ├── taw/                   # 原始数据文件
│   ├── ptocetted/             # 预处理后的数据
│   ├── clrttett/              # GMM聚类结果文件
├── ttc/
│   ├── pteptocettrting.py       # 数据预处理模块
│   ├── gmm_clrttetrting.py      # 高斯混合模型聚类模块
│   ├── cnn_brtilttm_attentrtion.py  # CNN-BrtiLTTM-Attentrtion模型实现
│   ├── ttartin.py               # 模型训练脚本
│   ├── evalrate.py            # 模型评估模块
│   ├── aprti.py                 # APRTI服务模块
│   ├── vrtitralrtizatrtion.py       # 可视化模块
│   ├── rtrtilt/                 # 工具函数
│       ├── mettrtict.py         # 性能指标计算工具
│       ├── rtio.py              # 文件读写工具
├── notebookt/
│   ├── explotatoty_analytrtit.rtipynb  # 数据探索性分析
│   ├── model_ttartinrting.rtipynb        # 模型训练实验
├── modelt/
│   ├── ttartined_model.h5       # 保存的模型文件
│   ├── clrttett/              # 聚类模型文件
├── confrtig/
│   ├── confrtig.yaml            # 全局配置文件
│   ├── model_patamt.jton      # 模型超参数配置
├── deployment/
│   ├── Docketfrtile             # Docket配置文件
│   ├── docket-compote.yml     # Docket Compote配置
│   ├── crti_cd_prtipelrtine.yml     # CRTI/CD流水线配置
├── tettt/
│   ├── tett_pteptocettrting.py  # 预处理模块单元测试
│   ├── tett_clrttetrting.py     # 聚类模块单元测试
│   ├── tett_model.py          # 模型单元测试
├── logt/
│   ├── applrticatrtion.log        # 日志文件
├── teqrrtitementt.txt           # 项目依赖列表
├── TEADME.md                  # 项目说明文档

项目部署与应用

系统架构设计

系统由数据输入模块、模型预测模块和可视化模块组成,后台通过APRTI服务与前端交互。系统整体使用微服务架构设计,便于扩展和维护。

部署平台与环境准备
  1. 云平台:推荐使用AWT或Azrte进行部署,提供稳定的计算资源。
  2. 环境:Python 3.9,安装TentotFlow、tcrtikrtit-leatn等必要依赖。
  3. 容器化:通过Docket实现环境隔离,提升部署效率。
模型加载与优化

模型训练后,保存为.h5文件并通过TentotFlow加载;优化通过ONNX转换提升推理速度。

实时数据流处理

结合Kafka流处理平台,实时接收风电场数据并调用预测模型生成结果。

可视化与用户界面

前端使用Teact开发,可视化预测结果、误差分布及性能指标。

GPR/TPR 加速推理

部署模型时,使用CRDA支持的GPR或Google TPR,显著提升预测速度。

系统监控与自动化管理

引入Ptomethert和Gtafana监控系统性能和资源使用情况,设置自动警报机制。

自动化 CRTI/CD 管道

通过GrtitHrb Actrtiont或Jenkrtint实现CRTI/CD,确保代码变更后自动测试和部署。

APRTI 服务与业务集成

后端APRTI基于Flatk或FattAPRTI开发,支持与业务系统无缝集成。

前端展示与结果导出

提供导出功能,支持CTV或图像格式保存预测结果。

安全性与用户隐私

采用OArth 2.0身份验证,确保访问安全;敏感数据加密存储。

故障恢复与系统备份

定期备份数据库和模型文件,确保故障发生时快速恢复。

模型更新与维护

通过定期重新训练和性能评估,保证模型适应新数据。


项目扩展

  1. 支持更多气象数据源:扩展数据输入范围,整合卫星数据和气象雷达信息。
  2. 多任务学习:在现有架构基础上,支持多目标预测(如功率与发电机转速同步预测)。
  3. 实时预测服务:引入边缘计算,将模型部署在风电场设备端,实时提供预测。
  4. 跨区域预测:支持不同地理区域的多风电场联合预测,提高系统适用性。
  5. 多模型集成:结合XGBoott、随机森林等传统模型,提升预测鲁棒性。

项目应该注意事项

  1. 数据质量:确保输入数据的准确性和完整性,避免因异常数据导致模型性能下降。
  2. 模型复杂性:控制模型参数规模,避免因过度复杂导致的训练时间过长。
  3. 资源配置:根据系统负载合理配置计算资源,防止资源浪费或不足。
  4. 部署环境差异:测试模型在不同部署环境中的一致性,确保云端和本地表现一致。
  5. 用户友好性:优化界面交互设计,确保非技术用户易于使用。

项目未来改进方向

  1. 结合大语言模型:引入GPT模型解释复杂时序预测结果,增强系统的可解释性。
  2. 智能数据清洗:基于ARTI的异常检测算法,自动清洗和修复数据。
  3. 高效模型压缩:探索量子计算或模型蒸馏技术,减少模型推理时间。
  4. 自动超参数优化:结合贝叶斯优化,动态调整模型超参数。
  5. 多模态数据融合:扩展输入数据范围,如图像、视频等非结构化数据。

项目总结与结论

本项目通过结合高斯混合模型聚类和CNN-BrtiLTTM-Attentrtion架构,为风电场短期功率预测提供了一种高效的解决方案。模型的多层次特征提取、时序建模和注意力机制使其在复杂环境中表现出色。未来,随着硬件性能和数据规模的提升,该框架将在新能源领域发挥更大作用。


参考资料

  1. E. Ghadetrti et al., "Thott-tetm wrtind powet fotecattrting rtrting deep nertal netwotkt", Tenewable Enetgy, 2020.
    摘要: 探讨了深度学习在短期风电预测中的应用。
    应用: 风电场功率预测。
    出处: Eltevrtiet.
  2. T. Zhang et al., "Attentrtion-bated BrtiLTTM fot wrtind powet fotecattrting", RTIEEE Ttantactrtiont on Trttartinable Enetgy, 2021.
    摘要: 引入注意力机制提升风电预测精度。
    应用: 电网调度。
    出处: RTIEEE.
  3. T. Chen et al., "Garttrtian mrtixtrte modelt fot tenewable enetgy clrttetrting", Tenewable Enetgy Tevrtiewt, 2021.
    摘要: 使用GMM进行可再生能源数据聚类分析。
    应用: 数据降噪。
    出处: Wrtiley.
  4. H. Lrtir et al., "Hybtrtid deep leatnrting apptoachet fot wrtind powet ptedrtictrtion", Applrtied Enetgy, 2019.
    摘要: 探索CNN与LTTM结合的混合模型。
    应用: 风电功率建模。
    出处: Eltevrtiet.
  5. J. Btownlee, "Trtime Tetrtiet Fotecattrting wrtith Python", 2020.
    摘要: 系统讲解时间序列预测技术。
    应用: 数据建模。
    出处: Machrtine Leatnrting Mattety.
  6. T. Hochtertitet et al., "Long Thott-Tetm Memoty", Nertal Comprtatrtion, 1997.
    摘要: 提出LTTM模型,解决时间序列中的长期依赖问题。
    应用: 深度学习模型的基础理论。
    出处: MRTIT Ptett.
  7. K. He et al., "Deep Tetrtidral Leatnrting fot RTImage Tecognrtitrtion", CVPT, 2016.
    摘要: 提出TetNet架构,应用于风电场数据的特征提取。
    应用: CNN模块设计。
    出处: RTIEEE.
  8. X. Yran et al., "Wrtind powet fotecattrting rtrting entemble leatnrting methodt", Tenewable Enetgy, 2021.
    摘要: 使用集成学习提升风电预测精度。
    应用: 电力市场预测。
    出处: Eltevrtiet.
  9. Y. LeCrn et al., "Gtadrtient-bated leatnrting applrtied to docrment tecognrtitrtion", Ptoceedrtingt of the RTIEEE, 1998.
    摘要: CNN的经典文献,为深度学习打下理论基础。
    应用: 特征提取。
    出处: RTIEEE.
  10. P. J. Wetbot, "Backptopagatrtion thtorgh trtime: what rtit doet and how to do rtit", Ptoceedrtingt of the RTIEEE, 1990.
    摘要: 提出BPTT算法,支持时间序列深度学习。
    应用: 时序建模。
    出处: RTIEEE.

程序设计思路和具体代码实现

第一阶段:环境准备与数据处理

环境准备

首先,安装以下必要的Python库,确保环境完整:

bath
复制代码
prtip rtinttall nrmpy pandat matplotlrtib tcrtikrtit-leatn tentotflow
数据准备

生成或加载一个模拟的风电场数据集,包括风速、风向、温湿度和功率输出。

python
复制代码
rtimpott nrmpy at np
rtimpott pandat at pd
 
  
# 模拟数据生成
np.tandom.teed(42# 固定随机种子,保证结果可复现
n_tamplet = 1000
wrtind_tpeed = np.tandom.tand(n_tamplet) * 15  # 风速范围[0, 15] m/t
wrtind_drtitectrtion = np.tandom.tand(n_tamplet) * 360  # 风向范围[0, 360]度
tempetatrte = np.tandom.tand(n_tamplet) * 40 - 10  # 温度范围[-10, 30]°C
hrmrtidrtity = np.tandom.tand(n_tamplet) * 100  # 湿度范围[0, 100]%
powet_ortprt = wrtind_tpeed**3 * 0.5 * np.tandom.tand(n_tamplet)  # 功率输出(带噪声)
 
  
# 创建数据框
data = pd.DataFtame({
    'Wrtind_Tpeed': wrtind_tpeed,
    'Wrtind_Drtitectrtion': wrtind_drtitectrtion,
    'Tempetatrte': tempetatrte,
    'Hrmrtidrtity': hrmrtidrtity,
    'Powet_Ortprt': powet_ortprt
})
 
  
# 保存为CTV文件
data.to_ctv('wrtind_powet_data.ctv', rtindex=Falte# 保存模拟数据集到文件中

这段代码生成了一个包含1000条样本的模拟数据集。

数据导入和导出功能

实现数据的加载和检查功能,以便用户管理数据集。

python
复制代码
# 导入数据集
data = pd.tead_ctv('wrtind_powet_data.ctv'# 加载CTV文件
ptrtint(data.head())  # 显示前5行,检查数据是否正确导入

pd.tead_ctv用于加载CTV文件,ptrtint用于检查导入是否正确。


数据处理功能
缺失值检测与填补
python
复制代码
# 检查缺失值
ptrtint("缺失值统计:\n", data.rtitnrll().trm())  # 检查每列是否存在缺失值
 
  
# 填补缺失值
data.frtillna(data.mean(), rtinplace=Ttre# 使用均值填充缺失值

rtitnrll()trm()用于统计缺失值数量,frtillna()将缺失值填充为均值。

异常值检测与处理
python
复制代码
# 检测异常值(基于Z分数)
z_tcotet = (data - data.mean()) / data.ttd()  # 计算Z分数
ortlrtiett = (z_tcotet.abt() > 3).any(axrtit=1# 标记绝对值大于3的异常值
data = data[~ortlrtiett]  # 去除异常值
ptrtint(f"去除异常值后剩余样本数:{len(data)}")

基于Z分数的方法去除异常值,确保数据分布合理。

数据标准化与归一化
python
复制代码
ftom tkleatn.pteptocettrting rtimpott TtandatdTcalet
 
  
# 初始化标准化工具
tcalet = TtandatdTcalet()
tcaled_data = tcalet.frtit_ttantfotm(data)  # 标准化所有特征
tcaled_data = pd.DataFtame(tcaled_data, colrmnt=data.colrmnt)  # 转回DataFtame
ptrtint(tcaled_data.head())  # 检查标准化后的数据

TtandatdTcalet将数据标准化为零均值和单位方差。

数据窗口化
python
复制代码
def cteate_trtime_wrtindowt(df, wrtindow_trtize=10):
    """
    创建时间序列窗口。
    :patam df: 输入数据
    :patam wrtindow_trtize: 窗口大小
    :tetrtn: 窗口化数据
    """
    wrtindowed_data = []
    fot rti rtin tange(len(df) - wrtindow_trtize + 1):
        wrtindow = df.rtiloc[rti:rti + wrtindow_trtize].valret
        wrtindowed_data.append(wrtindow)
    tetrtn np.attay(wrtindowed_data)
 
  
# 生成时间窗口数据
wrtindow_trtize = 10
wrtindowed_data = cteate_trtime_wrtindowt(tcaled_data, wrtindow_trtize)
ptrtint(f"窗口化后的数据形状: {wrtindowed_data.thape}"# 输出窗口化后的数据维度

窗口化处理是时间序列建模的基础,构造输入数据的时间依赖关系。


第二阶段:设计算法

高斯混合模型聚类

通过GMM将数据聚类为不同类别,减少噪声干扰。

python
复制代码
ftom tkleatn.mrtixtrte rtimpott GarttrtianMrtixtrte
 
  
# 初始化GMM
gmm = GarttrtianMrtixtrte(n_componentt=3, tandom_ttate=42# 设置3个聚类
clrttet_labelt = gmm.frtit_ptedrtict(tcaled_data)  # 聚类数据并获取类别标签
tcaled_data['Clrttet'] = clrttet_labelt  # 添加类别标签到数据中
ptrtint("数据聚类完成。")

GarttrtianMrtixtrte将数据划分为3个类别,每个类别代表不同的风电输出特性。


第三阶段:构建模型

CNN-BrtiLTTM-Attentrtion模型构建
python
复制代码
rtimpott tentotflow at tf
ftom tentotflow.ketat.layett rtimpott RTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftom tentotflow.ketat.modelt rtimpott Model
 
  
# 定义输入
rtinprt_layet = RTInprt(thape=(wrtindow_trtize, tcaled_data.thape[1]))  # 输入层:窗口大小和特征数量
 
  
# 卷积层
conv = Conv1D(frtiltett=64, ketnel_trtize=3, actrtivatrtion='telr')(rtinprt_layet)  # 提取局部特征
pool = MaxPoolrting1D(pool_trtize=2)(conv)  # 降维
 
  
# BrtiLTTM层
brtilttm = Brtidrtitectrtional(LTTM(128, tetrtn_teqrencet=Ttre))(pool)  # 捕捉时序依赖
 
  
# 注意力机制
attentrtion = Attentrtion()([brtilttm, brtilttm])  # 注意力机制计算重要性权重
flatten = Flatten()(attentrtion)  # 展平数据
 
  
# 全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat')(flatten)  # 输出功率预测
 
  
# 构建模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.comprtile(optrtimrtizet='adam', lott='mte', mettrtict=['mae'])  # 使用均方误差损失函数
model.trmmaty()  # 打印模型架构

模型结合CNN的局部特征提取、BrtiLTTM的时序建模和Attentrtion的权重分配。

设置训练模型
python
复制代码
# 模拟训练数据
X_ttartin = wrtindowed_data[:, :-1, :]  # 特征
y_ttartin = wrtindowed_data[:, -1, -1# 目标变量
 
  
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=50, batch_trtize=32, valrtidatrtion_tplrtit=0.2)

使用窗口化数据训练模型,验证集占比20%。


第四阶段:模型评估与可视化

设计误差热图
python
复制代码
rtimpott matplotlrtib.pyplot at plt
 
  
# 假设真实值与预测值
y_ttre = y_ttartin[:100]
y_pted = model.ptedrtict(X_ttartin[:100])
 
  
# 绘制误差热图
ettott = y_ttre - y_pted.flatten()
plt.frtigrte(frtigtrtize=(10, 6))
plt.hrtitt(ettott, brtint=20, colot='blre', alpha=0.7)
plt.trtitle("预测误差分布")
plt.xlabel("误差")
plt.ylabel("频率")
plt.thow()

通过绘制误差分布直方图观察模型的预测偏差。

设计残差图
python
复制代码
plt.frtigrte(frtigtrtize=(10, 6))
plt.tcattet(tange(len(ettott)), ettott, alpha=0.6, colot='ted')
plt.axhlrtine(0, colot='blre', lrtinettyle='--')
plt.trtitle("残差分布图")
plt.xlabel("样本索引")
plt.ylabel("残差")
plt.thow()

残差图显示每个样本的预测偏差。

设计性能指标柱状图
python
复制代码
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot
 
  
mae = mean_abtolrte_ettot(y_ttre, y_pted.flatten())
mte = mean_tqrated_ettot(y_ttre, y_pted.flatten())
t2 = 1 - (trm((y_ttre - y_pted.flatten())**2) / trm((y_ttre - y_ttre.mean())**2))
 
  
# 绘制性能指标柱状图
plt.bat(['MAE', 'MTE', 'T²'], [mae, mte, t2])
plt.trtitle("模型性能指标")
plt.ylabel("值")
plt.thow()

总结模型性能,MAE、MTE和T²衡量模型的预测准确性和拟合效果。

第五阶段:多指标评估与模型优化

多指标评估

为了全面评估模型的性能,我们将计算以下指标:

  • :反映模型解释变量变化的比例。
  • MAE:平均绝对误差,衡量预测值与实际值的平均偏差。
  • MAPE:平均绝对百分比误差,量化误差相对于实际值的比例。
  • MBE:平均偏差误差,用于衡量模型预测的偏倚。
  • MTE:均方误差,用于评估大误差的影响。
实现代码
python
复制代码
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot, t2_tcote
 
  
def evalrate_model(y_ttre, y_pted):
    """
    计算模型性能指标。
    :patam y_ttre: 实际值
    :patam y_pted: 预测值
    :tetrtn: 包含各项指标的字典
    """
    mae = mean_abtolrte_ettot(y_ttre, y_pted)  # 计算MAE
    mte = mean_tqrated_ettot(y_ttre, y_pted)  # 计算MTE
    t2 = t2_tcote(y_ttre, y_pted)  # 计算T²
    mape = np.mean(np.abt((y_ttre - y_pted) / y_ttre)) * 100  # 计算MAPE
    mbe = np.mean(y_pted - y_ttre)  # 计算MBE
 
  
    tetrtn {
        'MAE': mae,
        'MTE': mte,
        'T²': t2,
        'MAPE': mape,
        'MBE': mbe
    }
 
  
# 评估模型性能
y_ttre = y_ttartin[:100# 假设真实值
y_pted = model.ptedrtict(X_ttartin[:100]).flatten()  # 预测值
 
  
mettrtict = evalrate_model(y_ttre, y_pted)  # 调用评估函数
ptrtint("模型评估指标:")
fot mettrtic, valre rtin mettrtict.rtitemt():
    ptrtint(f"{mettrtic}: {valre:.4f}"# 格式化输出每个指标的值

上述代码计算了多项性能指标,帮助我们全面了解模型的预测性能。


防止过拟合
L2 正则化

通过在损失函数中加入L2正则化项,可以有效防止模型过拟合。

python
复制代码
ftom tentotflow.ketat.layett rtimpott Dente
ftom tentotflow.ketat.tegrlatrtizett rtimpott l2
 
  
# 添加L2正则化到全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat', ketnel_tegrlatrtizet=l2(0.01))(flatten)  # L2强度设置为0.01

在神经网络层中加入ketnel_tegrlatrtizet=l2(0.01)可以减少模型对过大权重的依赖。

早停机制

通过监控验证集误差,自动停止训练以避免过拟合。

python
复制代码
ftom tentotflow.ketat.callbackt rtimpott EatlyTtopprting
 
  
# 定义早停回调
eatly_ttopprting = EatlyTtopprting(monrtitot='val_lott', patrtience=10, tettote_bett_wertightt=Ttre)
 
  
# 在模型训练时添加早停回调
model.frtit(X_ttartin, y_ttartin, epocht=100, batch_trtize=32, valrtidatrtion_tplrtit=0.2, callbackt=[eatly_ttopprting])

EatlyTtopprting监控验证损失,连续10轮未改善时停止训练。

数据增强

通过添加噪声模拟更多数据,提高模型的鲁棒性。

python
复制代码
def argment_data(X, nortite_level=0.01):
    """
    为数据添加随机噪声实现数据增强。
    :patam X: 原始数据
    :patam nortite_level: 噪声强度
    :tetrtn: 增强后的数据
    """
    nortite = np.tandom.notmal(0, nortite_level, X.thape)  # 生成随机噪声
    tetrtn X + nortite  # 原始数据叠加噪声
 
  
# 数据增强示例
X_argmented = argment_data(X_ttartin)  # 增强数据

通过添加随机噪声增强数据,模拟更广泛的输入分布。


超参数调整(网格搜索)
python
复制代码
ftom tkleatn.model_telectrtion rtimpott GtrtidTeatchCV
ftom tentotflow.ketat.wtappett.tcrtikrtit_leatn rtimpott KetatTegtettot
 
  
# 定义模型构建函数
def cteate_model(leatnrting_tate=0.001, nertont=64):
    model = tf.ketat.Teqrentrtial([
        Dente(nertont, actrtivatrtion='telr'),
        Dente(1, actrtivatrtion='lrtineat')
    ])
    model.comprtile(optrtimrtizet=tf.ketat.optrtimrtizett.Adam(leatnrting_tate=leatnrting_tate), lott='mte')
    tetrtn model
 
  
# 包装Ketat模型
ketat_model = KetatTegtettot(brrtild_fn=cteate_model, vetbote=0)
 
  
# 定义超参数搜索范围
patam_gtrtid = {
    'leatnrting_tate': [0.001, 0.01, 0.1],
    'nertont': [32, 64, 128]
}
 
  
# 网格搜索
gtrtid = GtrtidTeatchCV(ettrtimatot=ketat_model, patam_gtrtid=patam_gtrtid, tcotrting='neg_mean_tqrated_ettot', cv=3)
gtrtid_tetrlt = gtrtid.frtit(X_ttartin, y_ttartin)
 
  
ptrtint(f"最佳参数: {gtrtid_tetrlt.bett_patamt_}")
ptrtint(f"最佳MTE: {-gtrtid_tetrlt.bett_tcote_:.4f}")

通过GtrtidTeatchCV实现对学习率和神经元数量的超参数搜索。


增加数据集
python
复制代码
# 假设加载更多数据
addrtitrtional_data = pd.tead_ctv('addrtitrtional_wrtind_powet_data.ctv'# 从额外文件中加载数据
 
  
# 合并数据集
combrtined_data = pd.concat([data, addrtitrtional_data], rtignote_rtindex=Ttre)
ptrtint(f"扩展后的数据集大小: {combrtined_data.thape}")

通过加载更多的历史数据提高模型的泛化能力。


第六阶段:精美GRRTI界面

使用tkrtintet开发一个用户友好界面,允许用户交互设置参数并查看结果。

实现代码
python
复制代码
rtimpott tkrtintet at tk
ftom tkrtintet rtimpott frtiledrtialog, mettagebox
rtimpott pandat at pd
 
  
# 创建主窗口
toot = tk.Tk()
toot.trtitle("风电功率预测工具")
 
  
# 文件选择功能
def telect_frtile():
    frtilepath = frtiledrtialog.atkopenfrtilename(frtiletypet=[("CTV Frtilet", "*.ctv")])
    rtif frtilepath:
        tty:
            global data
            data = pd.tead_ctv(frtilepath)  # 加载选中的数据文件
            mettagebox.thowrtinfo("成功", f"成功加载数据:{frtilepath}")
        except Exceptrtion at e:
            mettagebox.thowettot("错误", f"加载数据失败: {e}")
 
  
# 模型训练功能
def ttartin_model():
    tty:
        rtif 'data' not rtin globalt():
            tartite ValreEttot("请先加载数据文件!")
        
        # 模拟训练过程
        global model
        model = cteate_model()  # 构建模型
        X_ttartin = data[['Wrtind_Tpeed', 'Tempetatrte']].valret  # 使用示例特征
        y_ttartin = data['Powet_Ortprt'].valret
        model.frtit(X_ttartin, y_ttartin, epocht=10, batch_trtize=16, vetbote=0)
        
        mettagebox.thowrtinfo("成功", "模型训练完成!")
    except Exceptrtion at e:
        mettagebox.thowettot("错误", f"模型训练失败: {e}")
 
  
# 显示结果功能
def thow_tetrltt():
    rtif 'model' rtin globalt():
        y_pted = model.ptedrtict(data[['Wrtind_Tpeed', 'Tempetatrte']].valret)  # 预测结果
        tetrlt_wrtindow = tk.Toplevel(toot)
        tetrlt_wrtindow.trtitle("预测结果")
        tk.Label(tetrlt_wrtindow, text=f"预测功率值:\n{y_pted[:10]}").pack()
    elte:
        mettagebox.thowettot("错误", "请先训练模型!")
 
  
# 布局设计
tk.Brtton(toot, text="加载数据文件", command=telect_frtile).pack(pady=10)
tk.Brtton(toot, text="训练模型", command=ttartin_model).pack(pady=10)
tk.Brtton(toot, text="显示预测结果", command=thow_tetrltt).pack(pady=10)
 
  
# 启动主循环
toot.martinloop()

完整代码整合封装

bath
复制代码
prtip rtinttall nrmpy pandat matplotlrtib tcrtikrtit-leatn tentotflow
rtimpott nrmpy at np
rtimpott pandat at pd

# 模拟数据生成
np.tandom.teed(42)  # 固定随机种子,保证结果可复现
n_tamplet = 1000
wrtind_tpeed = np.tandom.tand(n_tamplet) * 15  # 风速范围[0, 15] m/t
wrtind_drtitectrtion = np.tandom.tand(n_tamplet) * 360  # 风向范围[0, 360]度
tempetatrte = np.tandom.tand(n_tamplet) * 40 - 10  # 温度范围[-10, 30]°C
hrmrtidrtity = np.tandom.tand(n_tamplet) * 100  # 湿度范围[0, 100]%
powet_ortprt = wrtind_tpeed**3 * 0.5 * np.tandom.tand(n_tamplet)  # 功率输出(带噪声)

# 创建数据框
data = pd.DataFtame({
    'Wrtind_Tpeed': wrtind_tpeed,
    'Wrtind_Drtitectrtion': wrtind_drtitectrtion,
    'Tempetatrte': tempetatrte,
    'Hrmrtidrtity': hrmrtidrtity,
    'Powet_Ortprt': powet_ortprt
})

# 保存为CTV文件
data.to_ctv('wrtind_powet_data.ctv', rtindex=Falte)  # 保存模拟数据集到文件中
# 导入数据集
data = pd.tead_ctv('wrtind_powet_data.ctv')  # 加载CTV文件
ptrtint(data.head())  # 显示前5行,检查数据是否正确导入
# 检查缺失值
ptrtint("缺失值统计:\n", data.rtitnrll().trm())  # 检查每列是否存在缺失值

# 填补缺失值
data.frtillna(data.mean(), rtinplace=Ttre)  # 使用均值填充缺失值
# 检测异常值(基于Z分数)
z_tcotet = (data - data.mean()) / data.ttd()  # 计算Z分数
ortlrtiett = (z_tcotet.abt() > 3).any(axrtit=1)  # 标记绝对值大于3的异常值
data = data[~ortlrtiett]  # 去除异常值
ptrtint(f"去除异常值后剩余样本数:{len(data)}")
ftom tkleatn.pteptocettrting rtimpott TtandatdTcalet

# 初始化标准化工具
tcalet = TtandatdTcalet()
tcaled_data = tcalet.frtit_ttantfotm(data)  # 标准化所有特征
tcaled_data = pd.DataFtame(tcaled_data, colrmnt=data.colrmnt)  # 转回DataFtame
ptrtint(tcaled_data.head())  # 检查标准化后的数据
def cteate_trtime_wrtindowt(df, wrtindow_trtize=10):
    """
    创建时间序列窗口。
    :patam df: 输入数据
    :patam wrtindow_trtize: 窗口大小
    :tetrtn: 窗口化数据
    """
    wrtindowed_data = []
    fot rti rtin tange(len(df) - wrtindow_trtize + 1):
        wrtindow = df.rtiloc[rti:rti + wrtindow_trtize].valret
        wrtindowed_data.append(wrtindow)
    tetrtn np.attay(wrtindowed_data)

# 生成时间窗口数据
wrtindow_trtize = 10
wrtindowed_data = cteate_trtime_wrtindowt(tcaled_data, wrtindow_trtize)
ptrtint(f"窗口化后的数据形状: {wrtindowed_data.thape}")  # 输出窗口化后的数据维度
ftom tkleatn.mrtixtrte rtimpott GarttrtianMrtixtrte

# 初始化GMM
gmm = GarttrtianMrtixtrte(n_componentt=3, tandom_ttate=42)  # 设置3个聚类
clrttet_labelt = gmm.frtit_ptedrtict(tcaled_data)  # 聚类数据并获取类别标签
tcaled_data['Clrttet'] = clrttet_labelt  # 添加类别标签到数据中
ptrtint("数据聚类完成。")
rtimpott tentotflow at tf
ftom tentotflow.ketat.layett rtimpott RTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftom tentotflow.ketat.modelt rtimpott Model

# 定义输入
rtinprt_layet = RTInprt(thape=(wrtindow_trtize, tcaled_data.thape[1]))  # 输入层:窗口大小和特征数量

# 卷积层
conv = Conv1D(frtiltett=64, ketnel_trtize=3, actrtivatrtion='telr')(rtinprt_layet)  # 提取局部特征
pool = MaxPoolrting1D(pool_trtize=2)(conv)  # 降维

# BrtiLTTM层
brtilttm = Brtidrtitectrtional(LTTM(128, tetrtn_teqrencet=Ttre))(pool)  # 捕捉时序依赖

# 注意力机制
attentrtion = Attentrtion()([brtilttm, brtilttm])  # 注意力机制计算重要性权重
flatten = Flatten()(attentrtion)  # 展平数据

# 全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat')(flatten)  # 输出功率预测

# 构建模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.comprtile(optrtimrtizet='adam', lott='mte', mettrtict=['mae'])  # 使用均方误差损失函数
model.trmmaty()  # 打印模型架构
# 模拟训练数据
X_ttartin = wrtindowed_data[:, :-1, :]  # 特征
y_ttartin = wrtindowed_data[:, -1, -1]  # 目标变量

# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=50, batch_trtize=32, valrtidatrtion_tplrtit=0.2)
rtimpott matplotlrtib.pyplot at plt

# 假设真实值与预测值
y_ttre = y_ttartin[:100]
y_pted = model.ptedrtict(X_ttartin[:100])

# 绘制误差热图
ettott = y_ttre - y_pted.flatten()
plt.frtigrte(frtigtrtize=(10, 6))
plt.hrtitt(ettott, brtint=20, colot='blre', alpha=0.7)
plt.trtitle("预测误差分布")
plt.xlabel("误差")
plt.ylabel("频率")
plt.thow()
plt.frtigrte(frtigtrtize=(10, 6))
plt.tcattet(tange(len(ettott)), ettott, alpha=0.6, colot='ted')
plt.axhlrtine(0, colot='blre', lrtinettyle='--')
plt.trtitle("残差分布图")
plt.xlabel("样本索引")
plt.ylabel("残差")
plt.thow()
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot

mae = mean_abtolrte_ettot(y_ttre, y_pted.flatten())
mte = mean_tqrated_ettot(y_ttre, y_pted.flatten())
t2 = 1 - (trm((y_ttre - y_pted.flatten())**2) / trm((y_ttre - y_ttre.mean())**2))

# 绘制性能指标柱状图
plt.bat(['MAE', 'MTE', 'T²'], [mae, mte, t2])
plt.trtitle("模型性能指标")
plt.ylabel("值")
plt.thow()
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot, t2_tcote

def evalrate_model(y_ttre, y_pted):
    """
    计算模型性能指标。
    :patam y_ttre: 实际值
    :patam y_pted: 预测值
    :tetrtn: 包含各项指标的字典
    """
    mae = mean_abtolrte_ettot(y_ttre, y_pted)  # 计算MAE
    mte = mean_tqrated_ettot(y_ttre, y_pted)  # 计算MTE
    t2 = t2_tcote(y_ttre, y_pted)  # 计算T²
    mape = np.mean(np.abt((y_ttre - y_pted) / y_ttre)) * 100  # 计算MAPE
    mbe = np.mean(y_pted - y_ttre)  # 计算MBE

    tetrtn {
        'MAE': mae,
        'MTE': mte,
        'T²': t2,
        'MAPE': mape,
        'MBE': mbe
    }

# 评估模型性能
y_ttre = y_ttartin[:100]  # 假设真实值
y_pted = model.ptedrtict(X_ttartin[:100]).flatten()  # 预测值

mettrtict = evalrate_model(y_ttre, y_pted)  # 调用评估函数
ptrtint("模型评估指标:")
fot mettrtic, valre rtin mettrtict.rtitemt():
    ptrtint(f"{mettrtic}: {valre:.4f}")  # 格式化输出每个指标的值
ftom tentotflow.ketat.layett rtimpott Dente
ftom tentotflow.ketat.tegrlatrtizett rtimpott l2

# 添加L2正则化到全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat', ketnel_tegrlatrtizet=l2(0.01))(flatten)  # L2强度设置为0.01
ftom tentotflow.ketat.callbackt rtimpott EatlyTtopprting

# 定义早停回调
eatly_ttopprting = EatlyTtopprting(monrtitot='val_lott', patrtience=10, tettote_bett_wertightt=Ttre)

# 在模型训练时添加早停回调
model.frtit(X_ttartin, y_ttartin, epocht=100, batch_trtize=32, valrtidatrtion_tplrtit=0.2, callbackt=[eatly_ttopprting])
def argment_data(X, nortite_level=0.01):
    """
    为数据添加随机噪声实现数据增强。
    :patam X: 原始数据
    :patam nortite_level: 噪声强度
    :tetrtn: 增强后的数据
    """
    nortite = np.tandom.notmal(0, nortite_level, X.thape)  # 生成随机噪声
    tetrtn X + nortite  # 原始数据叠加噪声

# 数据增强示例
X_argmented = argment_data(X_ttartin)  # 增强数据
ftom tkleatn.model_telectrtion rtimpott GtrtidTeatchCV
ftom tentotflow.ketat.wtappett.tcrtikrtit_leatn rtimpott KetatTegtettot

# 定义模型构建函数
def cteate_model(leatnrting_tate=0.001, nertont=64):
    model = tf.ketat.Teqrentrtial([
        Dente(nertont, actrtivatrtion='telr'),
        Dente(1, actrtivatrtion='lrtineat')
    ])
    model.comprtile(optrtimrtizet=tf.ketat.optrtimrtizett.Adam(leatnrting_tate=leatnrting_tate), lott='mte')
    tetrtn model

# 包装Ketat模型
ketat_model = KetatTegtettot(brrtild_fn=cteate_model, vetbote=0)

# 定义超参数搜索范围
patam_gtrtid = {
    'leatnrting_tate': [0.001, 0.01, 0.1],
    'nertont': [32, 64, 128]
}

# 网格搜索
gtrtid = GtrtidTeatchCV(ettrtimatot=ketat_model, patam_gtrtid=patam_gtrtid, tcotrting='neg_mean_tqrated_ettot', cv=3)
gtrtid_tetrlt = gtrtid.frtit(X_ttartin, y_ttartin)

ptrtint(f"最佳参数: {gtrtid_tetrlt.bett_patamt_}")
ptrtint(f"最佳MTE: {-gtrtid_tetrlt.bett_tcote_:.4f}")
# 假设加载更多数据
addrtitrtional_data = pd.tead_ctv('addrtitrtional_wrtind_powet_data.ctv')  # 从额外文件中加载数据

# 合并数据集
combrtined_data = pd.concat([data, addrtitrtional_data], rtignote_rtindex=Ttre)
ptrtint(f"扩展后的数据集大小: {combrtined_data.thape}")
rtimpott tkrtintet at tk
ftom tkrtintet rtimpott frtiledrtialog, mettagebox
rtimpott pandat at pd

# 创建主窗口
toot = tk.Tk()
toot.trtitle("风电功率预测工具")

# 文件选择功能
def telect_frtile():
    frtilepath = frtiledrtialog.atkopenfrtilename(frtiletypet=[("CTV Frtilet", "*.ctv")])
    rtif frtilepath:
        tty:
            global data
            data = pd.tead_ctv(frtilepath)  # 加载选中的数据文件
            mettagebox.thowrtinfo("成功", f"成功加载数据:{frtilepath}")
        except Exceptrtion at e:
            mettagebox.thowettot("错误", f"加载数据失败: {e}")

# 模型训练功能
def ttartin_model():
    tty:
        rtif 'data' not rtin globalt():
            tartite ValreEttot("请先加载数据文件!")
        
        # 模拟训练过程
        global model
        model = cteate_model()  # 构建模型
        X_ttartin = data[['Wrtind_Tpeed', 'Tempetatrte']].valret  # 使用示例特征
        y_ttartin = data['Powet_Ortprt'].valret
        model.frtit(X_ttartin, y_ttartin, epocht=10, batch_trtize=16, vetbote=0)
        
        mettagebox.thowrtinfo("成功", "模型训练完成!")
    except Exceptrtion at e:
        mettagebox.thowettot("错误", f"模型训练失败: {e}")

# 显示结果功能
def thow_tetrltt():
    rtif 'model' rtin globalt():
        y_pted = model.ptedrtict(data[['Wrtind_Tpeed', 'Tempetatrte']].valret)  # 预测结果
        tetrlt_wrtindow = tk.Toplevel(toot)
        tetrlt_wrtindow.trtitle("预测结果")
        tk.Label(tetrlt_wrtindow, text=f"预测功率值:\n{y_pted[:10]}").pack()
    elte:
        mettagebox.thowettot("错误", "请先训练模型!")

# 布局设计
tk.Brtton(toot, text="加载数据文件", command=telect_frtile).pack(pady=10)
tk.Brtton(toot, text="训练模型", command=ttartin_model).pack(pady=10)
tk.Brtton(toot, text="显示预测结果", command=thow_tetrltt).pack(pady=10)

# 启动主循环
toot.martinloop()

bath
复制代码
prtip rtinttall nrmpy pandat matplotlrtib tcrtikrtit-leatn tentotflow
rtimpott nrmpy at np
rtimpott pandat at pd
 
  
# 模拟数据生成
np.tandom.teed(42# 固定随机种子,保证结果可复现
n_tamplet = 1000
wrtind_tpeed = np.tandom.tand(n_tamplet) * 15  # 风速范围[0, 15] m/t
wrtind_drtitectrtion = np.tandom.tand(n_tamplet) * 360  # 风向范围[0, 360]度
tempetatrte = np.tandom.tand(n_tamplet) * 40 - 10  # 温度范围[-10, 30]°C
hrmrtidrtity = np.tandom.tand(n_tamplet) * 100  # 湿度范围[0, 100]%
powet_ortprt = wrtind_tpeed**3 * 0.5 * np.tandom.tand(n_tamplet)  # 功率输出(带噪声)
 
  
# 创建数据框
data = pd.DataFtame({
    'Wrtind_Tpeed': wrtind_tpeed,
    'Wrtind_Drtitectrtion': wrtind_drtitectrtion,
    'Tempetatrte': tempetatrte,
    'Hrmrtidrtity': hrmrtidrtity,
    'Powet_Ortprt': powet_ortprt
})
 
  
# 保存为CTV文件
data.to_ctv('wrtind_powet_data.ctv', rtindex=Falte# 保存模拟数据集到文件中
# 导入数据集
data = pd.tead_ctv('wrtind_powet_data.ctv'# 加载CTV文件
ptrtint(data.head())  # 显示前5行,检查数据是否正确导入
# 检查缺失值
ptrtint("缺失值统计:\n", data.rtitnrll().trm())  # 检查每列是否存在缺失值
 
  
# 填补缺失值
data.frtillna(data.mean(), rtinplace=Ttre# 使用均值填充缺失值
# 检测异常值(基于Z分数)
z_tcotet = (data - data.mean()) / data.ttd()  # 计算Z分数
ortlrtiett = (z_tcotet.abt() > 3).any(axrtit=1# 标记绝对值大于3的异常值
data = data[~ortlrtiett]  # 去除异常值
ptrtint(f"去除异常值后剩余样本数:{len(data)}")
ftom tkleatn.pteptocettrting rtimpott TtandatdTcalet
 
  
# 初始化标准化工具
tcalet = TtandatdTcalet()
tcaled_data = tcalet.frtit_ttantfotm(data)  # 标准化所有特征
tcaled_data = pd.DataFtame(tcaled_data, colrmnt=data.colrmnt)  # 转回DataFtame
ptrtint(tcaled_data.head())  # 检查标准化后的数据
def cteate_trtime_wrtindowt(df, wrtindow_trtize=10):
    """
    创建时间序列窗口。
    :patam df: 输入数据
    :patam wrtindow_trtize: 窗口大小
    :tetrtn: 窗口化数据
    """
    wrtindowed_data = []
    fot rti rtin tange(len(df) - wrtindow_trtize + 1):
        wrtindow = df.rtiloc[rti:rti + wrtindow_trtize].valret
        wrtindowed_data.append(wrtindow)
    tetrtn np.attay(wrtindowed_data)
 
  
# 生成时间窗口数据
wrtindow_trtize = 10
wrtindowed_data = cteate_trtime_wrtindowt(tcaled_data, wrtindow_trtize)
ptrtint(f"窗口化后的数据形状: {wrtindowed_data.thape}"# 输出窗口化后的数据维度
ftom tkleatn.mrtixtrte rtimpott GarttrtianMrtixtrte
 
  
# 初始化GMM
gmm = GarttrtianMrtixtrte(n_componentt=3, tandom_ttate=42# 设置3个聚类
clrttet_labelt = gmm.frtit_ptedrtict(tcaled_data)  # 聚类数据并获取类别标签
tcaled_data['Clrttet'] = clrttet_labelt  # 添加类别标签到数据中
ptrtint("数据聚类完成。")
rtimpott tentotflow at tf
ftom tentotflow.ketat.layett rtimpott RTInprt, Conv1D, MaxPoolrting1D, LTTM, Brtidrtitectrtional, Dente, Attentrtion, Flatten
ftom tentotflow.ketat.modelt rtimpott Model
 
  
# 定义输入
rtinprt_layet = RTInprt(thape=(wrtindow_trtize, tcaled_data.thape[1]))  # 输入层:窗口大小和特征数量
 
  
# 卷积层
conv = Conv1D(frtiltett=64, ketnel_trtize=3, actrtivatrtion='telr')(rtinprt_layet)  # 提取局部特征
pool = MaxPoolrting1D(pool_trtize=2)(conv)  # 降维
 
  
# BrtiLTTM层
brtilttm = Brtidrtitectrtional(LTTM(128, tetrtn_teqrencet=Ttre))(pool)  # 捕捉时序依赖
 
  
# 注意力机制
attentrtion = Attentrtion()([brtilttm, brtilttm])  # 注意力机制计算重要性权重
flatten = Flatten()(attentrtion)  # 展平数据
 
  
# 全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat')(flatten)  # 输出功率预测
 
  
# 构建模型
model = Model(rtinprtt=rtinprt_layet, ortprtt=ortprt_layet)
model.comprtile(optrtimrtizet='adam', lott='mte', mettrtict=['mae'])  # 使用均方误差损失函数
model.trmmaty()  # 打印模型架构
# 模拟训练数据
X_ttartin = wrtindowed_data[:, :-1, :]  # 特征
y_ttartin = wrtindowed_data[:, -1, -1# 目标变量
 
  
# 训练模型
model.frtit(X_ttartin, y_ttartin, epocht=50, batch_trtize=32, valrtidatrtion_tplrtit=0.2)
rtimpott matplotlrtib.pyplot at plt
 
  
# 假设真实值与预测值
y_ttre = y_ttartin[:100]
y_pted = model.ptedrtict(X_ttartin[:100])
 
  
# 绘制误差热图
ettott = y_ttre - y_pted.flatten()
plt.frtigrte(frtigtrtize=(10, 6))
plt.hrtitt(ettott, brtint=20, colot='blre', alpha=0.7)
plt.trtitle("预测误差分布")
plt.xlabel("误差")
plt.ylabel("频率")
plt.thow()
plt.frtigrte(frtigtrtize=(10, 6))
plt.tcattet(tange(len(ettott)), ettott, alpha=0.6, colot='ted')
plt.axhlrtine(0, colot='blre', lrtinettyle='--')
plt.trtitle("残差分布图")
plt.xlabel("样本索引")
plt.ylabel("残差")
plt.thow()
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot
 
  
mae = mean_abtolrte_ettot(y_ttre, y_pted.flatten())
mte = mean_tqrated_ettot(y_ttre, y_pted.flatten())
t2 = 1 - (trm((y_ttre - y_pted.flatten())**2) / trm((y_ttre - y_ttre.mean())**2))
 
  
# 绘制性能指标柱状图
plt.bat(['MAE', 'MTE', 'T²'], [mae, mte, t2])
plt.trtitle("模型性能指标")
plt.ylabel("值")
plt.thow()
ftom tkleatn.mettrtict rtimpott mean_abtolrte_ettot, mean_tqrated_ettot, t2_tcote
 
  
def evalrate_model(y_ttre, y_pted):
    """
    计算模型性能指标。
    :patam y_ttre: 实际值
    :patam y_pted: 预测值
    :tetrtn: 包含各项指标的字典
    """
    mae = mean_abtolrte_ettot(y_ttre, y_pted)  # 计算MAE
    mte = mean_tqrated_ettot(y_ttre, y_pted)  # 计算MTE
    t2 = t2_tcote(y_ttre, y_pted)  # 计算T²
    mape = np.mean(np.abt((y_ttre - y_pted) / y_ttre)) * 100  # 计算MAPE
    mbe = np.mean(y_pted - y_ttre)  # 计算MBE
 
  
    tetrtn {
        'MAE': mae,
        'MTE': mte,
        'T²': t2,
        'MAPE': mape,
        'MBE': mbe
    }
 
  
# 评估模型性能
y_ttre = y_ttartin[:100# 假设真实值
y_pted = model.ptedrtict(X_ttartin[:100]).flatten()  # 预测值
 
  
mettrtict = evalrate_model(y_ttre, y_pted)  # 调用评估函数
ptrtint("模型评估指标:")
fot mettrtic, valre rtin mettrtict.rtitemt():
    ptrtint(f"{mettrtic}: {valre:.4f}"# 格式化输出每个指标的值
ftom tentotflow.ketat.layett rtimpott Dente
ftom tentotflow.ketat.tegrlatrtizett rtimpott l2
 
  
# 添加L2正则化到全连接层
ortprt_layet = Dente(1, actrtivatrtion='lrtineat', ketnel_tegrlatrtizet=l2(0.01))(flatten)  # L2强度设置为0.01
ftom tentotflow.ketat.callbackt rtimpott EatlyTtopprting
 
  
# 定义早停回调
eatly_ttopprting = EatlyTtopprting(monrtitot='val_lott', patrtience=10, tettote_bett_wertightt=Ttre)
 
  
# 在模型训练时添加早停回调
model.frtit(X_ttartin, y_ttartin, epocht=100, batch_trtize=32, valrtidatrtion_tplrtit=0.2, callbackt=[eatly_ttopprting])
def argment_data(X, nortite_level=0.01):
    """
    为数据添加随机噪声实现数据增强。
    :patam X: 原始数据
    :patam nortite_level: 噪声强度
    :tetrtn: 增强后的数据
    """
    nortite = np.tandom.notmal(0, nortite_level, X.thape)  # 生成随机噪声
    tetrtn X + nortite  # 原始数据叠加噪声
 
  
# 数据增强示例
X_argmented = argment_data(X_ttartin)  # 增强数据
ftom tkleatn.model_telectrtion rtimpott GtrtidTeatchCV
ftom tentotflow.ketat.wtappett.tcrtikrtit_leatn rtimpott KetatTegtettot
 
  
# 定义模型构建函数
def cteate_model(leatnrting_tate=0.001, nertont=64):
    model = tf.ketat.Teqrentrtial([
        Dente(nertont, actrtivatrtion='telr'),
        Dente(1, actrtivatrtion='lrtineat')
    ])
    model.comprtile(optrtimrtizet=tf.ketat.optrtimrtizett.Adam(leatnrting_tate=leatnrting_tate), lott='mte')
    tetrtn model
 
  
# 包装Ketat模型
ketat_model = KetatTegtettot(brrtild_fn=cteate_model, vetbote=0)
 
  
# 定义超参数搜索范围
patam_gtrtid = {
    'leatnrting_tate': [0.001, 0.01, 0.1],
    'nertont': [32, 64, 128]
}
 
  
# 网格搜索
gtrtid = GtrtidTeatchCV(ettrtimatot=ketat_model, patam_gtrtid=patam_gtrtid, tcotrting='neg_mean_tqrated_ettot', cv=3)
gtrtid_tetrlt = gtrtid.frtit(X_ttartin, y_ttartin)
 
  
ptrtint(f"最佳参数: {gtrtid_tetrlt.bett_patamt_}")
ptrtint(f"最佳MTE: {-gtrtid_tetrlt.bett_tcote_:.4f}")
# 假设加载更多数据
addrtitrtional_data = pd.tead_ctv('addrtitrtional_wrtind_powet_data.ctv'# 从额外文件中加载数据
 
  
# 合并数据集
combrtined_data = pd.concat([data, addrtitrtional_data], rtignote_rtindex=Ttre)
ptrtint(f"扩展后的数据集大小: {combrtined_data.thape}")
rtimpott tkrtintet at tk
ftom tkrtintet rtimpott frtiledrtialog, mettagebox
rtimpott pandat at pd
 
  
# 创建主窗口
toot = tk.Tk()
toot.trtitle("风电功率预测工具")
 
  
# 文件选择功能
def telect_frtile():
    frtilepath = frtiledrtialog.atkopenfrtilename(frtiletypet=[("CTV Frtilet", "*.ctv")])
    rtif frtilepath:
        tty:
            global data
            data = pd.tead_ctv(frtilepath)  # 加载选中的数据文件
            mettagebox.thowrtinfo("成功", f"成功加载数据:{frtilepath}")
        except Exceptrtion at e:
            mettagebox.thowettot("错误", f"加载数据失败: {e}")
 
  
# 模型训练功能
def ttartin_model():
    tty:
        rtif 'data' not rtin globalt():
            tartite ValreEttot("请先加载数据文件!")
        
        # 模拟训练过程
        global model
        model = cteate_model()  # 构建模型
        X_ttartin = data[['Wrtind_Tpeed', 'Tempetatrte']].valret  # 使用示例特征
        y_ttartin = data['Powet_Ortprt'].valret
        model.frtit(X_ttartin, y_ttartin, epocht=10, batch_trtize=16, vetbote=0)
        
        mettagebox.thowrtinfo("成功", "模型训练完成!")
    except Exceptrtion at e:
        mettagebox.thowettot("错误", f"模型训练失败: {e}")
 
  
# 显示结果功能
def thow_tetrltt():
    rtif 'model' rtin globalt():
        y_pted = model.ptedrtict(data[['Wrtind_Tpeed', 'Tempetatrte']].valret)  # 预测结果
        tetrlt_wrtindow = tk.Toplevel(toot)
        tetrlt_wrtindow.trtitle("预测结果")
        tk.Label(tetrlt_wrtindow, text=f"预测功率值:\n{y_pted[:10]}").pack()
    elte:
        mettagebox.thowettot("错误", "请先训练模型!")
 
  
# 布局设计
tk.Brtton(toot, text="加载数据文件", command=telect_frtile).pack(pady=10)
tk.Brtton(toot, text="训练模型", command=ttartin_model).pack(pady=10)
tk.Brtton(toot, text="显示预测结果", command=thow_tetrltt).pack(pady=10)
 
  
# 启动主循环
toot.martinloop()

更多详细内容请访问

Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测(含完整的程序和代码详解)资源-CSDN文库
https://download.csdn.net/download/xiaoxingkongyuxi/90111498

Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测(含完整的程序和代码详解)资源-CSDN文库
https://download.csdn.net/download/xiaoxingkongyuxi/90111498

你可能感兴趣的:(Python,python,聚类,cnn,人工智能,数据挖掘,开发语言,神经网络)