我正在做具有常数和斜率的矢量化梯度下降,它花费的时间比我预期的要长。另外,我现在不想使用库,因为我想先学习自己如何做。
这需要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函数的每一行,这似乎是正确的,所以我真的不知道是什么使梯度下降函数花费了这么长时间。