在之前关于机器学习的BLOG中,我很多次都提到了一个比较冷门的编程语言——Octave,在这篇BLOG中,就让我们走进Octave的大门吧。

Octave简介

Octave是一种编程语言,旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件,早期版本为命令行交互方式,4.0.0版本发布基于QT编写的GUI交互界面。但在我们的学习中,更多地还是使用我们的命令行交互形式,就像:

Oct1.png

其实有的同学会好奇,最后的算法实现上,我们往往是使用C++等易移植的编程语言,那我们为什么学习Octave语言呢?因为使用 Octave 这样的自带很多简便算法的高级语言时,我们往往能够更快 更好地学习并掌握这些算法。而据说在硅谷很多进行大规模的机器学习项目的程序往往都会先在 Octave 上进行实现,确认无误后再用C++等实现,这样也往往会给开发节省大量的时间。

顺带一提,如果你不喜欢每个语句前的那句“Octave:1>”那你可以输入一个PS1('>> ');,这样,每个语句开头就变成了简洁的>>:

Oct2.png

下面就让我们进入代码部分吧。

实数的定义及运算

先让我们从最简单的实数变量的定义与运算开始吧。

常量的运算

最简单地,Octave可以实现像计算器一样的功能,比如四则运算:加法运算5 + 6,减法运算3 - 2,乘法运算2 * 3,除法运算1 / 2,:

Oct3.png

同样地我们也可以进行幂运算和亦或运算操作,幂运算2 ^ 6,亦或运算xor(3, 4)

Oct4.png

还有逻辑运算,等于的判断1 == 2,不等于判断1 ~= 2,以上均为成立返回 1, 不成立返回 0,然后是逻辑与1 && 0和逻辑或1 || 0

Oct5.png

变量的定义及运算

在Octave中,变量的定义极为简单,不需要预设类型,直接赋值即可,比如a = 3;对了,如果在某个语句运行后,你不希望它有输出,只要在语句的最后加上一个‘;’就可以了:
Oct6.png

同样地,变量也可以是字符串b = 'hi'或者逻辑运算c = (3 >= 1)之类的:

Oct7.png

并且如果你想访问某个变量的值,有很多中方法,第一种方法是直接输入它的名字就好了,比如a;如果你不想要前面那个 a= ,只想要它的值,你就可以使用disp(a)

Oct8.png

你也可以使用类似于C的输出方式disp(sprintf('%0.2f', a))来保留两位小数:

Oct9.png

对了,对于像 a 这样的实数来说,还有一些快捷的小数位数控制,比如format longformat short:

Oct10.png

矩阵的定义及运算

在机器学习的算法当中,我们经常要用到矩阵和向量

矩阵的定义

矩阵的定义其实很简单,只要在[]中,用' '区分同一行中两个数,用';'来换行即可,中间换行不换行均可,即:

Oct11.png
向量是一个一列的矩阵,所以定义向量时要每输入一个数字换一行:

Oct12.png

通过 [] 来定义矩阵是最常用也最普遍的方法,当然还有一些特殊的方法来定义一些特殊的矩阵;

比如可以用a :x :b(a, x, b均为实数)的形式来定义一个一行的矩阵,其代表第一个元素为 a ,最后一个元素为 b,且后一个元素减去前一个元素的值恒为 x :

Oct13.png

若没有 x 也可以直接写成a :b的形式,此时的 x 默认为1:

Oct14.png

如果你想定义一个矩阵中全为某一个常数 c 的 n m 的矩阵,你就可以直接用 `c ones(n, m)` 来实现,直接使用 ones(n, m) 时输出的是全为 1 的矩阵:

Oct15.png

同样地,你想定义一个 n * m 的零矩阵,你也可以使用zeros(n, m)来实现:
Oct16.png

如果你想定义一个 n * m 的随机矩阵,你也可以使用rand(n, m)来实现,此时矩阵内的元素都是 0 ~ 1 中均匀的随机值,而randn(n, m)得到的元素则是平均值为 0 的高斯分布的随机元素:

Oct17.png

对了,我们还可以使用hist函数看到你矩阵中元素分布的直方图:

Oct18.png

如果你觉得刚刚的直方图的条数还不够多,你还可以在hist中变量后自定义直方图的条数:

Oct19.png

最后再提一下单位矩阵的生存,如果你想生成一个 n * n 的单位矩阵,你可以使用语句eye(n):

Oct20.png

当然在你忘记一个命令怎么用的时候,可以直接使用help 你想查询的命令来查询:

Oct21.png
当然help help也是可以的(禁止套娃):

Oct22.png

矩阵的运算

对于矩阵的运算之前我们已经提及过了,其实常见的也就那么几种。首先是加减乘法运算都和实数一样,直接用+-*就好了:

Oct23.png

接着还有转置A'和逆元pinv()的计算:

Oct4.png

结语

通过这篇BLOG,相信你已经对Octave有了初步的认识。在后续的BLOG中,我们将会学习更多复杂的命令,并使用它们在Octave中对数据进行更多的操作。最后希望你喜欢这篇BLOG!

Last modification:March 4th, 2021 at 03:43 am
If you think my article is useful to you, please feel free to appreciate