线性梯度下降

一.定义

梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以),本文介绍的是线性梯度下降法。
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

注意:    1.梯度下降法不是一个机器学习算法,只是一种基于搜索的最优化的方法
             2.作用:最小化一个损失函数
             3.梯度上升法:也就是最大化一个效用函数


二.模拟梯度下降

举一个非常简单的例子,如求函数f(x)=(x - 2.5)^2-1 的最小值。
利用梯度下降的方法解题步骤如下:
1.求梯度(即求导)gradient:2(x - 2.5)
2.向梯度相反的方向移动 x( theta ),如下
theta = theta - eta *gradient  ,其中,eta 为步长。如果步长足够小,则可以保证每一次迭代都在减小,但可能导致收敛太慢,如果步长太大,则不能保证每一次迭代都减少,也不能保证收敛。
3.循环迭代步骤2,直到 x 的值变化到使得f(x)在两次迭代之间的差值足够小,比如0.00000001( epsilon = 1e-8 ),也就是说,直到两次迭代计算出来的f(x)基本没有变化,则说明此时f(x)已经达到局部最小值了。
4.此时,输出 x( theta),这个 x 就是使得函数 f(x) 最小时的 x 的取值(J( theta))

import numpy as np
import matplotlib.pyplot as plt
'''
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
在指定的间隔内返回均匀间隔的数字。
返回num均匀分布的样本,在[start, stop]。
这个区间的端点可以任意的被排除在外
'''
plot_x = np.linspace(-1,6,141)
# plot_y = (plot_x - 2.5)**2 - 1
# plt.plot(plot_x,plot_y)
# plt.show()
# theta 参数
def dJ(theta): # 求导之后的值
    return 2*(theta - 2.5)
def J(theta):
    return (theta - 2.5)**2 - 1
eta = 0.1
epsilon = 1e-8  #表示为10的-8次方
theta = 0.0
theta_history = [theta]
while True:
    gradient = dJ(theta)
    last_theta = theta
    # 向倒数的负方向移动
    theta = theta - eta *gradient
    theta_history.append(theta)

    #新的theta的值已经比上一theta的值要小于epsilon就停止
    if(abs(J(theta) - J(last_theta)) < epsilon):
        break
plt.plot(plot_x,J(plot_x))
plt.plot(np.array(theta_history),J(np.array(theta_history)),color='r')
plt.show()
# print(theta)
# print(J(theta))
待续未完……



猜你喜欢

转载自blog.csdn.net/weixin_40446557/article/details/79889454