gm21模型python_灰色预测 GM11模型

importSeriesfrom pandas importDataFrameimportpandas as pdimportmatplotlib.pyplot as pltclassGray_model:def __init__(self):

self.a_hat=None

self.x0=Nonedeffit(self,

series=pd.Series(index=[1996, 1997, 1998, 1999], data=[1, 2, 3, 4])):"""Series is a pd.Series with index as its date.

:param series: pd.Series

:return: None"""self.a_hat=self._identification_algorithm(series.values)

self.x0=series.values[0]defpredict(self, interval):

result=[]for i inrange(interval):

result.append(self.__compute(i))

result= self.__return(result)returnresultdef_identification_algorithm(self, series):

B= np.array([[1] * 2] * (len(series) - 1))

series_sum=np.cumsum(series)for i in range(len(series) - 1):

B[i][0]= (series_sum[i] + series_sum[i + 1]) * (-1.0) / 2Y= np.transpose(series[1:])

BT=np.transpose(B)

a=np.linalg.inv(np.dot(BT, B))

a=np.dot(a, BT)

a=np.dot(a, Y)

a=np.transpose(a)returnadefscore(self, series_true, series_pred, index):

error=np.ones(len(series_true))

relativeError=np.ones(len(series_true))for i inrange(len(series_true)):

error[i]= series_true[i] -series_pred[i]

relativeError[i]= error[i] / series_pred[i] * 100score_record= {'GM': np.cumsum(series_pred),'1—AGO': np.cumsum(series_true),'Returnvalue': series_pred,'Real_value': series_true,'Error': error,'RelativeError(%)': (relativeError)

}

scores= DataFrame(score_record, index=index)returnscoresdef __compute(self, k):return (self.x0 - self.a_hat[1] / self.a_hat[0]) * np.exp(-1 * self.a_hat[0] * k) + self.a_hat[1] /self.a_hat[

0]def __return(self, series):

tmp=np.ones(len(series))for i inrange(len(series)):if i ==0:

tmp[i]=series[i]else:

tmp[i]= series[i] - series[i - 1]returntmpdefevaluate(self, series_true, series_pred):

scores=self.score(series_true, series_pred, np.arange(len(series_true)))

error_square=np.dot(scores, np.transpose(scores))

error_avg=np.mean(error_square)

S= 0 #X0的关联度

for i in range(1, len(series_true) - 1, 1):

S+= series_true[i] - series_true[0] + (series_pred[-1] - series_pred[0]) / 2S=np.abs(S)

SK= 0 #XK的关联度

for i in range(1, len(series_true) - 1, 1):

SK+= series_pred[i] - series_pred[0] + (series_pred[-1] - series_pred[0]) / 2SK=np.abs(SK)

S_Sub= 0 #|S-SK|b

for i in range(1, len(series_true) - 1, 1):

S_Sub+= series_true[i] - series_true[0] - (series_pred[i] - series_pred[0]) + ((series_true[-1] -series_true[0])-(

series_pred[i]-series_pred[0]))/ 2S_Sub=np.abs(S_Sub)

T= (1 + S + SK) / (1 + S + SK +S_Sub)

level=0if T >= 0.9:

level= 1

#print ('精度为一级')

elif T >= 0.8:

level= 2

#print ('精度为二级')

elif T >= 0.7:

level= 3

#print ('精度为三级')

elif T >= 0.6:

level= 4

#print ('精度为四级')

return 1 -T, leveldefplot(self, series_true, series_pred, index):

df= pd.DataFrame(index=index)

df['Real'] =series_true

df['Forcast'] =series_pred

plt.figure()

df.plot(figsize=(7, 5))

plt.xlabel('year')

plt.show()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!对于使用Python实现GM(1,1)灰色预测模型,你可以按照以下步骤进行操作: 1. 导入所需的库: ``` import numpy as np import matplotlib.pyplot as plt ``` 2. 定义GM(1,1)灰色预测函数: ``` def gm11(x): n = len(x) # 累加生成 cum_x = np.cumsum(x) # 紧邻均值生成 z = (cum_x[:-1] + cum_x[1:]) / 2.0 # 紧邻均值级比生成 B = np.append(-z.reshape((n-2, 1)), np.ones_like(z.reshape((n-2, 1))), axis=1) Y = x[1:].reshape((n-1, 1)) # 矩阵运算求参数 [[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) # 模型精度的后验差检验 delta = np.abs(Y - (a * z + b)) C = delta.std() / y.std() P = 1.0 * (np.abs(delta - delta.mean()) < 0.6745 * y.std()).sum() / len(delta) # 修正后的灰色预测模型 result = (x[0] - b / a) * np.exp(-a * (list(range(n)) - 1)) - (x[0] - b / a) * np.exp(-a * (list(range(n)) - 2)) # 预测数据 predict = np.abs(result - np.append(x[0], x[:-1])).tolist() return result, predict, C, P ``` 3. 输入数据并调用灰色预测函数进行预测: ``` x = np.array([1, 2, 3, 4, 5, 6]) # 输入数据 result, predict, C, P = gm11(x) # 调用GM(1,)灰色预测函数 ``` 4. 可视化结果: ``` plt.plot(list(range(len(x))), x, marker='o', label='原始数据') plt.plot(list(range(len(x))), result, marker='o', label='预测数据') plt.plot(list(range(len(x))), predict, marker='o', label='残差') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show() ``` 这样,你就可以使用Python编写GM(1,1)灰色预测模型了。希望对你有所帮助!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值