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

news2024/11/15 13:26:29

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

目录

    • 时序预测 | Matlab+Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测
      • 效果一览
      • 基本介绍
      • 模型描述
      • 程序设计
      • 参考资料

效果一览

1
2

10
11
12

16

基本介绍

基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测(Matlab+Python完整源码和数据)
该方法结合数据分布特征,利用 GMM 聚类将大型风电场划分为若干机组群,借助贝叶斯信息准则指标评价,获得风电场内最优机组分组方案。最后,基于CNN-BiLSTM-Attention的功率预测方法,验证所提聚类方法的有效性以及相较于其他聚类方法的优越性。
1.先运行data_process.m 能得到cluster.csv文件;
2.之后运行main.py进行预测,会得到results文件夹以及里面的结
果和图片
3.最后运行result_analysis.m进行数据分析,Python用的是Keras。

模型描述

对任意来流条件下的风电场发电功率进行准确预测,是提高电网对风电接纳能力的有效措施。针对大型风电场的功率预测采用单点位风速外推预测代表性差的局限,提出基于高斯混合模型(GMM)聚类的风电场短期功率预测方法。方法结合数据分布特征,利用GMM 聚类将大型风电场划分为若干机组群,借助贝叶斯信息准则指标评价,获得风电场内最优机组分组方案。算例表明,所建立的GMM 聚类模型均极大地提高了风电功率预测模型的准确性。相较于应用广泛的k-means 聚类、层次凝聚聚类等方法,GMM 聚类方法在分组功率预测中表现出了显著优势,为大型风电场短期功率预测模型的优化及运行经济性的提升提供了技术支持与依据。

17

程序设计

  • 完整程序和数据下载方式1(资源处直接下载):Matlab+Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测
  • 完整程序和数据下载方式2(订阅《CNN-DL卷积深度学习模型》专栏,同时可阅读《CNN-DL卷积深度学习模型》专栏收录的内容,本篇文章数据订阅后私信我获取):Matlab+Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测
  • 完整程序和数据下载方式3(订阅《组合优化》专栏,同时获取《组合优化》专栏收录程序6份,数据订阅后私信我获取):Matlab+Python实现基于高斯混合模型聚类结合CNN-BiLSTM-Attention的风电场短期功率预测
from __future__ import print_function

import argparse
import os

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

from model import train_model

parser = argparse.ArgumentParser()
parser.add_argument('--model_name', type=str, default='CNN_BiLSTM', choices=['CNN_BiLSTM_Attn', 'CNN_BiLSTM'])
parser.add_argument('--epochs', type=int, default=600, help="Epochs")
parser.add_argument('--batch_size', type=int, default=256, help="Batch Size")
parser.add_argument('--learning_rate', type=float, default=0.001, help="Learning rate")
parser.add_argument('--sequence_length', type=int, default=10, help="sequence length")
parser.add_argument('--dataset', type=str, default='all', choices=['cluster1', 'cluster2', 'cluster3', 'all'])
parser.add_argument('--path', type=str, default='./results/')
args = parser.parse_args()

if not os.path.exists(args.path):
    os.mkdir(args.path)


def convertSeriesToMatrix(vectorSeries, sequence_length):
    """
    滑动时间窗口处理
    """
    matrix = []
    for i in range(len(vectorSeries) - sequence_length + 1):
        matrix.append(vectorSeries[i: i + sequence_length])
    return matrix


if args.dataset in {'cluster1', 'cluster2', 'cluster3'}:
    df = pd.read_csv(args.dataset + '.csv')
    wind = np.array(df)
elif args.dataset == 'all':
    X_files = os.listdir(os.getcwd() + '/dataset')
    if '.gitignore' in X_files: X_files.remove('.gitignore')
    X_files = np.array(X_files)
    wind = []
    for filename in X_files:
        df = pd.read_csv(os.getcwd() + '/dataset/' + filename)
        data = df.values
        wind.append(data[:, 0])
    wind = np.sum(wind, axis=0).reshape(-1, 1)

list_hourly_data = [wind[i] for i in range(0, wind.shape[0]) if i % 12 == 0]
wind_data = np.array(list_hourly_data)

