Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的梯度下降算法_Python_Regression_Gradient Descent - Fatal编程技术网

Python中的梯度下降算法

Python中的梯度下降算法,python,regression,gradient-descent,Python,Regression,Gradient Descent,我正在尝试用python编写一个梯度下降函数,作为多元线性回归练习的一部分。它运行,但不计算正确答案。我的代码如下。我已经试了几个星期来解决这个问题,但没有取得任何进展 我相信我理解梯度下降的概念来优化多元线性回归函数,而且“数学”是正确的。我相信错误在我的代码中,但我仍在学习python。非常感谢你的帮助 def regression_gradient_descent(feature_matrix,output,initial_weights,step_size,tolerance):

我正在尝试用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)
我将函数调用为:

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
可能会导致发散,因此可以尝试降低该值(例如,取
α=1/2
α=1/4
,等等,直到达到收敛。不要从一个很小的步长开始。

你能给出一个使用示例,包括实际输出与预期输出吗?如果你能提供一些输入,比如你的特征矩阵的样子,那将非常有用。你怎么把这个称为f函数?感谢您的回答:我不确定输出是否正确。特征矩阵是房屋销售数据。有数千栋房屋排成一行,特征/输入列成一列(平方英尺、卫生间等)。我编辑了原始问题并提供了更多信息。您使用哪个参考来确定
导数=-2*np.dot(错误)[i] ,特征矩阵[i])
应用于更新
权重
?据我所知,我们通常使用误差来更新权重/系数,如本文所示,感谢-这些都是我的导师提供的。即使是导师有时也会出错!步长决定了我们将沿下降方向移动多少,因此,如果我们要实现目标,这一点必须非常重要ve任何进展。另一方面,公差用于量化终止标准:梯度是否足够接近0?[我假设您了解函数的梯度是什么,以及为什么我们试图将其渲染为0,否则,编程这样的算法实际上没有多少意义].因此,至少尝试使用步长为1且公差为1e-6的方法,并让我们知道它是如何进行的。您至少应该看到一些进展。
-2 * np.dot(errors,feature_matrix)