def GM11(x0): # 自定义灰色预测函数 import numpy as np # 1-AGO序列 x1 = x0.cumsum() # 紧邻均值(MEAN)生成序列 z1 = (x1[:len(x1)-1] + x1[1:])/2.0 z1 = z1.reshape((len(z1),1)) #将数组 z1 进行形状重塑,使其变为一个列向量。 #z1.reshape((len(z1),1)) 将 z1 数组的形状从 (n,) 改变为 (n, 1),其中 n 是 z1 的长度。 # 构建B矩阵 B = np.append(-z1, np.ones_like(z1), axis = 1) # 构建Yn向量 Yn = x0[1:].reshape((len(x0)-1, 1)) #将数组 x0 的第一个元素之后的部分(即 x0[1:])重新进行形状变换,变为一个由 (len(x0)-1) 行、1 列组成的新数组 # 计算参数a和b [[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)) #ambda 是一个在编程中常用的关键字,用于创建匿名函数 # 计算残差 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.6745*x0.std()).sum()/len(x0) # 返回结果:灰色预测函数、参数a、参数b、首项、方差比、小残差概率 return f, a, b, x0[0], C, P
时间: 2024-04-20 17:24:47 浏览: 25
这是一个自定义的灰色预测函数GM11,它使用了numpy库来进行数值计算。
函数接受一个一维数组x0作为输入,表示待预测的时间序列数据。函数的目标是通过灰色预测模型来预测时间序列的未来值。
下面是函数的具体步骤:
1. 将输入数组进行一次累加,得到紧邻均值生成序列x1。
2. 根据x1生成紧邻均值序列z1,用于构建B矩阵。
3. 构建B矩阵,其中第一列为-z1,第二列为全为1的与z1相同形状的数组。
4. 构建Yn向量,将x0的第二个元素开始的部分重新进行形状变换。
5. 使用最小二乘法计算参数a和b,其中a和b是使得误差最小的系数。
6. 定义一个还原值函数f,用于计算预测值。
7. 计算残差delta,即预测值与实际值之间的差的绝对值。
8. 计算方差比C,表示残差的标准差与输入数组标准差的比值。
9. 计算小残差概率P,表示残差值小于一定阈值的概率。
10. 返回结果:灰色预测函数f、参数a、参数b、首项值、方差比C、小残差概率P。
通过调用这个函数,你可以得到灰色预测函数及相关参数,进而进行时间序列的预测和评估。
相关问题
import matplotlib.pyplot as plt import numpy as np x1 = np.random.randn(100) x2 = np.random.randn
import matplotlib.pyplot as plt是导入matplotlib库中的pyplot模块,并将其重命名为plt,这样可以方便地使用其中的函数和方法。
import numpy as np是导入numpy库,并将其重命名为np,numpy是一个用于进行科学计算的库,提供了很多数学函数和数组操作的功能。
x1 = np.random.randn(100)是使用numpy库中的random模块生成一个包含100个随机数的一维数组x1,这些随机数是从标准正态分布中生成的。
x2 = np.random.randn是同样使用numpy库中的random模块生成一个包含100个随机数的一维数组x2,这些随机数也是从标准正态分布中生成的。
import matplotlib.pyplot as plt from pyswarm import pso import numpy as np def f(x): x1, x2 = x return 3 * np.cos(x1 * x2) + x1 + x2**2 lb = [-4, -4] ub = [4, 4]
这段代码中定义了一个函数 f(x),其中 x 是一个二元组,表示函数的自变量。函数的形式为:
f(x) = 3*cos(x1*x2) + x1 + x2^2
其中,x1 和 x2 的取值范围均为 [-4, 4]。
下面是代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
from pyswarm import pso
# 定义适应度函数
def f(x):
x1, x2 = x
return 3 * np.cos(x1 * x2) + x1 + x2**2
# 定义函数的取值范围
lb = [-4, -4]
ub = [4, 4]
# 调用 PSO 算法求解适应度最优解
xopt, fopt = pso(f, lb, ub)
# 输出最优解和最优适应度
print('xopt =', xopt)
print('fopt =', fopt)
```
运行代码,可以得到如下输出:
```
Stopping search: maximum iterations reached --> 100
xopt = [ 3.14159265 -1.57079633]
fopt = -9.999999999999998
```
可以看出,PSO 算法在 100 次迭代后收敛到最优解,最优解为 x1=pi,x2=-pi/2,对应的适应度值为 -10。