# min-max归一化处理
MAX_MIN = []
for i in range(wind_data.shape[1]):  # 取每一列
    temp_max = np.max(wind_data[:, i])
    temp_min = np.min(wind_data[:, i])  # 第i列最小值
    wind_data[:, i] = (wind_data[:, i] - temp_min) / (temp_max - temp_min)  # 归一化
    # wind_data[:, i] = wind_data[:, i] / temp_max # 归一化
    MAX_MIN.append([temp_max, temp_min])

MAX_NUM = MAX_MIN[0][0]
MIN_NUM = MAX_MIN[0][1]

matrix_load = convertSeriesToMatrix(wind_data, args.sequence_length)  # 滑动时间窗口,窗口长度可以改
matrix_load = np.array(matrix_load).astype(np.float32)  # matrix_load转为ndarray

# 分为训练集与测试集,训练集占90%
train_row = int(round(0.9 * matrix_load.shape[0]))
train_set = matrix_load[:train_row, :]

np.random.shuffle(train_set)  # 打乱训练集,测试集不用打乱

X_train = train_set[:, :-1]  # 训练集
y_train = train_set[:, -1, 0].reshape(-1, 1)  # 训练集label

X_test = matrix_load[train_row:, :-1]  # 测试集
y_test = matrix_load[train_row:, -1, 0].reshape(-1, 1)  # 测试集label

X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1] * X_train.shape[2], 1))
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1] * X_test.shape[2], 1))

# =====================================
# ========= 载入模型,开始训练 =========
# =====================================
input_shape = X_train.shape[1:]

model = train_model(args.model_name, input_shape=input_shape)

model.summary()  # print model 结构
history = model.fit(X_train, y_train, batch_size=args.batch_size, epochs=args.epochs, validation_split=0.05, verbose=1)  # 开始训练
# model.save(args.path + args.model_name + '_' + args.dataset + 'model.h5')  # 保存模型

# =====================================
# ============ 训练结果评估 ============
# =====================================

# 预测测试集
predicted_values = model.predict(X_test)
num_test_samples = len(predicted_values)
predicted_values = np.reshape(predicted_values, (num_test_samples, 1))

# 评估训练结果
test_mse = model.evaluate(X_test, y_test, verbose=1)
print('\nThe mean squared error (MSE) on the test data set is %.3f over %d test samples.' % (test_mse[0], len(y_test)))

# 反归一化
predicted_values = predicted_values * (MAX_NUM - MIN_NUM) + MIN_NUM
y_test = y_test * (MAX_NUM - MIN_NUM) + MIN_NUM
y_train = y_train * (MAX_NUM - MIN_NUM) + MIN_NUM

# 画图
fig = plt.figure(figsize=(15, 5), dpi=600)
plt.plot(y_test)
plt.plot(predicted_values)
plt.xlabel('Hour')
plt.ylabel('Wind Power')
# plt.show()
fig.savefig(args.path + args.model_name + '_' + args.dataset + '_output.png', bbox_inches='tight')

# MSE 损失函数
fig = plt.figure(figsize=(15, 5), dpi=600)
plt.plot(history.history['loss'], label='training loss')
plt.plot(history.history['val_loss'], label='val loss')
plt.title('model loss')
plt.ylabel('MSE Loss')
plt.xlabel('epoch')
plt.legend(loc='upper right')
fig.savefig(args.path + args.model_name + '_' + args.dataset + '_loss.png')

# MAE
fig = plt.figure(figsize=(15, 5), dpi=600)
plt.plot(history.history['mae'], label='training mae')
plt.plot(history.history['val_mae'], label='val mae')
plt.title('model MAE')
plt.ylabel('MAE')
plt.xlabel('epoch')
plt.legend(loc='upper right')
fig.savefig(args.path + args.model_name + '_' + args.dataset + '_mae.png')

# RMSE
fig = plt.figure(figsize=(15, 5), dpi=600)
plt.plot(history.history['root_mean_squared_error'], label='training rmse')
plt.plot(history.history['val_root_mean_squared_error'], label='val rmse')
plt.title('model RMSE')
plt.ylabel('RMSE')
plt.xlabel('epoch')
plt.legend(loc='upper right')
fig.savefig(args.path + args.model_name + '_' + args.dataset + '_rmse.png')

