Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.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_Optimization_Gradient Descent - Fatal编程技术网

在python中实现朴素梯度下降

在python中实现朴素梯度下降,python,optimization,gradient-descent,Python,Optimization,Gradient Descent,我试图在python中实现一个非常简单的梯度下降。然而,它似乎进入了一个无限循环。你能帮我调试一下吗 y = lambda x : x**2 dy_dx = lambda x : 2*x def gradient_descent(function,derivative,initial_guess): optimum = initial_guess while derivative(optimum) != 0: optimum = optimum - derivat

我试图在python中实现一个非常简单的梯度下降。然而,它似乎进入了一个无限循环。你能帮我调试一下吗

y = lambda x : x**2
dy_dx = lambda x : 2*x
def gradient_descent(function,derivative,initial_guess):
    optimum = initial_guess
    while derivative(optimum) != 0:
        optimum = optimum - derivative(optimum)
    else:
        return optimum
gradient_descent(y,dy_dx,5)
编辑:

现在我有了这个代码,我真的无法理解输出。另外,它可能会冻结你的CPU

y = lambda x : x**2
dy_dx = lambda x : 2*x
def gradient_descent(function,derivative,initial_guess):
    optimum = initial_guess
    while abs(derivative(optimum)) > 0.01:
        optimum = optimum - 2*derivative(optimum)
        print((optimum,derivative(optimum)))
    else:
        return optimum
gradient_descent(y,dy_dx,5) 
现在我尝试将其应用于回归问题,但是输出似乎不正确,如下面的输出所示:

修正:D

import matplotlib.pyplot as plt
def stepGradient(x,y):
    step = 0.001
    b_current = 0 
    m_current = 0
    b_gradient = 0
    m_gradient = 0
    N = int(len(x))   
    for i in range(0, N):
        b_gradient += -(1/N) * (y[i] - ((m_current*x[i]) + b_current))
        m_gradient += -(1/N) * x[i] * (y[i] - ((m_current * x[i]) + b_current))
    while abs(b_gradient) > 0.01 or abs(m_gradient) > 0.01:
        b_current = b_current - (step * b_gradient)
        m_current = m_current - (step * m_gradient)
        b_gradient= 0
        m_gradient = 0
        for i in range(0, N):
            b_gradient += -(1/N) * (y[i] - ((m_current*x[i]) + b_current))
            m_gradient += -(1/N) * x[i] * (y[i] - ((m_current * x[i]) + b_current))
    return [b_current, m_current]

x = [1,2, 2,3,4,5,7,8,10]
y = [1.5,3,1,3,2,5,6,7,20]
(b,m) = stepGradient(x,y)


plt.scatter(x,y)
abline_values = [m * i + b for i in x]
plt.plot(x, abline_values, 'b')
plt.show()

只有当计算出的浮点值等于零时,
while
循环才会停止。这很幼稚,因为浮点值很少精确计算。相反,当计算值足够接近零时停止循环。使用类似

while math.abs(derivative(optimum)) > eps:
其中,
eps
是计算值的期望精度。这可以是另一个参数,可能具有默认值
1e-10
或类似值


也就是说,你的问题更严重。你的算法太幼稚了,假设计算

optimum = optimum - 2*derivative(optimum)
将使
最佳值
更接近实际最佳值。在您的特定情况下,变量
optimum
只是在
5
(您的初始猜测)和
-5
之间来回循环。请注意,
5
处的导数为
10
,而
-5
处的导数为
-10

所以你需要避免这样的骑车。您可以将增量
2*导数(最佳值)
乘以小于
1
的值,这将适用于您的特定情况
y=x**2
。但这在一般情况下是行不通的

为了完全安全,用较小的值和较大的值“括住”您的最佳点,并使用导数找到下一个猜测。但请确保您的下一次猜测不会超出括号内的间隔。如果确实如此,或者如果你的猜测收敛太慢,请使用另一种方法,如二分法或黄金分割搜索


当然,这意味着你的“非常幼稚的梯度下降”算法太幼稚了,无法在一般情况下工作。这就是为什么真正的优化例程更复杂。

您的
循环只有在计算出的浮点值等于零时才会停止。这很幼稚,因为浮点值很少精确计算。相反,当计算值足够接近零时停止循环。使用类似

while math.abs(derivative(optimum)) > eps:
其中,
eps
是计算值的期望精度。这可以是另一个参数,可能具有默认值
1e-10
或类似值


也就是说,你的问题更严重。你的算法太幼稚了,假设计算

optimum = optimum - 2*derivative(optimum)
将使
最佳值
更接近实际最佳值。在您的特定情况下,变量
optimum
只是在
5
(您的初始猜测)和
-5
之间来回循环。请注意,
5
处的导数为
10
,而
-5
处的导数为
-10

所以你需要避免这样的骑车。您可以将增量
2*导数(最佳值)
乘以小于
1
的值,这将适用于您的特定情况
y=x**2
。但这在一般情况下是行不通的

为了完全安全,用较小的值和较大的值“括住”您的最佳点,并使用导数找到下一个猜测。但请确保您的下一次猜测不会超出括号内的间隔。如果确实如此,或者如果你的猜测收敛太慢,请使用另一种方法,如二分法或黄金分割搜索


当然,这意味着你的“非常幼稚的梯度下降”算法太幼稚了,无法在一般情况下工作。这就是为什么真正的优化程序更复杂。

您还需要减小步长(梯度下降公式中的gamma):


您还需要减小步长(渐变下降公式中的gamma):


梯度下降的问题是它很少达到0的导数。当梯度较高时,该过程运行良好,但当其达到微小变化时,表明该过程将围绕最佳点旋转。试着给while循环写一个限制,或者使导数大于一个小的epsilon值,比如0.0001。你说的“输出似乎不正确”是什么意思?显示预期输出和实际获得的输出(控制台输出、回溯、图表等)。你提供的细节越多,你可能得到的答案就越好。检查和。梯度下降的问题是它很少达到0的导数。当梯度较高时,该过程运行良好,但当其达到微小变化时,表明该过程将围绕最佳点旋转。试着给while循环写一个限制,或者使导数大于一个小的epsilon值,比如0.0001。你说的“输出似乎不正确”是什么意思?显示预期输出和实际获得的输出(控制台输出、回溯、图表等)。你提供的细节越多,你可能得到的答案就越好。检查和。谢谢。我刚试过,但是循环仍然在继续。对不起,我以为ppl会运行代码,我会很快用图表更新它。谢谢。我刚试过,但循环仍在继续。对不起,我以为ppl会运行代码,我会很快用图表更新它。谢谢,算法有效,但返回不起作用,我如何使函数返回最终最优值谢谢,算法有效,但返回不起作用,我如何使函数返回最终最优值