优化算法 | 灰色预测模型算法GM(1,1)流程分析

灰色预测模型(Gray Forecast Model)是通过少量的、不完全的信息,建立数学模型并做出预测的一种预测方法

灰色预测模型适用于小样本,含有不确定性因素的系统

首先,假如给定一组数据

X1={x11,x12,x13…x1n},你需要预测x1(n+1)的值是多少

这里可以使用灰度预测模型也就是GM(1,1)来进行预测

首先生成累加序列X2,

x21=x11,

x22=x11+x12

….

x2(n)=x11+x12+x13+…x1(n)

于是得到了一个新的序列X2

这里还需要用到一个一次后减的公式,也就是∆x1i=x1(i)-x1(i-1)

现在我们假设累加序列X2符合一阶常微分方程(这里的一阶指的是只有一阶导数,常微分指的是系数为常数)

(dx2i)/(di) + a*x2i = u 公式(1.1)

其中的a和u分别称为发展灰数和内生控制灰数

当i=t0,的时候x2(i) = x2(t0)

因此可以得到一个公式

(dx2(t0))/(d(t0)) + a*x2(t0) = u 公式(1.2)

综合1.1和1.2可以得到公式

x2(i) = [x2(t0) – (u/a)]*e^(-a*(i-t0)) +u/a//我也不知道是怎么推导出来的

对导数部分(dx2(t0))/(d(t0))进行对等间隔取样,并且将t0设置为1,公式会变成

x2(k+1) = [x2(1) – (u/a)] *e^(-a*k) + u/a公式1.3//这里的k=i-t0

 

接下来将x2(2),x2(3)…x2(n)带入公式1.1,用差分代替微分,又因为等间隔取样,

∆t = (t+1)-t,故得到∆x2(2)/∆t = ∆x2(2) =x2(2)-x2(1) = x1(2)

类似的有∆x2(3)/∆t = ∆x2(3) = x2(2)-x2(1) = x1(2)

于是将以上公式带入公式1.2有

x1(2) = [-x2(2),1]([a,u]T)  //这里的T为矩阵转置

x1(3) = [-x2(3),1]([a,u]T)

x1(4) = [-x2(4),1]([a,u]T)

。。。

x1(n) = [-x2(n),1]([a,u]T)

 

由于∆x2(i)/∆i涉及到累加列两个项的值,因此x2(i)最好也变成两个项的值,因此矩阵变为

x1(2) = [-1/2*(x2(2)+x2(1)),1]([a,u]T) //这里的T为矩阵转置

x1(3) = [-1/2*(x2(3)+x2(2)),1]([a,u]T)

x1(4) = [-1/2*(x2(4)+x2(3)),1]([a,u]T)

。。。

x1(n) = [-1/2*(x2(n)+x2(n-1)),1]([a,u]T)

这个矩阵的矩阵形式表示为y=BU,其中U = ([a,u]T)

以上式子用最小二乘法估计a和u为以下

 

将计算出来的a和u带入公式1.3就能够得到x2(n+1)的估计值,使用x2(n+1)的估计值就能够得到x1(n+1)的预测值

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
由于蚁群算法优化灰色预测模型的代码可能因应用场景的不同而有所差异,这里提供一个基本的蚁群算法优化灰色预测模型的代码框架,供参考: ``` import numpy as np from ant_colony_algorithm import AntColonyAlgorithm # 蚁群算法实现类 from grey_model import GreyModel # 灰色预测模型实现类 # 数据准备 data = np.array([...]) # 待预测的时间序列数据 m = 12 # 灰色预测模型的阶数 n = len(data) # 时间序列数据的长度 x0 = data[0] # 初始值 X1 = np.cumsum(data) # 一次累加序列 Z1 = (X1[1:] + X1[:-1]) / 2 # 一次均值生成序列 Y = data[1:] # 一次差分序列 # 构建灰色预测模型 gm = GreyModel() gm.fit(Y, n, m, x0, X1, Z1) # 构建蚁群算法优化灰色预测模型 class ACA_GM: def __init__(self, data, m, ant_num, max_iter): self.data = data self.m = m self.ant_num = ant_num self.max_iter = max_iter self.gm = GreyModel() self.gm.fit(self.data[1:], n, self.m, self.data[0], X1, Z1) def predict(self, k): # 确定灰色预测模型的参数 a = self.gm.a b = self.gm.b y0 = self.gm.y0 # 定义适应度函数 def fitness(x): return abs(self.gm.predict(k, a=x[0], b=x[1], y0=x[2]) - self.data[k]) # 初始化蚁群算法 aca = AntColonyAlgorithm(fitness, dim=3, ant_num=self.ant_num, max_iter=self.max_iter, lb=[0, 0, 0], ub=[1, 1, self.data.max()]) # 运行蚁群算法 aca.run() # 返回最佳预测值 return self.gm.predict(k, a=aca.best_x[0], b=aca.best_x[1], y0=aca.best_x[2]) # 使用蚁群算法优化灰色预测模型进行预测 aca_gm = ACA_GM(data, m=12, ant_num=50, max_iter=100) pred = [aca_gm.predict(k) for k in range(n)] # 输出预测结果 print(pred) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值