最优化问题中常常需要求解目标函数的最大值或最小值,比如SVM支持向量机算法需要求解分类之间最短距离,神经网络中需要计算损失函数的最小值,分类树问题需要计算熵的最小或最大值等等。如果目标函数可求导常用梯度法,不能求导时一般选用模式搜索法。
一、梯度法求解最优问题
由数学分析知识可以知道,函数在一个点的梯度方向是函数值增大的最快方向,与之相反,梯度的反方向是函数值变小的最快方向,函数值在定义域内可以用等值线形式来表示。假设求目标函数最小值,可在定义域内任选一点,求出该初始点梯度反方向,沿着这个反向得到新的一个点,再求出新点的梯度反方向,迭代若干次后,可通过计算函数值的误差范围结束迭代,最终获得函数最小值。根据具体的应用,有的是需要计算函数最值,有的应用是需要求满足最值时的自变量(定义域的坐标),梯度法计算过程可以通过下图来理解:

这里需要强调一点,等值线上任选一点后,可沿着梯度下降方向无约束的移动,所以这里讨论的是无约束条件的最优化问题,无约束的问题处理起来还是比较简单的,如果遇到有约束的问题,需要另外的算法,如可行方向搜索等,也可以通过一些方法将有约束的问题变为无约束的问题,具体可参考惩罚函数一章。
用一段代码介绍下梯度法求解最优化问题,本例是用最小二乘法求线性回归问题,如有一组样本数据xi和yi,假设yi=axi+b,即xi和yi存在线性对应关系,其中a,b是未知参数,需要从所给的样本中计算出a,b值。由最小二乘法知,要求出a,b的最优解实际上就是求损失函数
的最小值,当得到最小值后其自变量值:a,b即为线性关系函数的参数,注意这里xi、yi是已知值,来自于样本数据。
import numpy as np import math import scipy from sympy import Matrix import scipy.linalg class optclass(object): def __init__(self, error): self.error = error self.direction=np.array([[1,0],[-1,0],[0,1],[0,-1]]) #求一阶导数 def P_firstderivative(self,step,theta1,theta2, grad_theta1, grad_theta2 ,x,y): d1=0 for i in range(y.shape[0

本文介绍最优化问题中的梯度法和模式搜索法。梯度法利用梯度方向进行迭代寻优,适用于可导函数;模式搜索法则针对不可导或未知形式的目标函数,通过遍历线性空间基方向来寻找最优解。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