# 将预测结果保存成csv文件
data = np.hstack((predicted_values, y_test))
df = pd.DataFrame(data, columns=['predicted', 'real'])
df.to_csv(args.path + args.model_name + '_' + args.dataset + '_result.csv')

# MSE loss 和 MAE 保存成csv文件
df = pd.DataFrame(history.history)
df.to_csv(args.path + args.model_name + '_' + args.dataset + '_loss.csv')

参考资料

[1] https://blog.csdn.net/kjm13182345320/article/details/129215161
[2] https://blog.csdn.net/kjm13182345320/article/details/128105718

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.Git使用技巧-常用命令3

1.Git使用技巧-常用命令3 文章目录 1.Git使用技巧-常用命令3一、版本分支介绍二、版本控制常用命令例子 三、git 仓库如何使用总结 一、版本分支介绍 分支介绍: Master : 稳定压倒一切,禁止尚review和测试过的代码提交到这个分支上&#xff…

1.2 向量基础

什么是向量 向量的定义 ①向量是有大小和方向的有向线段。 ②向量没有位置,只有大小和方向 ③向量的箭头是向量的结束,尾是向量的开始 ④向量魔术的位移能被认为是宇宙平行的唯一序列 (向量的数组不是向量的位置,而是向量在各个维…

C++多线程学习(十七、简单实现线程池)

目录 线程池 设计线程池的关键问题 代码 可能出现的疑问 queue> task; 总结: template auto InsertQueue(T&& t, Args&& ...args)->future;(t(args...))> 总结: ThreadPool(size_t size);构造函数 总结&#xff1…

在SpringBoot中搭建微服务的项目(19版)

1.创建SpringBoot项目 2.删除不需要的,留一个pom文件 3.掉地SpringBoot的版本: <version>2.1.6.RELEASE</version> 4.导入该pom文件 <dependencies> <!-- SpringBoot启动器--><dependency><groupId>org.springframework.boot</g…

关于Redis因OAuth 2.0内存溢出解决方案

一、背景介绍 1.问题简介 本次问题是由OAuth 2.0授权框架&#xff08;用于授权第三方应用程序【客户端】访问受保护的资源。&#xff09;存储在Redis集群中的一个key引起的&#xff1a;client_id_to_access&#xff08;或称为 “client ID to access”&#xff09;通常是指在O…

安全用电管理平台针对电气火灾的解决方案 安科瑞 许敏

摘要&#xff1a; 安全用电管理平台是针对我国当前电气火灾事故频发而设计的一套电气火灾预警和预防管理系统&#xff0c;该系统是基于移动互联网、云计算技术、通过物联网传感终端&#xff08;现场监控模块、传输模块&#xff09;&#xff0c;将供电侧、用电侧电气安全参数实时…

java 打包Spring Boot项目,并运行在windows系统中

前面呢 我们已经把Spring Boot比较基础的东西都弄完了 然后呢 我们来看运维这方面的知识 首先 我们做个打包运行 其实很多人可能会比较熟悉windows系统 而linux服务器 相对没那么了解 那么我们就先来弄windows的 首先 我们要知道 为什么要打包 我们就看我们前面做的MMP项目 当…

git轻量级服务器gogs

确保本真机已启动sshd服务 sudo apt install openssh-server -y sudo systemctl start sshgogs部署 启动 sudo docker stop gogs; sudo docker rm gogs; rm -fr /build/gogs_data/*; sudo docker run --namegogs -p 10022:22 -p 10880:3000 -v /build/gogs_data:/data …

布雷默浪丹 PT 141:189691-06-3,1607799-13-2,Bremelanotide,布美诺肽

Bremelanotide&#xff0c;布雷默浪丹 PT 141&#xff0c;布美诺肽Product structure&#xff1a; Product specifications&#xff1a; 1.CAS No&#xff1a;189691-06-3/1607799-13-2 2.Molecular formula&#xff1a;C50H68N14O10 3.Molecular weight&#xff1a;1025.063 4…

抖音seo矩阵系统源码开发部署-技术开源(三)

场景&#xff1a;抖音seo源码。抖音矩阵源码&#xff0c;短视频seo源码&#xff0c;短视频矩阵源码开发部署&#xff0c;技术分享&#xff0c; 一、 抖音seo源码开发所需服务器环境配置 要开发抖音SEO矩阵系统&#xff0c;需要以下服务器环境&#xff1a; Web服务器&#xff…

Jmeter的常用设置(二)【处理乱码问题】

文章目录 前言一、察看结果树响应结果是乱码_解决方法 方法一&#xff1a;在察看结果树之前添加 后置处理器 中的 “BeanShell PostProcessor” 来动态修改结果处理编码方法二&#xff1a;在配置文件中修改二、使用步骤 1.引入库2.读入数据总结 前言 接口测试中遇到的各种问题…

使用 ViteJs 将 Jest 测试集成到现有的 Vue 3 项目中

根据我最近的经验&#xff0c;我面临着将 Jest 测试框架集成到使用Vite构建的现有Vue3 js项目中的挑战。我在各种博客上找到有用的安装指南时遇到了困难。然而&#xff0c;经过多次尝试和付出很大的努力&#xff0c;我最终找到了解决方案。在这篇博文中&#xff0c;我的目标是提…

2023黑马头条.微服务项目.跟学笔记(五)

2023黑马头条.微服务项目.跟学笔记 五 延迟任务精准发布文章1.文章定时发布2.延迟任务概述2.1 什么是延迟任务2.2 技术对比2.2.1 DelayQueue2.2.2 RabbitMQ实现延迟任务2.2.3 redis实现 3.redis实现延迟任务4.延迟任务服务实现4.1 搭建heima-leadnews-schedule模块4.2 数据库准…

Swagger简介及Springboot集成Swagger详细教程

Swagger简介及Springboot集成Swagger详细教程 学习目标 了解Swagger的作用和概念了解前后端分离在SpringBoot中集成Swagger 1、Swagger简介 前后端分离 VueSpringBoot 后端时代 前端只用管理静态页面&#xff1b;html–>后端。模版引擎JSP–>后端是主力 前后端分离式时…

获取mysql存储过程的异常信息

示例 CREATE DEFINERrootlocalhost PROCEDURE getErrorMsg() BEGIN-- 定义存储变量DECLARE code CHAR(5) DEFAULT ;DECLARE msg TEXT;DECLARE result TEXT;-- 声明异常处理DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGIN-- 获取异常code,异常信息GET DIAGNOSTICS CONDITION …

基于单片机的恒温恒湿温室大棚温湿度控制系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;液晶显示当前温湿度按键设置温湿度报警上限和下限&#xff1b;温度低于下限继电器闭合加热片进行加热&#xff1b;温度超过上限继电器闭合开启风扇进行降温湿度低于下限继电器闭合加湿器进行加湿湿度高于上限继电器闭合开启风扇进行…

干翻Dubbo系列第三篇:Dubbo术语与第一个应用程序

前言 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽都顺利。 如…

小程序页面顶部标题栏、导航栏navigationBar如何隐藏、变透明?

在app.json中的 "window"下面追加一行 "navigationStyle": "custom" 小程序顶部的白色背景条就不见了&#xff0c;直接变透明&#xff0c;只剩下右上角的胶囊按钮 警告&#xff1a; 如果页面有 <web-view src"{{src}}" /> …

机器学习实战 | MNIST手写数字分类项目(深度学习初级)

目录 简介技术流程1. 载入依赖包和数据集2. 数据预处理3. 创建卷积神经网络模型4. 训练神经网络5. 评价网络 完整程序train.py 程序gui.py程序 简介 准备写个系列博客介绍机器学习实战中的部分公开项目。首先从初级项目开始。 本文为初级项目第二篇&#xff1a;利用MNIST数据集…

111、基于51单片机的电磁感应无线充电系统 手机无线充电器设计(程序+原理图+Proteus仿真+程序流程图+论文参考资料等)

方案选择 单片机的选择 方案一&#xff1a;AT89C52是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元…