python GM(1,1)模型代码
时间: 2023-10-11 19:13:34 浏览: 109
下面是Python实现GM(1,1)模型的代码:
``` python
import numpy as np
def GM11(x0):
"""
GM(1,1)灰色预测模型
:param x0:原始序列(列表形式)
:return: 返回灰色预测结果、后验差比值、一次微分方程系数a和b以及拟合优度
"""
x1 = np.cumsum(x0) # 一次累加
z1 = (x1[: -1] + x1[1:])/2.0 # 紧邻均值
z1 = z1.reshape((len(z1), 1))
B = np.append(-z1, np.ones_like(z1), axis=1)
Yn = x0[1:].reshape((len(x0)-1, 1))
# 计算GM(1,1)微分方程的参数a和b
[[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Yn)
# 对原序列进行还原,得到经过模型预测之后的序列
result = list()
for index in range(1, len(x0)+1):
if index == 1:
xt = x0[0]
result.append(xt)
else:
xt = (x0[0]-b/a)*(1-np.exp(a))*np.exp(-a*(index-1))
result.append(xt)
# 计算后验差比值
e = 0
for i in range(len(x0)):
e += (x0[i]-result[i])/x0[i]
delta = e/len(x0)
# 计算拟合优度
SSE = np.sqrt(sum((np.array(x0)-np.array(result))**2)) # 计算残差平方和
ST = np.std(x0) * np.sqrt(len(x0)) # 计算原始数据标准差
R_square = 1 - SSE/ST
return result, delta, a, b, R_square
```
使用方法:
``` python
# 示例
x0 = [13, 15, 16, 18, 19, 20, 22, 24, 25, 27]
result, delta, a, b, R_square = GM11(x0)
print("灰色预测结果:", result)
print("后验差比值:", delta)
print("一次微分方程系数a:", a)
print("一次微分方程系数b:", b)
print("拟合优度:", R_square)
```
注:以上代码仅为示例,实际使用时需根据自己的具体情况进行修改。
阅读全文