机器学习中的优化方法

一、无约束的优化问题
1、梯度下降法:先给定一个初始值,然后逐步迭代更新至最优处,核心就是求偏导,都会涉及到泰勒展开等,目的都是找到最佳最快的收敛点,这种策略需要计算所有实例的偏导,计算量比较大.由于梯度太大,可能会导致自变量沿着负梯度方向变化时,偏导的值出现震荡,而不是一直变小,所以在梯度的前面乘上一个很小的系数?(学习率),对初始化的系数进行更新.优化的版本是采用随机梯度下降法,随机选取部分点来求偏导,来减少计算量,效果往往还不错,这种机制在K近邻算法中也会经常用到。
附实现代码,核心公式可参考相关书籍,有详细证明过程:
def gradAscent(dataMat, labelMat):
dataMatrix = mat(dataMat)#转换成矩阵5X3
labelMat = mat(labelMat).transpose()
m,n = shape(dataMatrix)
alpha = 0.001#初始步长
maxCycles = 5#设置迭代次数
theta = ones((n,1))#初始化系数矩阵
for k in range(maxCycles):#开始迭代
yPredict = dot(dataMatrix ,theta)#y的预测值
error = labelMat - yPredict#计算预测值与真实值的误差
theta = theta - alpha * dataMatrix.transpose() * error#迭代
return theta#返回迭代后的系数矩阵
`
2、牛顿法:首先得明确,牛顿法是为了求解函数值为零的时候变量的取值问题的。梯度下降中,步长的初始取值,是一件让人头痛的事,往往需要手动调参N多次才能确定。为了寻找更合适的步长,以便于更快的收敛,引入了牛顿法,该方法自适应更强,其过程是用一组二次曲线,逐步的去逼近最优点。牛顿法需要计算一个Hessian矩阵的逆,才能够迭代,但在实际工程中,计算如此大型的矩阵需要很大的计算资源,不适合高维数据,其实用的相对少一点,更多的用的是拟牛顿法。
详情可见博客:https://blog.csdn.net/wsyhawl/article/details/78220011和https://blog.csdn.net/linolzhang/article/details/60151623
拟牛顿法的基本思想是:在迭代过程中,仅仅利用相邻两个迭代点以及梯度信息,产生一个对称正定矩阵,使之逐步逼近目标函数Hessian矩阵的逆阵。
拟牛顿法的实现有很多种算法,比如DFP算法和BFGS算法等,具体可参考相关资料。
二、有约束的优化问题
有约束的优化问题,总的来说分为两类:
1、有等式条件约束。常常使用的方法就是拉格朗日乘子法(Lagrange Multiplier) ,即把等式约束h_i(x)用一个系数与f(x)写为一个式子,称为拉格朗日函数,而系数称为拉格朗日乘子。通过拉格朗日函数对各个变量求导,令其为零,可以求得候选值集合,然后验证求得最优值。
2、有不等式条件约束。常常使用的方法就是KKT条件。同样地,我们把所有的等式、不等式约束与f(x)写为一个式子,也叫拉格朗日函数,系数也称拉格朗日乘子,通过一些条件,可以求出最优值的必要条件,这个条件称为KKT条件,本质上是一个凸优化问题。
具体推导过程和代码实现,可参考相关资料,网上有很多资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值