在之前关于机器学习的BLOG中,我很多次都提到了一个比较冷门的编程语言——Octave,在这篇BLOG中,就让我们走进Octave的大门吧。
Octave简介
Octave是一种编程语言,旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件,早期版本为命令行交互方式,4.0.0版本发布基于QT编写的GUI交互界面。但在我们的学习中,更多地还是使用我们的命令行交互形式,就像:
其实有的同学会好奇,最后的算法实现上,我们往往是使用C++等易移植的编程语言,那我们为什么学习Octave语言呢?因为使用 Octave 这样的自带很多简便算法的高级语言时,我们往往能够更快 更好地学习并掌握这些算法。而据说在硅谷很多进行大规模的机器学习项目的程序往往都会先在 Octave 上进行实现,确认无误后再用C++等实现,这样也往往会给开发节省大量的时间。
顺带一提,如果你不喜欢每个语句前的那句“Octave:1>”那你可以输入一个PS1('>> ');
,这样,每个语句开头就变成了简洁的>>:
下面就让我们进入代码部分吧。
实数的定义及运算
先让我们从最简单的实数变量的定义与运算开始吧。
常量的运算
最简单地,Octave可以实现像计算器一样的功能,比如四则运算:加法运算5 + 6
,减法运算3 - 2
,乘法运算2 * 3
,除法运算1 / 2
,:
同样地我们也可以进行幂运算和亦或运算操作,幂运算2 ^ 6
,亦或运算xor(3, 4)
:
还有逻辑运算,等于的判断1 == 2
,不等于判断1 ~= 2
,以上均为成立返回 1, 不成立返回 0,然后是逻辑与1 && 0
和逻辑或1 || 0
:
变量的定义及运算
在Octave中,变量的定义极为简单,不需要预设类型,直接赋值即可,比如a = 3
;对了,如果在某个语句运行后,你不希望它有输出,只要在语句的最后加上一个‘;’就可以了:
同样地,变量也可以是字符串b = 'hi'
或者逻辑运算c = (3 >= 1)
之类的:
并且如果你想访问某个变量的值,有很多中方法,第一种方法是直接输入它的名字就好了,比如a
;如果你不想要前面那个 a= ,只想要它的值,你就可以使用disp(a)
:
你也可以使用类似于C的输出方式disp(sprintf('%0.2f', a))
来保留两位小数:
对了,对于像 a 这样的实数来说,还有一些快捷的小数位数控制,比如format long
和format short
:
矩阵的定义及运算
在机器学习的算法当中,我们经常要用到矩阵和向量
矩阵的定义
矩阵的定义其实很简单,只要在[]中,用' '区分同一行中两个数,用';'来换行即可,中间换行不换行均可,即:
向量是一个一列的矩阵,所以定义向量时要每输入一个数字换一行:
通过 [] 来定义矩阵是最常用也最普遍的方法,当然还有一些特殊的方法来定义一些特殊的矩阵;
比如可以用a :x :b
(a, x, b均为实数)的形式来定义一个一行的矩阵,其代表第一个元素为 a ,最后一个元素为 b,且后一个元素减去前一个元素的值恒为 x :
若没有 x 也可以直接写成a :b
的形式,此时的 x 默认为1:
如果你想定义一个矩阵中全为某一个常数 c 的 n m 的矩阵,你就可以直接用 `c ones(n, m)` 来实现,直接使用 ones(n, m) 时输出的是全为 1 的矩阵:
同样地,你想定义一个 n * m 的零矩阵,你也可以使用zeros(n, m)
来实现:
如果你想定义一个 n * m 的随机矩阵,你也可以使用rand(n, m)
来实现,此时矩阵内的元素都是 0 ~ 1 中均匀的随机值,而randn(n, m)
得到的元素则是平均值为 0 的高斯分布的随机元素:
对了,我们还可以使用hist函数看到你矩阵中元素分布的直方图:
如果你觉得刚刚的直方图的条数还不够多,你还可以在hist中变量后自定义直方图的条数:
最后再提一下单位矩阵的生存,如果你想生成一个 n * n 的单位矩阵,你可以使用语句eye(n)
:
当然在你忘记一个命令怎么用的时候,可以直接使用help 你想查询的命令
来查询:
当然help help
也是可以的(禁止套娃):
矩阵的运算
对于矩阵的运算之前我们已经提及过了,其实常见的也就那么几种。首先是加减乘法运算都和实数一样,直接用+-*就好了:
接着还有转置A'
和逆元pinv()
的计算:
结语
通过这篇BLOG,相信你已经对Octave有了初步的认识。在后续的BLOG中,我们将会学习更多复杂的命令,并使用它们在Octave中对数据进行更多的操作。最后希望你喜欢这篇BLOG!