今天发现一个特别简单又有内涵的问题,我说它简单,是因为从程序修复的角度,一般人都能修改,说它有内涵,是因为它确实可以引发一些思考。
问题是这样的:
Traceback (most recent call last):
File "C:/Users/LENOVO/Desktop/youyong.a", line 1, in <module>
import numpy as np
File "D:\python37\numpy.py", line 6, in <module>
add = [X0[0] + X0[1]]
IndexError: list index out of range
在灰色预测中出现这个问题该怎么解决?
这个错误翻译过来就是:indexerror:列表索引超出范围,有一点编程经验的人都知道,这是因为取的列表下标没有而导致报错。
就好像你去银行取钱,本来只有50块,但是你非要取100块,那肯定取不出,提示你余额不足。
基于严谨的原则,我去找了源码,打算运行一下,看为什么出错,下面是部分代码:
import numpy as np
import math as mt
X0 = ['数据']
# 累加数列
X1 = [X0[0]]
add = X0[0] + X0[1]
X1.append(add)
i = 2
while i < len(X0):
add = add + X0[i]
X1.append(add)
i += 1
乍一看,会觉得一头雾水,觉得自己可以解决,又不可以解决,就是这样矛盾的感觉。
我开始也是这样的感觉,我还特意仔细读了原文,我发现好像要去学高等数学?
越想越远的感觉,我直接运行了代码,果然是上面这个错误:
add = [X0[0] + X0[1]]
IndexError: list index out of range
难道我真的要去雪高等数学来解决这个问题吗?
答案当然是否定的。
我不觉得我可以在短时间内能学好这部分的高等数学,然后继续完成这个题目,应该还有我忽略的地方。
瞬间也有了那种学了那么多年的编程,感觉还是有点心慌,到底是不是选错专业了,应该去学数学,是不是学编程没什么用了?
在我想不出解决方法的时候,我打算看看gpt对于这个问题有什么见解。
我随意的把问题发给通义千问,本来没指望它能帮我解决这个简单到不能算是问题的问题,在它输出不到两行的瞬间,我就抓住了重点,数据,再联系上下文,原来的预测模型的这个意思:把你真实得历史数据放到数据这个列表,然后通过这个预测模型,生成一些未来的预测数据,以辅助我们进行决策。
完整源代码是这样的:
import numpy as np
import math as mt
X0 = ['数据']
# 累加数列
X1 = [X0[0]]
add = X0[0] + X0[1]
X1.append(add)
i = 2
while i < len(X0):
add = add + X0[i]
X1.append(add)
i += 1
# 紧邻均值序列
Z = []
j = 1
while j < len(X1):
num = (X1[j] + X1[j - 1]) / 2
Z.append(num)
j = j + 1
# 最小二乘法计算
Y = []
x_i = 0
while x_i < len(X0) - 1:
x_i += 1
Y.append(X0[x_i])
Y = np.mat(Y)
Y = Y.reshape(-1,1)
B = []
b = 0
while b < len(Z):
B.append(-Z[b])
b += 1
B = np.mat(B)
B = B.reshape(-1,1)
c = np.ones((len(B),1))
B = np.hstack((B,c))
print("B",B)
# 求出参数
alpha = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
a = alpha[0,0]
b = alpha[1,0]
print('alpha',alpha)
print("a=",a)
print("b=",b)
# 生成预测模型
GM = []
GM.append(X0[0])
did = b/a
k = 1
while k < len(X0):
GM.append((X0[0] - did) * mt.exp(-a * k) + did)
k += 1
# 做差得到预测序列
G = []
G.append(X0[0])
g = 1
while g < len(X0):
G.append(round(GM[g] - GM[g - 1]))
g += 1
print("预测数列为:",G)
问题来源:
https://ask.csdn.net/questions/8102092