我正在尝试应用均方误差梯度下降解决方案来找到某些数据的指数最佳拟合方程。我的解决方案在一半的时间里完美运行,但在另一半完全失败......例如,当我发送 time1 和 values1 列表时,解决方案似乎发散到无穷大。但是,如果我从这些相同的列表中删除最后一项,则代码会生成正确的值(列出 time2 和 values2)。有趣的是,如果列表的最后一个值更改为 15,则该解决方案也有效。但是任何高于 16 的值都会失败。
我完全不知道为什么这不起作用。任何帮助将不胜感激。我怀疑解决方案植根于一些我不完全理解的数学......
def Grad_a_MSE(X,Y,param1,param2):#where param1 = a and param2 = b
e=0
N=len(X)
for i in range(len(X)):
e=e+2/N*(param1 + param2*X[i]-Y[i])
return e
def Grad_b_MSE(X,Y,param1,param2):
e=0
N=len(X)
for i in range(len(X)):
e=e+2/N*X[i]*(param1 + param2*X[i]-Y[i])
return e
def MSEtotal(time, total_cells):
'''
computes the gradient descent MSE
'''
total_cells = np.log(np.array(total_cells)) #log transforming data
a = 10
b = 1
epochs = 1000 #num times of interation
epsilon_a = 0.01
epsilon_b = 0.01
for k in range(epochs):
temp_a = a
temp_b = b
a = a - epsilon_a * Grad_a_MSE(time, total_cells, temp_a, temp_b)
b = b - epsilon_b * Grad_b_MSE(time, total_cells, temp_a, temp_b)
return (a, b)
time1 = [0, 4, 6, 11, 14, 17]
values1 = [2000000.0, 1590179.267489712, 2045193.672839506, 10078939.432098765, 15084990.442386832, 18604270.462962963]
print(MSEtotal(time1, values1))
time2 = [0, 4, 6, 11, 14]
values2 = [2000000.0, 1590179.267489712, 2045193.672839506, 10078939.432098765, 15084990.442386832]
print(MSEtotal(time2, values2))