机器学习中导数最优化方法(基础篇)
2016-03-29 13:07
295 查看
1. 前言
熟悉机器学习的童鞋都知道,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解无约束最优化问题。实现简单,coding 方便,是训练模型的必备利器之一。这篇博客主要总结一下使用导数的最优化方法的几个基本方法,梳理梳理相关的数学知识,本人也是一边写一边学,如有问题,欢迎指正,共同学习,一起进步。2. 几个数学概念
1) 梯度(一阶导数)
考虑一座在 (x1, x2) 点高度是 f(x1, x2) 的山。那么,某一点的梯度方向是在该点坡度最陡的方向,而梯度的大小告诉我们坡度到底有多陡。注意,梯度也可以告诉我们不在最快变化方向的其他方向的变化速度(二维情况下,按照梯度方向倾斜的圆在平面上投影成一个椭圆)。对于一个含有 n 个变量的标量函数,即函数输入一个 n 维 的向量,输出一个数值,梯度可以定义为:# Code from Chapter 11 of Machine Learning: An Algorithmic Perspective # by Stephen Marsland (http://seat.massey.ac.nz/personal/s.r.marsland/MLBook.html) # The conjugate gradients algorithm from numpy import * def Jacobian(x): #return array([.4*x[0],2*x[1]]) return array([x[0], 0.4*x[1], 1.2*x[2]]) def Hessian(x): #return array([[.2,0],[0,1]]) return array([[1,0,0],[0,0.4,0],[0,0,1.2]]) def CG(x0): i=0 k=0 r = -Jacobian(x0) p=r betaTop = dot(r.transpose(),r) beta0 = betaTop iMax = 3 epsilon = 10**(-2) jMax = 5 # Restart every nDim iterations nRestart = shape(x0)[0] x = x0 while i < iMax and betaTop > epsilon**2*beta0: j=0 dp = dot(p.transpose(),p) alpha = (epsilon+1)**2 # Newton-Raphson iteration while j < jMax and alpha**2 * dp > epsilon**2: # Line search alpha = -dot(Jacobian(x).transpose(),p) / (dot(p.transpose(),dot(Hessian(x),p))) print "N-R",x, alpha, p x = x + alpha * p j += 1 print x # Now construct beta r = -Jacobian(x) print "r: ", r betaBottom = betaTop betaTop = dot(r.transpose(),r) beta = betaTop/betaBottom print "Beta: ",beta # Update the estimate p = r + beta*p print "p: ",p print "----" k += 1 if k==nRestart or dot(r.transpose(),p) <= 0: p = r k = 0 print "Restarting" i +=1 print x x0 = array([-2,2,-2]) CG(x0)
参考资料:
[1] Machine Learning: An Algorithmic Perspective, chapter 11
[2] 最优化理论与算法(第2版),陈宝林
[3] wikipedia
相关文章推荐
- 常用排序算法总结(二)
- linux下删除空行的几种方法
- js 事件冒泡 测试
- Eclipse appearance theme
- 为什么说DOM操作很慢
- 栈的应用——实现简易计算器(一)
- JavaSe基础(3)-- 循环结构
- 栈的应用——实现简易计算器(一)
- C++的那些事:流与IO类
- 16-3-28华为校招体验题答案,思考和总结
- [LeetCode] Nim Game
- java微信支付实现流程
- GridView 中取值的方法汇总
- 初步理解反射机制
- Oracle function real_st_astext,解决ArcSDE中st_astext函数返回字符串结构异常问题
- 漫谈:机器学习中距离和相似性度量方法
- Java的abstract类与接口的比较
- PHP-点滴记录
- JavaSe基础(2)-- 分支结构
- matlab 学习