12,043
社区成员
发帖
与我相关
我的任务
分享用2005-2021年的建筑材料消耗量预测2022年的建筑材料消耗量,一开始结果预测值出现负值,搜了下后面又取对数,预测值变成了0,如下面的代码,该怎么办啊,有没有大佬知道!!!
import numpy as np
from scipy.integrate import odeint
# 加载数据
a = np.loadtxt("D:\碳排放影响因素数据\预测2022年生产阶段数据\四川.txt") # 加载表中的后5列数据
if a.ndim == 1:
a = a[:, np.newaxis]
n=a.shape[0] #观测数据的个数
# 数据预处理,对数变换
a_log = np.log(a + 1) # 加1是为了避免对0取对数
# 累加生成
x10 = a_log[:, 0]
x20 = a_log[:, 1]
x30 = a_log[:, 2]
x40 = a_log[:, 3]
x50 = a_log[:, 4]
x11 = np.cumsum(x10)
x21 = np.cumsum(x20)
x31 = np.cumsum(x30)
x41 = np.cumsum(x40)
x51 = np.cumsum(x50)
z1 = (x11[:-1] + x11[1:]) / 2.
z2 = (x21[:-1] + x21[1:]) / 2.
z3 = (x31[:-1] + x31[1:]) / 2.
z4 = (x41[:-1] + x41[1:]) / 2.
z5 = (x51[:-1] + x51[1:]) / 2.
B1=np.c_[z1,np.ones((n-1,1))]
u1=np.linalg.pinv(B1).dot(x10[1:]); print(u1)
B2=np.c_[z1,z2]
u2=np.linalg.pinv(B2).dot(x20[1:]); print(u2)
B3=np.c_[z3,np.ones((n-1,1))];
u3=np.linalg.pinv(B3).dot(x30[1:]); print(u3)
B4=np.c_[z1,z3,z4]
u4=np.linalg.pinv(B4).dot(x40[1:]); print(u4)
B5=np.c_[z1,z2,z3,z4,z5]
u5=np.linalg.pinv(B5).dot(x50[1:]); print(u5)
def Pfun(x, t):
x1, x2, x3, x4, x5 = x
return np.array([max(0, u1[0] * x1 + u1[1]),
max(0, u2[0] * x1 + u2[1] * x2),
max(0, u3[0] * x3 + u3[1]),
max(0, u4[0] * x1 + u4[1] * x3 + u4[2] * x4),
max(0, u5[0] * x1 + u5[1] * x4 + u5[2] * x5)])
# 预测
t = np.arange(0, 18)
X0 = np.array([5.810, 2.590, 27.250, 3.570, 0.260])
s1 = odeint(Pfun, X0, t)
s2 = np.diff(s1, axis=0)
xh = np.vstack([X0, s2])
# 反变换,指数变换
pre = np.exp(xh[-1, :]) - 1 # 反变换
cha=a-xh[:-1,:] #计算残差
delta=np.abs(cha/a) #计算相对误差
maxd=delta.max(0) #计算每个指标的最大相对误差
print("最大相对误差:", np.array(maxd).astype(str))
print("预测值为:", np.array(pre).astype(str))