【负荷预测】基于灰色预测算法的负荷预测(Python代码实现)

article/2025/10/31 0:35:46

目录

1 概述

2 流程图

3 入门算例

 4 基于灰色预测算法的负荷预测(Python代码实现)


1 概述

“由于数据列的离散性,信息时区内将出现空集(不包含信息的定时区),因此只能按近似的微分方程条件,建立近似的,不完全确定的微分方程模型”

我们应该怎么理解呢?简而言之,我们就是要对数列建立近似的微分方程模型,但是由于微分方程的适合函数首先要满足可微的条件,但是一个时间序列的数据不是连续的,可导不一定连续,连续一定不可导!,参照高数的概念理解我们知道可导和可微是大致一致的。不可导的函数也就不可微分。

因此我们要想建立灰色预测模型,得到的只能是一个近似的微分方程。在《灰色系统理论教程》中我们称之为"灰色微分方程"。
 

灰色预测模型是通过少量的、不完全的信息,建立数学模型并做出预测的一种预测方法。灰色系统理论建模采用的是先对原始数据列做生成处理再成立微分方程模型。是处理小样本(4个就可以)预测问题的有效工具,而对于小样本预测问题回归和神经网络的效果都不太理想。

最简单的模型是GM(1,1),G:Grey(灰色);M:模型;(1,1):只含有单变量的一阶微分方程模型。

GM(1,1)首先对原始非负离散数据进行一个一阶累加处理(白化过程),然后对这组数据利用最小二乘法(和线性回归的方式十分类似)求解灰色系数,利用灰色系数构建灰色微分方程,求解微分方程既可以得到拟合公式。

灰色预测适用条件:用于时间短、数据资料少、数据不需要典型的分布规律、计算量较低、对短期预测有较高精度。不适合随机波动较大的数据。gm(1,1)适合白化后是指数趋势的数据(这样构建的微分方程的解才更适合拟合指数数据),灰色预测是利用趋势建模。
 

2 流程图

3 入门算例

现有1997—2002年各项指标相关统计数据如下表:

用灰色预测方法预测2003—2009年各项指标的数据。且已知实际的预测数据如下:将预测数据与实际数据进行比较

import numpy as np
import matplotlib.pyplot as plt
import math# 解决图标题中文乱码问题
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题#原数据
data=np.array([[72.03,241.2,1592.74],[73.84,241.2,1855.36],[74.49,244.8,2129.60],[76.68,250.9,2486.86],[78.00,250.9,2728.94],[79.68,252.2,3038.90]])
#要预测数据的真实值
data_T=np.array([[81.21,256.5,3458.05],[82.84,259.4,3900.27],[84.5,262.4,4399.06],[86.19,265.3,4961.62],[87.92,268.3,5596.1],[89.69,271.4, 6311.79],[91.49,274.5,7118.96]])#累加数据
data1=np.cumsum(data.T,1)
print(data1)[m,n]=data1.shape #得到行数和列数 m=3,n=6
#对这三列分别进行预测
X=[i for i in range(1997,2003)]#已知年份数据
X=np.array(X)
X_p=[i for i in range(2003,2010)]#预测年份数据
X_p=np.array(X_p)
X_sta=X[0]-1#最开始参考数据
#求解未知数
for j in range(3):B=np.zeros((n-1,2))for i in range(n-1):B[i,0]=-1/2*(data1[j,i]+data1[j,i+1])B[i,1]=1Y=data.T[j,1:7]a_u=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y.T)
#     print(a_u)#进行数据预测a=a_u[0]u=a_u[1]T=[i for i in range(1997,2010)]T=np.array(T)data_p=(data1[0,j]-u/a)*np.exp(-a*(T-X_sta-1))+u/a #累加数据
#     print(data_p)data_p1=data_pdata_p1[1:len(data_p)]=data_p1[1:len(data_p)]-data_p1[0:len(data_p)-1]
#     print(data_p1)title_str=['第一产业GDP预测','居民消费价格指数预测','第三产业GDP预测']plt.subplot(221+j)data_n=data_p1plt.scatter(range(1997,2003),data[:,j])plt.plot(range(1997,2003),data_n[X-X_sta])plt.scatter(range(2003,2010),data_T[:,j])plt. plot(range(2003,2010),data_n[X_p-X_sta-1])
#     plt.title(title_str[j])plt.legend(['实际原数据','拟合数据','预测参考数据','预测数据'])y_n=data_n[X_p-X_sta-1].Ty=data_T[:,j]wucha=sum(abs(y_n-y)/y)/len(y)titlestr1=[title_str[j],'预测相对误差:',wucha]plt.title(titlestr1)plt.show()

 来源:灰色预测法 —— python

 4 基于灰色预测算法的负荷预测(Python代码实现)

数据全部代码数据需要的自行下载:

