一段有关线搜索的从python到matlab的代码
在Udacity上很多关于机器学习的课程几乎都是基于python语言的,博主“ttang”的博文“重新发现梯度下降法——backtracking line search”里对回溯线搜索的算法实现也是用python写的,这对没有接触过python的我来说,内心是非常“抓狂”的。看到代码有想看到运行结果的冲动,暂时又不想去下载软件,好在这段代码简单、清晰,不信,你看原代码【1】
# -*- coding: cp936 -*-
#optimization test, y = (x-3)^2
from matplotlib.pyplot import figure, hold, plot, show, xlabel, ylabel, legend
def f(x):
"The function we want to minimize"
return (x-3)**2
def f_grad(x):
"gradient of function f"
return 2*(x-3)
x = 0
y = f(x)
err = 1.0
maxIter = 300
curve = [y]
it = 0
step = 0.1
#下面展示的是我之前用的方法,看上去貌似还挺合理的,但是很慢
while err > 1e-4 and it < maxIter:
it += 1
gradient = f_grad(x)
new_x = x - gradient * step
new_y = f(new_x)
new_err = abs(new_y - y)
if new_y > y: #如果出现divergence的迹象,就减小step size
step *= 0.8
err, x, y = new_err, new_x, new_y
print 'err:', err, ', y:', y
curve.append(y) print 'iterations: ', it
figure(); hold(True); plot(curve, 'r*-')
xlabel('iterations'); ylabel('objective function value') #下面展示的是backtracking line search,速度很快
x = 0
y = f(x)
err = 1.0
alpha = 0.25
beta = 0.8
curve2 = [y]
it = 0 while err > 1e-4 and it < maxIter:
it += 1
gradient = f_grad(x)
step = 1.0
while f(x - step * gradient) > y - alpha * step * gradient**2:
step *= beta
x = x - step * gradient
new_y = f(x)
err = y - new_y
y = new_y
print 'err:', err, ', y:', y
curve2.append(y) print 'iterations: ', it
plot(curve2, 'bo-')
legend(['gradient descent I used', 'backtracking line search'])
show()
确实是为了观察实验结果,暂时又不想去装python,就把上面的代码改成了matlab code
% optimization test, y = (x-3)^2
% -*- zw -*-
f=@(x)(x-3)^2;
diff_f=@(x)2*(x-3);
x = 0;
y = f(x);
err = 1.0;
maxIter = 300;
curve = [];
iter = 0;
step = 0.1;
% 下面展示的是我之前用的方法,看上去貌似还挺合理的,但是很慢
while err > 1e-4 && iter < maxIter
iter=iter+ 1;
gradient = diff_f(x);
new_x = x - gradient * step;
new_y = f(new_x);
new_err = abs(new_y - y);
if new_y > y
% 如果出现divergence的迹象,就减小step size
step =step* 0.8;
end
err=new_err;
x=new_x;
y=new_y; fprintf('iteration: %d, err: %f, y: %f \n',iter, err, y);
curve(iter)=y;
end figure(); axes('linewidth',1, 'box', 'on', 'FontSize',16);
hold on; plot(curve, 'r*-')
xlabel('iterations'); ylabel('objective function value') % 下面展示的是backtracking line search,速度很快
x = 0;
y = f(x);
err = 1.0;
alpha = 0.25;
beta = 0.8;
curve2 = [];
iter = 0; while err > 1e-4 && iter < maxIter
iter =iter+ 1;
gradient = diff_f(x);
step = 1.0;
while f(x - step * gradient) > y - alpha * step * gradient^2
step =step* beta;
end
x = x - step * gradient;
new_y = f(x);
err = y - new_y;
y = new_y;
fprintf( 'iteration: %d, err: %f, y: %f \n', iter,err, y);
curve2(iter)=y;
end plot(curve2, 'bo-')
legend('gradient descent I used', 'backtracking line search')
Matlab代码运行的结果
部分细节问题可以参考和对比原博文【1】。
参考:
【1】http://www.cnblogs.com/fstang/p/4192735.html
一段有关线搜索的从python到matlab的代码的更多相关文章
- THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。
问题: 上述内容中,标题和学年属于一个数据表.分类则属于另外一个数据表,并且是利用id关联后,另外一个数据表中的title字段. 需要设置关键字搜索,实现多表关联查询和多表字段的关键字搜索. 解决方法 ...
- [原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
[原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则 转载请注明出处:http://www.codelast.com/ line search(一维 ...
- 【原创】回溯线搜索 Backtracking line search
机器学习中很多数值优化算法都会用到线搜索(line search).线搜索的目的是在搜索方向上找到是目标函数\(f(x)\)最小的点.然而,精确找到最小点比较耗时,由于搜索方向本来就是近似,所以用较小 ...
- 用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
转载请注明出处:http://www.codelast.com/ line search(一维搜索,或线搜索)是最优化(Optimization)算法中的一个基础步骤/算法.它可以分为精确的一维搜索以 ...
- 线搜索(line search)方法
在机器学习中, 通常需要求某个函数的最值(比如最大似然中需要求的似然的最大值). 线搜索(line search)是求得一个函数\(f(x)\)的最值的两种常用迭代方法之一(另外一个是trust re ...
- 50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段
50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段 本文会给你们展示50个jquery代码片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从j ...
- [转]numpy线性代数基础 - Python和MATLAB矩阵处理的不同
转自:http://blog.csdn.net/pipisorry/article/details/45563695 http://blog.csdn.net/pipisorry/article/de ...
- 如何调用另一个python文件中的代码
模块的搜索路径 模块的搜索路径都放在了sys.path列表中,如果缺省的sys.path中没有含有自己的模块或包的路径,可以动态的加入(sys.path.apend)即可.下面是sys.path在Wi ...
- 利用Python编写Windows恶意代码!自娱自乐!勿用于非法用途!
本文主要展示的是通过使用python和PyInstaller来构建恶意软件的一些poc. 利用Python编写Windows恶意代码!自娱自乐!勿用于非法用途!众所周知的,恶意软件如果影响到了他人的生 ...
随机推荐
- 利用NPOI导出Word文档帮助类
/// <summary> /// NPOI操作Word /// </summary> public class NpoiWordHelper { /// <summar ...
- JAVA计算字符串UTF-8字节数
String str = "C++/C#/JAVA软件开发"; try { System.out.println(str.getBytes("UTF-8").l ...
- 【转载】java8 自定义TemporalAdjuster
有的时候,你需要进行一些更加复杂的操作,比如,将日期调整到下个周日.下个工作日,或者是本月的最后一天.这时,你可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdju ...
- (四)循环队列 VS 数组队列 (效率对比)
目录 背景 测试代码 结果 链表 随机访问 背景 各自完成插入 10万.20万 条随机数,然后再将这些随机数出队列 : 测试代码 /** * 测试速度 */ public String testSpe ...
- vs code 更改快捷键
选择左下角设置图标,快捷键方式 文件列表修改,搜 list 文件tree list.focusUp -> ctrl+p
- linux tcp listen函数的参数backlog
1 listen函数(http://man7.org/linux/man-pages/man2/listen.2.html) int listen(int sockfd, int backlog); ...
- S03_CH01_AXI_DMA_LOOP 环路测试
S03_CH01_AXI_DMA_LOOP 环路测试 1.1概述 本课程是本季课程里面最简单,也是后面DMA课程的基础,读者务必认真先阅读和学习. 本课程的设计原理分析. 本课程是设计一个最基本的DM ...
- 第一章、web应用安全概论--web应用系统介绍--TCP/IP协议
TCP/IP协议源于1969年,是国际互联网Internet采用的协议标准TCP/IP协议是一组通信协议的代名词,是由一系列协议组成的协议族,本身是指两个协议集: TCP--传输控制协议 ...
- MySQL 聚合函数与count()函数
一.MySQL中的聚合函数 MySQL 5.7文档的章节:12.20.1 Aggregate (GROUP BY) Function “聚合/组合”函数(group (aggregate) funct ...
- nginx反向代理服务器以及负载均衡,从安装到配置
nginx的具体作用不用细说,很强大,做负载均衡.反向代理服务器解决前端跨域问题等等.下面是nginx的安装过程 首先nginx主要的依赖: pcre. pcre-devel zlib zlib-de ...