[斯坦福大学2014机器学习教程笔记]第五章-控制语句:for,while,if语句
在本节中,我们将学习如何为Octave程序写控制语句。
首先,我们先学习如何使用for循环。我们将v设为一个10行1列的零向量。
接着,我们写一个for循环,让i等于1到10。写出来就是for i = 1:10。我要设v(i)的值等于2
的i次方,即输入 v(i) = 2^i ,循环的最后要记得写上 end 。这里的空格其实是没有意义的,它们只是为了看起来更加好看。按照这样做,那么结果就如下图所示。
所以这个语句的作用就是:让i遍历1到10的值。还有另外一种方法:设置indices(索引)等于1到10,即输入indices = 1:10; ,这时indices就是一个从1到10的序列。如何可以输入for i = indices. ,这实际上是和for i = 1:10. 是一样的。然后输入disp(i); end 也能得到一个同样的结果。
如果你对 “break” 和 “continue” 语句比较熟悉,Octave里也有 “break” 和 “continue”语句,你也可以在 Octave环境里使用那些循环语句。
但是首先让我告诉你一个 while 循环是如何工作的:
让我们写一个while循环,i=1; while 1<=5, v(i)=100; i=i+1;end; 。这是什么意思呢?我让i取值从1开始,然后我要让v(i)等于100,再让i递增1,直到i大于5停止。
现在来看一下结果,我现在已经取出了向量的前五个元素,把他们用100覆盖掉,这就是一个while循环的句法结构。
现在我们来分析另外一个例子,在这个例子中将展示怎么使用break语句。
当然这也是我们第一次使用一个if 语句,所以我希望你们可以理解这个逻辑,让i等于1然后开始下面的增量循环,while语句重复设置v(i)等于999,不断让i增加,然后当i 达到6,做一个中止循环的命令,尽管有while循环,语句也就此中止。所以最后的结果是取出向量v前5个元素,并且把它们设置为999。
所以,这就是if 语句和while 语句的句法结构。并且要注意要有end,这个例子有两个end语句。上面的例子里第一个end 结束的是if 语句,第二个end 结束的是while 语句。现在让我告诉你使用if-else 语句:(首先我们设置v(1)=2)
最后,提醒一件事:如果你需要退出 Octave,你可以输入exit命令然后回车就会退出Octave,或者命令quit也可以。
最后,让我们来说说如何定义和调用函数。
我在桌面上存了一个预先定义的文件名为 “squarethisnumber.m”,这就是在 Octave 环境下定义的函数。你需要创建一个文件,用你的函数名来命名,然后以.m的后缀结尾。当Ocatve发现这文件,它知道应该在什么位置查找。
让我们打开这个文件。请注意,我使用的是微软的写字板程序来打开这个文件,我只是想建议你,如果你也使用微软的Windows系统,那么可以使用写字板程序,而不是记事本来打开这些文件。如果你有别的什么文本编辑器也可以,但记事本有时会把代码的间距弄得很乱。如果你只有记事本程序,那也能用。但如果你有写字板或者其他的,我建议你用写字板或者其他可以编辑函数的文本编辑器来编辑函数。
现在我们来说如何在 Octave 里定义函数:
这个文件只有三行:
第一行写着function y = squareThisNumber(x),这就告诉Octave,我想返回一个值,并且返回的这个值将被存放于变量y里。另外,它告诉了Octave这个函数有一个自变量,就是x,定义的函数主体是y=x2。
现在让我们尝试调用这个函数。输入squareThisNumber(5),实际上这是行不通的。Ocatve说这个函数未被定义。这是因为Ocatve不知道在哪里找这个文件。
像之前一样,我们使用pwd显示现在路径,然后更改路径cd 'C:\Users\ang\desktop',然后调用这个函数,就会得到返回值25。
还有一种更高级的功能,如果你知道search path (搜索路径)这个术语。你可以把下面这部分作为一个进阶知识,或者选学材料,仅适用于那些熟悉编程语言中搜索路径概念的同学。所以如果你想要修改Octave的搜索路径,你可以使用addpath 命令添加路径,添加路径"C:\Users\ang\desktop";将该目录添加到Octave的搜索路径,这样即使你跑到其他路径底下,Octave依然知道会在Users\ang\desktop目录下寻找函数。这样,即使我现在在不同的目录下,它仍然知道在哪里可以找到SquareThisNumber这个函数。
但是,如果你不熟悉搜索路径的概念,不用担心,只要确保在执行函数之前,先用cd命令设置到你函数所在的目录下,实际上也是一样的效果。
Octave还有一个其他许多编程语言都没有的概念,那就是它可以允许你定义一个函数,使得返回值是多个值。这里就是一个例子,定义一个函数叫:squareAndCubeThisNumber(x)。这说的就是该函数返回值是两个值y1和y2。y1=x^2,y2=x^3。比如你们可能熟悉的C或C++,通常情况下,认为作为函数返回值只能是一个值,但Octave 的语法结构就不一样,可以返回多个值。
如果我输入[a,b] = SquareAndCubeThisNumber(5),然后,a就等于25,b就等于125。
所以说如果你需要定义一个函数并且返回多个值,这一点常常会带来很多方便。最后,我来给大家演示一下一个更复杂一点的函数的例子。比方说,我有一个数据集,像这样,数据点为(1,1), (2,2),(3,3),我想做的事是定义一个Octave 函数来计算代价函数J(θ),就是计算不同θ值所对应的代价函数值。
首先让我们把数据放到Octave 里,我把设计矩阵设置为X = [1 1; 1 2; 1 3];(第一列表示x0项,第二列表示训练样本的x值),y设置为y=[1 ; 2 ; 3](这是y轴对应值)。现在我们设定θ为[ 0 ; 1 ]。
现在打开预先定义好的函数,请仔细看一下这个函数的定义,确保你明白了定义中的每一步。
现在当我在Octave 里运行时,我输入J = costFunctionJ (X, y, theta),它就计算出J=0。
这是因为如果我的数据集x为[1;2;3],y 也为[1;2;3]然后设置θ0=0,θ1=1,这给了我恰好45度的斜线,这条线是可以完美拟合我的数据集的。
而相反地,如果我设置θ等于[0;0],那么这个假设就是0是所有的预测值,和刚才一样,设置θ0=0,θ1=0,然后我计算的代价函数,结果是2.3333。实际上,他就等于1的平方,也就是第一个样本的平方误差,加上2的平方,加上3的平方,然后除以2m,也就是训练样本数的两倍,这就是2.33。
因此这也反过来验证了我们这里的函数,计算出了正确的代价函数。完整性检查证明我们对定义的代价函数J确实是可以计算出正确的代价函数的。至少基于这里的训练集是成立的。
现在你知道如何在Octave 环境下写出正确的控制语句,比如for循环、while循环和if语句,以及如何定义和使用函数。在接下来的课程中,将学习向量化,这是一种可以使你的Octave程序运行非常快的思想。
[斯坦福大学2014机器学习教程笔记]第五章-控制语句:for,while,if语句的更多相关文章
- [斯坦福大学2014机器学习教程笔记]第六章-决策界限(decision boundary)
这一节主要介绍的是决策界限(decision boundary)的概念,这个概念可以帮组我们更好地理解逻辑回归的假设函数在计算什么. 首先回忆一下上次写的公式. 现在让我们进一步了解这个假设函数在什么 ...
- [斯坦福大学2014机器学习教程笔记]第六章-代价函数(Cost function)
在这节中主要讲的是如何更好地拟合逻辑回归模型的参数θ.具体来说,要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题. 我们有一个训练集,训练集中有m个训练样本:{ ...
- 《Python基础教程》 读书笔记 第五章(下)循环语句
5.5.1while循环 x=1 while x<=100: print x x+=1 确保用户输入了名字: name="" while not name: name=raw ...
- 《Python基础教程》 读书笔记 第五章(上)条件语句
5.1 print和import的更多信息 5.1.1使用逗号输出 打印多个表达式也是可行的,只要将它们用逗号隔开就好: >>>print'age:',42 age: 42 要同时输 ...
- Deep Learning 19_深度学习UFLDL教程:Convolutional Neural Network_Exercise(斯坦福大学深度学习教程)
理论知识:Optimization: Stochastic Gradient Descent和Convolutional Neural Network CNN卷积神经网络推导和实现.Deep lear ...
- Deep Learning 8_深度学习UFLDL教程:Stacked Autocoders and Implement deep networks for digit classification_Exercise(斯坦福大学深度学习教程)
前言 1.理论知识:UFLDL教程.Deep learning:十六(deep networks) 2.实验环境:win7, matlab2015b,16G内存,2T硬盘 3.实验内容:Exercis ...
- Deep Learning 13_深度学习UFLDL教程:Independent Component Analysis_Exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程.Deep learning:三十三(ICA模型).Deep learning:三十九(ICA模型练习) 实验环境:win7, matlab2015b,16G内存,2T机 ...
- Deep Learning 12_深度学习UFLDL教程:Sparse Coding_exercise(斯坦福大学深度学习教程)
前言 理论知识:UFLDL教程.Deep learning:二十六(Sparse coding简单理解).Deep learning:二十七(Sparse coding中关于矩阵的范数求导).Deep ...
- Deep Learning 11_深度学习UFLDL教程:数据预处理(斯坦福大学深度学习教程)
理论知识:UFLDL数据预处理和http://www.cnblogs.com/tornadomeet/archive/2013/04/20/3033149.html 数据预处理是深度学习中非常重要的一 ...
随机推荐
- Python入门的三大问题和三大谎言
Python广告,铺天盖地,小白们雾里看花,Python无限美好.作为会20几种语言(BASIC Foxbase/pro VB VC C C++ c# js typescript HTML Ardui ...
- vue的子组件不能进行router的切换
在用vue开发过程中,偶然一次使用在子组件中进行router的切换,发现不起作用,后来才反应过来,子组件只是一个组件,vue的路由的切换只能是在父组件(也就是真正的页面)里面进行跳转!
- redis环境搭建及一主二从三哨兵模式配置
一.单机redis环境搭建 1.安装: OS:linux redhat6.5 下载redis 官网下载链接:https://redis.io/download 把安装包上传到服务器,进行解压 [roo ...
- vue中v-if和v-show的区别
v-if.v-show顾名思义就是用来判断视图层展示效果的. v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回真值的时候被渲染. v-show 指的是单纯的切换元素的样式dis ...
- 为Python安装pip
Python及操作系统的支持 Python 2.6, 2.7, 3.2, 3.3, 3.4 Unix/Linux, OS X, 以及 Windows 默认包含 Python 2.7.9 及以后的版 ...
- Js中的window.parent ,window.top,window.self 了解
在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法 ...
- Java多线程并发03——在Java中线程是如何调度的
在前两篇文章中,我们已经了解了关于线程的创建与常用方法等相关知识.接下来就来了解下,当你运行线程时,线程是如何调度的.关注我的公众号「Java面典」了解更多 Java 相关知识点. 多任务系统往往需要 ...
- M-Renamer方法名修改器,iOS项目方法名重构,Objective-C/Swift,代码模型预判,减少误改的机率,替换速度更快,可视化操作,傻瓜式操作,一键操作,引用处自动修改,马甲包的福音
M-Renamer M-Renamer(Method-Name-Renamer)类方法名修改器,采用链式解析头文件,代码模型预判,减少误改的机率,替换速度更快:可以解析整个项目大多数类的方法,可视化操 ...
- Hive 时间操作
Hive 时间转换 UNIX时间戳概念:因为UNIX时间戳只是一个秒数,一个UNIX时间戳在不同时区看来,时间是不同的.如UNIX时间戳0,在0时区看来是1970-01-01 00:00:00,在东八 ...
- Python3 整数
imag定义:返回整数的复数形式的虚部(返回整数).格式:intobject.imag real定义:返回整数的复数形式的实部(返回整数).格式:intobject.real conjugate()定 ...