链接:https://pan.baidu.com/s/11T39K3XO3iOqqnhYeHFJpA 
提取码:139v 
--来自百度网盘超级会员V2的分享


'''1导入相关库'''
import pandas as pd
import numpy as np
import seaborn as sns
import os
import datetime
import warnings
warnings.filterwarnings('ignore')
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']  #黑体换成SimHei
mpl.rcParams['axes.unicode_minus'] = False
from decimal import *  #精确计算'''2  创建灰色预测函数类'''
class GM11():def __init__(self):self.f = Nonedef isUsable(self, X0):'''判断是否通过光滑检验'''X1 = X0.cumsum()rho = [X0[i] / X1[i - 1] for i in range(1, len(X0))]rho_ratio = [rho[i + 1] / rho[i] for i in range(len(rho) - 1)]
#         print(rho, rho_ratio)flag = Truefor i in range(2, len(rho) - 1):if rho[i] > 0.5 or rho[i + 1] / rho[i] >= 1:flag = Falseprint("rho[-1]:"+str(rho[-1]))if rho[-1] > 0.5:flag = Falseif flag:print("数据通过光滑校验")else:print("该数据未通过光滑校验")'''判断是否通过级比检验'''lambds = [X0[i - 1] / X0[i] for i in range(1, len(X0))]X_min = np.e ** (-2 / (len(X0) + 1))X_max = np.e ** (2 / (len(X0) + 1))for lambd in lambds:if lambd < X_min or lambd > X_max:print('该数据未通过级比检验')returnprint('该数据通过级比检验')def train(self, X0):X1 = X0.cumsum(axis=0)  # [x_2^1,x_3^1,...,x_n^1,x_1^1] # 其中x_i^1为x_i^01次累加后的列向量Z = (np.array([-0.5 * (X1[:, -1][k - 1] + X1[:, -1][k]) for k in range(1, len(X1[:, -1]))])).reshape(len(X1[:, -1]) - 1, 1)# 数据矩阵A、BA = (X0[:, -1][1:]).reshape(len(Z), 1)B = np.hstack((Z, X1[1:, :-1]))# 求参数u = np.linalg.inv(np.matmul(B.T, B)).dot(B.T).dot(A)a = u[0][0]b = u[1:]print("灰参数a:", a, ",参数矩阵b:", b)self.f = lambda k, X1: (X0[0, -1] - (1 / a) * (X1[k, ::]).dot(b)) * np.exp(-a * k) + (1 / a) * (X1[k, ::]).dot(b)def predict(self, k, X0):''':param k: k为预测的第k个值:param X0: X0为【k*n】的矩阵,n为特征的个数,k为样本的个数:return:'''X1 = X0.cumsum(axis=0)X1_hat = [float(self.f(k, X1)) for k in range(k)]X0_hat = np.diff(X1_hat)X0_hat = np.hstack((X1_hat[0], X0_hat))return X0_hatdef evaluate(self, X0_hat, X0):'''根据后验差比及小误差概率判断预测结果:param X0_hat: 预测结果:return:'''S1 = np.std(X0, ddof=1)  # 原始数据样本标准差S2 = np.std(X0 - X0_hat, ddof=1)  # 残差数据样本标准差C = S2 / S1  # 后验差比Pe = np.mean(X0 - X0_hat)temp = np.abs((X0 - X0_hat - Pe)) < 0.6745 * S1p = np.count_nonzero(temp) / len(X0)  # 计算小误差概率print('============= evaluate =============')print("原数据样本标准差:", S1)print("残差样本标准差:", S2)print("后验差:", C)print("小误差概率p:", p)'''3 构建模型,进行测试集数据预测'''#===3.1 划分训练集和测试集=====data = pd.read_csv('power_consumption.csv', header=0, infer_datetime_format=True, parse_dates=['datetime'], index_col=['datetime'])
# 原始数据X
X = data.values
#按0.7和0.3的比例划分训练集
split_line = int(len(X)*0.7)
# 训练集
X_train = X[:split_line, :]
# 测试集
X_test = X[split_line:,:]#数据量查看
print(len(X_train),len(X_test))  #out:(1009, 433)#====3.2 评估模型,训练,并预测==========# 特征数据集
model = GM11()
'''利用训练集判断模型可行性'''
model.isUsable(X_train[:, -1])  # 判断模型可行性
model.train(X_train)  # 训练'''利用训练集完成后的模型预测训练集的数据'''
X_train_pred = model.predict(len(X_train), X_train[:, :-1])  # 预测
score_train = model.evaluate(X_train_pred, X_train[:, -1])  # 评估'''利用训练集完成后的模型预测验证集的数据'''
Y_test_pred = model.predict(len(X_test), X_test[:, :-1])  # 预测
score_test = model.evaluate(Y_test_pred, X_test[:, -1])  # 评估#====3.3 训练集和测试集 原始数据和预测值进行对比================'''训练集可视化'''
plt.figure(figsize=(16,8))
plt.plot(np.arange(len(Y_train_pred)), X_train[:, -1], '-.',color='r')
plt.plot(np.arange(len(Y_train_pred)), Y_train_pred, '--',color='y')
plt.legend(['负荷真实值', '灰色预测负荷预测值'])
plt.title('训练集')
plt.savefig('灰色预测负荷预测值.png', dpi=1000, bbox_inches="tight")
plt.show()'''验证集可视化'''
plt.figure(figsize=(16,8))
plt.plot(np.arange(len(Y_test_pred)), X_test[:, -1], '-')
plt.plot(np.arange(len(Y_test_pred)), Y_test_pred, '--')
plt.legend(['负荷真实值', '灰色预测负荷预测值'])
plt.title('测试集')
plt.savefig('灰色预测负荷预测值1.png', dpi=1000, bbox_inches="tight")
plt.show()#=======3.4 以表格形式对比测试集原始目标数据和预测目标数据======'''判断数据类型'''
type(X_test[:, -1]),type(Y_test_pred)  #out:(numpy.ndarray, numpy.ndarray)
'''预测数据对比'''
## 预测数据对比
compare = pd.DataFrame({"原数据":X_test[:, -1],"预测数据":Y_test_pred})
print(compare)'''随机编写数据进行测验'''### 随机编写2个数据,真实目标列值为:16983.666650、11329.833340,参照上表头两行数据
data_random = [[1941.940,154.028,347746.67,8210.4,3712.0,4357.0,7300.0,500],[1636.610,235.964,346675.11,6947.6,2085.0,970.0,12884.0,300]]
X_random = np.array(data_random)## 对数据进行预测
Y_random_pred = model.predict(len(X_random), X_random[:, :-1])  # 预测
print(Y_random_pred)
#训练集可视化
plt.figure(figsize=(16,8))
plt.plot(np.arange(len(Y_random_pred)), X_random[:, -1], '-',color='m')
plt.plot(np.arange(len(Y_random_pred)), Y_random_pred, '-.',color='b')
plt.legend(['负荷实际值', '灰色预测模型预测值'])
plt.title('训练集')
plt.savefig('灰色预测负荷预测值2.png', dpi=1000, bbox_inches="tight")
plt.show()
# out:[14680.9333193 11805.7573936]


