Python中使用均方误差的梯度下降法发散到无穷大

时间:2021-07-22 17:17:18

标签: python machine-learning math gradient-descent mean-square-error

我正在尝试应用均方误差梯度下降解决方案来找到某些数据的指数最佳拟合方程。我的解决方案有一半的时间可以正常工作,但另一半完全失败......例如,当我发送 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))


0 个答案:

没有答案
相关问题