def GM11(x0): x1 = x0.cumsum() z1 = (x1[:len(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)) [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Yn) #计算参数 f = lambda k: (x0[0]- b/a)*np.exp(-a*(k-1)) - (x0[0]- b/a)*np.exp(-a*(k-2)) delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0) + 1)])) C = delta.std()/x0.std() P = 1.0*(np.abs(delta = delta.mean()) < 0.6*745*x0.std()).sum()/len(x0) return f,a,b,x0[0],C,P
时间: 2023-06-25 07:03:11 浏览: 165
这是一个用于灰色预测的GM(1,1)模型的代码实现。GM(1,1)模型是一种基于灰色系统理论的预测方法,它适用于数据量较小、无法建立完整的数学模型、且具有一定规律性的数据序列预测。
该函数的输入是一个一维数组x0,表示待预测的数据序列。该函数的输出包括预测结果f、模型参数a和b、数据序列的首项x0[0]、预测误差比C和精度P。
具体的实现过程为:
1. 对原始数据进行累加,得到一次累加序列x1。
2. 计算均值生成矩阵z1。
3. 建立累加数据与均值的关系矩阵B。
4. 根据累加数据计算出一次微分序列Yn。
5. 使用最小二乘法计算出模型参数a和b。
6. 计算预测值f,并计算预测误差delta。
7. 计算预测误差比C和预测精度P。
8. 返回预测结果f、模型参数a和b、数据序列的首项x0[0]、预测误差比C和精度P。
相关问题
def GM11(x0): x1 = np.cumsum(x0) z1 = (x1[:-1] + x1[1:]) / 2.0 B = np.append(-z1.reshape(-1, 1), np.ones_like(z1).reshape(-1, 1), axis=1) Y = x0[1:].reshape(-1, 1) [[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) X = np.zeros_like(x0) X[0] = x0[0] for i in range(1, len(x0)): X[i] = (x0[0] - b/a) * np.exp(-a*(i-1)) - (x0[0] - b/a) * np.exp(-a*i) return X X0 = data['close'].values X1 = np.array([GM11(X0[i:i+5]) for i in range(len(X0)-4)]) s = np.zeros(len(X0)) s[0] = 1 for i in range(1, len(X0)): if X0[i] > X1[:, i-1].max(): s[i] = np.argmin(X1[:, i-1]) + 2 else: s[i] = np.argmin(X1[:, i-1]) + 1 --------------------------------------------------------------------------- IndexError Traceback (most recent call last) D:\.temp\ipykernel_10000\3121687314.py in <module> 5 s[0] = 1 6 for i in range(1, len(X0)): ----> 7 if X0[i] > X1[:, i-1].max(): 8 s[i] = np.argmin(X1[:, i-1]) + 2 9 else: IndexError: index 5 is out of bounds for axis 1 with size 5给出修正的代码
修正后的代码如下:
```
import numpy as np
def GM11(x0):
x1 = np.cumsum(x0)
z1 = (x1[:-1] + x1[1:]) / 2.0
B = np.append(-z1.reshape(-1, 1), np.ones_like(z1).reshape(-1, 1), axis=1)
Y = x0[1:].reshape(-1, 1)
[[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)
X = np.zeros_like(x0)
X[0] = x0[0]
for i in range(1, len(x0)):
X[i] = (x0[0] - b/a) * np.exp(-a*(i-1)) - (x0[0] - b/a) * np.exp(-a*i)
return X
X0 = data['close'].values
X1 = np.array([GM11(X0[i:i+5]) for i in range(len(X0)-4)])
s = np.zeros(len(X0))
s[0] = 1
for i in range(1, len(X0)-4):
if X0[i+4] > X1[:, i].max():
s[i+4] = np.argmin(X1[:, i]) + 2
else:
s[i+4] = np.argmin(X1[:, i]) + 1
```
主要修改了两处:
1. 在生成 X1 时,循环的范围改为 `range(len(X0)-4)`,因为每个 5 个数据才能生成一个 GM(1,1) 模型,因此最后 4 个数据不能构成 GM(1,1) 模型。
2. 在计算 s 时,由于 X1 的每一列代表的是对应时间段内的预测值,因此需要将索引 `i-1` 改为 `i`,同时将 `X0[i]` 改为 `X0[i+4]`,表示当前判断的是时间段的最后一个数据的值。
(143,9)的DataFrame与(143.7)的DataFrame在做以下操作时import numpy as np def GM11(x0): # 灰色预测模型 x1 = np.cumsum(x0) z1 = (x1[:len(x1)-1] + x1[1:])/2.0 z1 = z1.reshape((len(z1),1)) B = np.append(-z1, np.ones_like(z1), axis=1) Y = x0[1:].reshape((len(x0)-1, 1)) [[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) return (a, b) def GM11_predict(x0, a, b): # 预测函数 result = [] for i in range(1, 11): result.append((x0[0]-b/a)*(1-np.exp(a))*np.exp(-a*(i-1))) result.append((x0[0]-b/a)*(1-np.exp(a))*np.exp(-a*10)) return result # 计算灰色关联度 def Grey_Relation(x, y): x = np.array(x) y = np.array(y) x0 = x[0] y0 = y[0] x_model = GM11(x) y_model = GM11(y) x_predict = GM11_predict(x, *x_model) y_predict = GM11_predict(y, *y_model) delta_x = np.abs(x-x_predict)/np.abs(x).max() delta_y = np.abs(y-y_predict)/np.abs(y).max() grey_relation = 0.5*np.exp(-0.5*((delta_x-delta_y)**2).sum()) return grey_relation # 计算灰色关联度矩阵 def Grey_Relation_Matrix(data1, data2): matrix = [] for i in range(data1.shape[1]): row = [] for j in range(data2.shape[1]): x = data1.iloc[:, i].tolist() y = data2.iloc[:, j].tolist() grey_relation = Grey_Relation(x, y) row.append(grey_relation) matrix.append(row) return np.array(matrix) # 计算人口-经济的灰色关联度矩阵 relation_matrix = Grey_Relation_Matrix(pop_data, eco_data),发生了以下错误:operands could not be broadcast together with shapes (143,) (11,) ,请写出问题所在,并给出解决代码
问题出在GM11_predict函数中,预测结果result的长度为11,而不是与数据长度相同的143。因此在计算灰色关联度时,x和y的长度不一致,导致了operands could not be broadcast together with shapes (143,) (11,)的错误。
解决方法是将GM11_predict函数中的range(1, 11)修改为range(1, len(x0)),即:
```
def GM11_predict(x0, a, b):
result = []
for i in range(1, len(x0)):
result.append((x0[0]-b/a)*(1-np.exp(a))*np.exp(-a*(i-1)))
result.append((x0[0]-b/a)*(1-np.exp(a))*np.exp(-a*(len(x0)-1)))
return result
```
这样可以保证预测结果的长度与数据长度相同,避免了长度不一致的问题。
阅读全文