http://chatgpt.dhexx.cn/article/eW06oMgY.shtml

相关文章

时间序列特征构造:以电力负荷预测为例讲解(python语言)

个人电气博文目录传送门 学好电气全靠它&#xff0c;个人电气博文目录&#xff08;持续更新中…&#xff09; 时间序列特征构造 时间序列问题&#xff0c;首先不管是回归问题&#xff0c;还是分类问题。 一个模型的好坏&#xff0c;决定因素由数据集的大小&#xff0c;特征值…

[负荷预测]基于灰色GM(1,1)模型的中长期电力负荷预测

目 录 一、灰色模型GM&#xff08;1,1&#xff09;原理 二、模型构建前检验 三、预测精度的检验 3.1 残差检验 3.2 后验差检验 四、灰色模型GM(1,1)算法 五、Matlab编程实现 5.1 程序代码 5.2 输出结果 5.3 结果检验 5.4 预测泛化 六、Python编程实现 6.1 程序…

基于注意力机制的 CNN-BiGRU 短期电力负荷预测方法

提出了一种基于 Attention 机制的CNN -BiGRU&#xff08;卷积神经网络双向GRU注意力机制&#xff09;短期电力负荷预测方法&#xff0c;该方法将历史负荷数据作为输入&#xff0c;搭建由一维卷 积层和池化层等组成的 CNN 架构&#xff0c;提取反映负荷复杂动态变化的高维特征…

电力负荷预测任务(基于GRU模型)

数据&#xff1a;2000-2002三年每小时的电力负载 程序以及数据链接&#xff08;如果受益&#xff0c;请给个关注和star&#xff09;&#xff1a;https://github.com/xzdLYL/electrical_load_prediction 任务目标&#xff1a;以2000&#xff0c;2001年数据训练模型&#xff0c…

机器学习练手---负荷数据预测

纸上得来终觉浅&#xff0c;得知此事要躬行 文章目录 前言一、数据清洗查看特征与label的关联程度查看特征自身的差异性。特征筛选 二、引入模型1.选择多元线性回归模型2.尝试预测 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 简单记录一下机器…

电力负荷短期预测模型(基于ARIMA)

