人工智能与机器学习——梯度下降法求函数极值
一、原理介绍
1. 梯度下降法的原理
梯度下降是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。
2. 梯度下降法求解过程
顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)。
其迭代公式为, 其中
代表梯度负方向,
表示梯度方向上的搜索步长。梯度方向我们可以通过对函数求导得到,步长的确定比较麻烦,太大了的话可能会发散,太小收敛速度又太慢。一般确定步长的方法是由线性搜索算法来确定,即把下一个点的坐标看做是ak+1的函数,然后求满足f(ak+1)的最小值的ak+1即可。
因为一般情况下,梯度向量为0的话说明是到了一个极值点,此时梯度的幅值也为0.而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。
3. 牛顿法原理
牛顿法(英语:Newton’s method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。方法使用函数的泰勒级数的前面几项来寻找方程
的根。
4. 牛顿法方法说明
二、用Excel完成函数极值的求解
1. 求解函数题目
用梯度法求二次函数的极小点及极小值,函数如下:
已知初始点,迭代精度
2. 用excel计算
① ∂z/∂x1 计算方法
② ∂z/∂x2 计算方法
③ ⊿x1 计算方法
η*∂z/∂x1
④ ⊿x2 计算方法
η*∂z/∂x2
3. 计算结果
极小点(4,2) 极小值-8
三、用 Python编程完成函数极值的求解
1. 显示函数图像
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import math
from mpl_toolkits.mplot3d import Axes3D
import warnings
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
%matplotlib inline
"""
二维原始图像
1、构建一个函数为 y = x1^2 + 2 x2^2 - 4 x1 - 2 x1 x2 的图像。
2、随机生成X1,X2点,根据X1,X2点生成Y点。
3、画出图像。
"""
def f2(x1,x2):
return x1**2 + 2 * x2**2 - 4*x1 - 2 * x1 * x2
X1 = np.arange(-4,4,0.2)
X2 = np.arange(-4,4,0.2)
X1, X2 = np.meshgrid(X1, X2) # 生成xv、yv,将X1、X2变成n*m的矩阵,方便后面绘图
Y = np.array(list(map(lambda t : f2(t[0],t[1]),zip(X1.flatten(),X2.flatten()))))
Y.shape = X1.shape # 1600的Y图还原成原来的(40,40)
%matplotlib inline
#作图
fig = plt.figure(facecolor='w')
ax = Axes3D(fig)
ax.plot_surface(X1,X2,Y,rstride=1,cstride=1,cmap=plt.cm.jet)
ax.set_title(u'$ y = x1^2 + 2 x2^2 - 4 x1 - 2 x1 x2 $')</