本文是吴恩达《机器学习》视频笔记第31篇,对应第2周第13个视频。
“Octave Tutorial——For, while, if statements, and functions”
01
—
笔记
本节的内容,还是很简单的。如果学过C语言的,基本可以跳过了,但为了保证课程的整体性,还是把这个小文贴在专辑里。
先定义一个10*1的全0列向量。
>>v = zeros(10,1)
v =
0
0
0
0
0
0
0
0
0
0
如果我想按照一定规则对上面的向量的值进行更改,而这个更改和v的元素的位置有关,比如:
>>for i=1:10, %注意,这里的后面是个逗号
> v(i)=2^i; %2的i次方,注意前面的空格不是必须的,和python不一样
> end %for循环的结束
>>v
v =
2
4
8
16
32
64
128
256
512
1024
这里的for循环很有意思,它以for开头(循环条件的后面是个逗号),以end结尾,循环体里面是分号结尾的语句。Octave for循环的写法比较有个性。
我们通过一个while循环将上面的列向量v的前5个元素置为100.
>>i = 1;
>>while i<=5,
> v(i)=100;
> i=i+1;
> end;
>>v
v =
100
100
100
100
100
64
128
256
512
1024
上面代码可以看出,while循环比for循环麻烦一点。还有一点要注意的是,Octave中的向量元素的标号是从1开始的,不是从0开始的,这个和其它语言不一样。
另外,我们可以用break跳出循环,比如:
>>while true,
> v(i)=999;
> i = i+1;
> if i>=6,
> break;
> end;
> end;
>>
这个循环体里面如果不加break的话就是个死循环,因为循环条件一直都是true的。但是加了break之后,等i到6的时候就跳出循环。
上面的代码还用到了if语句,if的条件后面也是跟的逗号。
当然,if后面还可以跟else或者elseif,比如:
>>if v(1)==1,
> disp('value is 1');
> elseif v(1)==2,
> disp('value is 2');
> else,
> disp('value is not 1 or 2');
> end;
value is not 1 or 2
怎样定义和使用函数呢?
首先呢,要先创建一个以函数名为文件名、以“.m”为扩展名的*.m文件。比如:squareThisNumber.m文件。
可以用微软的写字板打开,然后编辑为:
函数的定义方式还是比较简洁的,关键字function后面跟一个y表示函数的返回变量,squareThisNumber为函数名,后面跟着小括号里面的x表示这个函数会有一个输入值,后面的一句为函数体,函数体当然也可以很复杂。
这个时候如果我们在Octave的命令行里面调用这个函数会报错:
说我们的squareThisNumber函数没定义。是因为我们没有把刚刚定义的函数的m文件放到当前的工作路径下,只要把m文件移过去就可以了。
用pwd命令看一下工作路径,然后把m文件移动过去即可。
还有一种办法,就是用命令把我们存放函数文件的路径加到Octave的搜索路径中,如下图。
另外一种办法,是用cd命令将Octave的工作路径改为函数文件的存放路径。
很多计算机语言要想让函数返回多个值是很麻烦的,但是Octave就方便了。
方法是:
调用也很简单:
假设我们在二维直角坐标系中有三个点,(1,1)、(2,2)、(3,3)。
我们用一个直线去拟合这三个点,直线的方程为:
我们给定一组\theta,就可以算出预测值,然后根据预测值和真实值的方差,即Cost函数。
那我们先来定义设计矩阵,上面的y的式子中\theta1的x_0是1,所以设计矩阵X为:
>>X=[1 1; 1 2; 1 3]
X =
1 1
1 2
1 3
y为训练数据的实际值:
>>y=[1;2;3]
y =
1
2
3
我们任意设置一个系数向量theta,然后计算这个theta向量对应的cost函数。假设:
>>theta=[0;2]
theta =
0
2
所以cost函数定义为costFunctionJ,如下:
然后,调用这个函数算一下,得出cost函数的值:
如果改一下theta,又可以得到不一样的cost值。
好了,Octave的基本语句和函数的使用就介绍到这里,下一个视频是第二周的最后一个视频,将介绍Octave中的矢量。