我试图在python中编写一个梯度下降函数,作为多元线性回归练习的一部分。它运行,但不计算正确的答案。我的代码如下。我已经尝试了几个星期来完成这个问题,但没有取得任何进展。
我相信我理解梯度下降的概念来优化多元线性回归函数以及“数学”数学'是正确的。我相信错误在我的代码中,但我仍在学习python。非常感谢您的帮助。
def regression_gradient_descent(feature_matrix,output,initial_weights,step_size,tolerance):
from math import sqrt
converged = False
weights = np.array(initial_weights)
while not converged:
predictions = np.dot(feature_matrix,weights)
errors = predictions - output
gradient_sum_squares = 0
for i in range(len(weights)):
derivative = -2 * np.dot(errors[i],feature_matrix[i])
gradient_sum_squares = gradient_sum_squares + np.dot(derivative, derivative)
weights[i] = weights[i] - step_size * derivative[i]
gradient_magnitude = sqrt(gradient_sum_squares)
print gradient_magnitude
if gradient_magnitude < tolerance:
converged = True
return(weights)
特征矩阵是:
sales = gl.SFrame.read_csv('kc_house_data.csv',column_type_hints = {'bathrooms':float, 'waterfront':int, 'sqft_above':int, 'sqft_living15':float,'grade':int, 'yr_renovated':int, 'price':float, 'bedrooms':float, 'zipcode':str,'long':float, 'sqft_lot15':float, 'sqft_living':float, 'floors':str, 'condition':int,'lat':float, 'date':str, 'sqft_basement':int, 'yr_built':int, 'id':str, 'sqft_lot':int,'view':int})
我将该功能称为:
train_data,test_data = sales.random_split(.8,seed=0)
simple_features = ['sqft_living']
my_output= 'price'
(simple_feature_matrix, output) = get_numpy_data(train_data, simple_features, my_output)
initial_weights = np.array([-47000., 1.])
step_size = 7e-12
tolerance = 2.5e7
simple_weights = regression_gradient_descent(simple_feature_matrix, output,initial_weights,step_size,tolerance)
** get_numpy_data只是将所有内容转换为数组并按预期工作的函数
更新:我将公式修改为:
derivative = 2 * np.dot(errors,feature_matrix)
它似乎有效。在我的在线课程中推导出这个公式
-2 * np.dot(errors,feature_matrix)
我不确定为什么这个公式没有提供正确答案。
答案 0 :(得分:0)
步长似乎太小,而且公差异常大。也许你打算用反过来的方式使用它们?
一般来说,步长是通过反复试验程序确定的:&#34;自然&#34;步长α=1
可能导致分歧,因此可以尝试降低价值(例如,采用α=1/2
,α=1/4
等等,直到实现收敛。不要从非常开始小步长。