电力负荷预测 电力分析与预测一.导入数据二.数据的预处理三.基本描述性统计四.构建特征&#xff0c;模型准备①系统聚类法②K-means聚类 五.构建特征&#xff0c;建立预测模型①预测未来一天&#xff0c;各时段的电力负荷②预测未来几天总体电力负荷 电力分析与预测 根据提供的…

深度学习方法在负荷预测中的应用综述(论文阅读)

前言   本篇论文主要介绍了当下用于智能电网电力负荷预测的多种DL方法&#xff0c;并对它们的效果进行了比较。对于RMSE的降低效果上&#xff0c;集成DBN和SVM的方法RMSE降低显著&#xff0c;达到了21.2%。此外&#xff0c;PDRNN方法与ARIMA方法相比有很大的降低&#xff0c;…

电气论文:负荷区间预测(机器学习简单实现)

个人电气博文目录链接: 学好电气全靠它,个人电气博文目录(持续更新中…) 代码图 效果图 论文解锁,是解锁这个专栏。可以看这个专栏的所有文章。 讲解 本文:简单写的模型(未对数据进行降噪,降噪可以看我的小波分解博客。未对区间预测效果进行度量。自己写个公式就可以…

【负荷预测】长短期负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

基于BiGRU短期电力负荷预测方法

前言 大家好,我是阿光。 本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPy…

[负荷预测]基于线性回归模型的中长期电力负荷预测

目录 一、中长期电力负荷预测 二、国家电网电力数据集 三、 Matlab编程实现 3.1 程序代码 3.2 多元线性回归模型 3.3 对2020年数据预测 一、中长期电力负荷预测 电力负荷预测是电力系统规划的重要组成部分&#xff0c;也是电力系统经济运行的基础&#xff0c;其对电力系…

【负荷预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

目录 1 概述 2 基于神经网络的负荷预测&#xff08;Matlab实现&#xff09; 2.1 代码 2.2 结果 2.3 回归树模型的进一步改进 3 基于神经网络的价格预测&#xff08;Matlab代码实现&#xff09; 4 阅读全文&#xff08;Matlab代码&#xff09; 1 概述 这个例子演示了…

LSTM-多变量-单时间步-pytorch-负荷预测(多时间步采用滚动预测)

问题描述 使用LSTM做负荷预测问题&#xff0c;数据共计456行&#xff0c;每一行3个特征&#xff0c;用过去N个时间段特征&#xff0c;预测未来第N1个时间点的特征&#xff0c;数据格式如下&#xff0c;用00:00:00-04:00:00的[feature1&#xff0c;feature2&#xff0c;feature…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Charles抓包web、手机、小程序配置

一、下载地址 二、web抓包 Charles Web抓包&#xff0c;启动Charles会自动与浏览器设置成代理&#xff0c;不需要进行过多的设置。接下来就是通过浏览器发送网络请求&#xff0c;Charles就会直接抓取到这些信息和响应信息。 1、抓取HTTPS协议 Charles配置 点击顶部菜单栏【He…

Charles抓包使用及常用问题

简介 Charles其实是一款代理服务器&#xff0c;通过成为电脑或者浏览器的代理&#xff0c;然后截取请求和请求结果达到分析抓包的目的。该软件是用Java写的&#xff0c;能够在Windows&#xff0c;Mac&#xff0c;Linux上使用&#xff0c;安装Charles的时候要先装好Java环境。 …

Charles抓包显示<unknown>解决方案

上篇 &#xff1a;Charles抓包微信小程序数据 charles抓包会出现&#xff0c;请求前都加了锁&#xff0c;具体地址为<unknown>的情况。 解决<unknown>问题 首先电脑上需要安装charles&#xff0c;然后需要设置手机上的WiFi设置&#xff0c;修改配置中的代理设置&a…

charles抓包配置具体操作步骤

Charles主要功能 截取Http和Https网络封包 支持重发网络请求&#xff0c;方便后端调试 支持修改网络请求参数 支持网络请求的截获并动态修改 支持模拟慢速网络 Charles下载安装 charles下载地址&#xff1a;https://www.charlesproxy.com/download/ 注&#xff1a; 浏览…

Charles抓包https接口指南

Charles抓包https接口 作为一名iOS攻城狮&#xff0c;如果你没有听说过青花瓷这款软件&#xff0c;我只能说你还是回家洗洗睡吧。 最近在写一个需求&#xff0c;服务端不知道怎么设计接口。我只好找来了一个又类似功能的app&#xff0c;想要一睹芳容。于是主角Charles软件开始…

Charles抓包 - 手机

目的&#xff1a;抓IOS、Android端接口数据&#xff0c;保证IOS、Android和电脑在同一网络下&#xff1a; 1、首先需要将 Charles 的代理功能打开&#xff0c;在 Charles 的菜单栏上选择 “Proxy”–>“Proxy Settings”&#xff0c;填入代理端口 8888&#xff0c;并且勾上…