Python中的梯度下降算法

时间:2017-02-26 19:34:22

标签: python regression gradient-descent

我试图在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)

我不确定为什么这个公式没有提供正确答案。

1 个答案:

答案 0 :(得分:0)

步长似乎太小,而且公差异常大。也许你打算用反过来的方式使用它们?

一般来说,步长是通过反复试验程序确定的:&#34;自然&#34;步长α=1可能导致分歧,因此可以尝试降低价值(例如,采用α=1/2α=1/4等等,直到实现收敛。不要从非常开始小步长。