【六、梯度下降法gradient descent】

6-1 what is gradient descent

损失函数J 减小的方向 就是 导数的负方向

【六、梯度下降法gradient descent】_第1张图片

【六、梯度下降法gradient descent】_第2张图片

n为学习率learning rate,n影响获得最优解的速度。

6-2 gradient descent simulation

[思想] 梯度下降法是,初始点的导数代表函数增减方向,J(θ-dJ/dθ)<=J(θ).

[code]

import numpy as np
import matplotlib.pyplot as plt
plot_x = np.linspace(-1., 6., 500)
plot_y = (plot_x - 2.5)**2 - 1 #设一个函数
def dJ(theta):#导数
        return 2*(theta - 2.5)
def J(theta):#函数值
    try:
        return (theta - 2.5)**2 -1
    except:
        return float('inf')#无穷大
def plot_theta_history():#绘制参数theta的折线图
    plt.plot(plot_x, J(plot_x))#J 和theta的折线图
    plt.plot(np.array(theta_history), J(np.array(theta_history)), color='r', marker='+')#导数取值和对应J的折线图
    plt.show()
def gradient_descent(initial_theta, eta, n_iters=1e4, epsilon=1e-8):#初始求导点initial_theta,学习率eta,求导次数n_iters,J与上一次J的取值差
    theta = initial_theta
    i_iters = 0
    theta_history.append(initial_theta)
    j_history.append(J(initial_theta))
    while i_iters < n_iters:
        gradient = dJ(theta)
        last_theta = theta
        theta = theta - eta * gradient#梯度下降法公式 -n*(dJ/dθ),J(θ-dJ/dθ)<=J(θ)
        theta_history.append(theta)
        j_history.append(J(theta))
        if(abs(J(theta) - J(last_theta)) < epsilon):#求导次数
            break
        i_iters += 1
eta = 0.01 #learning rate
theta = 0.#初始求导点
theta_history = []
j_history = []
gradient_descent(0., eta)
plot_theta_history()
print(theta_history)
print(j_history)
print(j_history[-3],j_history[-4],"the last but 2 difference value:",j_history[-4]-j_history[-3])
print(j_history[-1],j_history[-2],"the last difference value:",j_history[-2]-j_history[-1])
print(theta_history[-1])

6-3 多元线性回归

【六、梯度下降法gradient descent】_第3张图片

【六、梯度下降法gradient descent】_第4张图片

【六、梯度下降法gradient descent】_第5张图片

【六、梯度下降法gradient descent】_第6张图片

【六、梯度下降法gradient descent】_第7张图片

[notice]在使用梯度下降法 求解 多维数据的时候,比如波斯顿房价数据集中有13个特征,每个特征的数据范围不同,某一维的数据值在1~100或者1e-3~1e-2范围,那么学习率eta或者说步长就不太好设置,取太大会导致数值小的某一维无法收敛,取太小会导致数值大的某一维收敛过程太过于缓慢,因此要做归一化处理。

 

6-5为什么要用梯度下降求解线性回归

在数据集的特征值也就是维度非常多的情况下,使用正规方程求解线性回归非常耗时,而使用梯度下降法比较迅速。

 

 

 

 

你可能感兴趣的:(【六、梯度下降法gradient descent】)