梯度下降功能需要太多迭代

时间:2020-10-13 13:54:50

标签: python numpy machine-learning gradient-descent

我正在做具有常数和斜率的矢量化梯度下降,它花费的时间比我预期的要长。另外,我现在不想使用库,因为我想先学习自己如何做。

这需要15个数据点进行400,000次迭代

学习率:0.0001(最高,不会爆炸)

起始截距/斜率值= [1.0,1.0]

结束条件:np.all(abs(gradient)<0.01)或i == max_steps-1(即使将其更改为0.1,也要进行200,000次迭代)

我正在将函数与最小二乘结果进行比较,即y = 121.11674938673067 + 0.5709681099891601x。我的功能很准确,但是很慢。

我尝试使用较大的数据集(400点),但遇到了同样的问题。

这是我的梯度下降函数

def gradient_descent(y_vals, x_vals, coefs, learning_rate=0.0001, max_steps=1000000):
   for i in range(max_steps):
      gradient = derive_rss(y_vals,x_vals,coefs)
      step_sizes = gradient * learning_rate
      if np.all(abs(gradient)< 0.01) or i==max_steps-1:
         return coefs
      coefs -= step_sizes

这是计算误差导数的函数;我正在使用残差平方和。

def derive_rss(y_vals, x_vals, coefs):
   order = np.linspace(0, len(coefs), len(coefs)+1)
   x_coefs = np.power(np.reshape(x_vals,(x_vals.shape[0], 1)), order)
   coefs = np.reshape(coefs,(coefs.shape[1],1)
   predicted = np.dot(x_coefs,coefs)
   predicted(np.reshape(predicted,(1, predicted.shape[0]))
   observed = np.reshape(y_vals, (1, y_vals.shape[0])
   obs_predict_diff = observed - predicted
   derivative = np.dot(obs_predict_diff, ((-2) * x_coefs))
   derivative /= obs_predict_diff.shape[1]
   return derivative

我基于this视频创建这些功能,我认为唯一改变的是取导数的平均值。我遍历了自己的generate_rss函数的每一行,这似乎是正确的,所以我真的不知道是什么使梯度下降函数花费了这么长时间。

0 个答案:

没有答案