【问题标题】:Gradient Descent Algorithm in PythonPython中的梯度下降算法
【发布时间】:2017-07-17 07:49:03
【问题描述】:

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

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

【问题讨论】:

  • 您能否举一个使用示例,包括实际输出与预期输出?
  • 另外,如果您可以提供一些输入,例如您的特征矩阵的样子,那将非常有帮助。
  • 你是怎么调用这个函数的?
  • 感谢您的回复:我不确定输出是否正确。特征矩阵是房屋销售数据。行中有数千栋房屋,列中有特征/输入(平方英尺、# 浴室等)。我编辑了原始问题并提供了更多信息。
  • 您使用哪个参考来确定应该使用derivative = -2 * np.dot(errors[i],feature_matrix[i]) 来更新weights?据我所知,我们通常使用错误来更新权重/系数,如tutorial 所示

标签: python regression gradient-descent


【解决方案1】:

步长似乎太小,公差异常大。也许您打算反过来使用它们?

通常,步长由试错过程确定:“自然”步长α=1 可能会导致发散,因此可以尝试降低该值(例如取α=1/2,@ 987654323@ 等,直到达到收敛。不要从非常小的步长开始。

【讨论】:

  • 谢谢 - 这些是我的导师提供的。
  • 即使是导师有时也会犯错!步长决定了我们将沿着下降方向移动多少,因此如果我们要取得任何进展,这一定很重要。另一方面,容差用于量化终止标准:梯度是否足够接近 0? [我假设您了解函数的梯度是什么以及我们为什么要尝试将其渲染为 0,否则编写这样的算法并没有太多意义]。所以至少尝试使用步长 1 和容差 = 1e-6 并让我们知道它是如何进行的。你至少应该看到一些进展。
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2014-01-11
  • 2019-06-24
  • 1970-01-01
  • 2017-02-18
相关资源
最近更新 更多