5-1 Basic Operations —— 基本操作
Octave是一种很好的原始语言(prototyping language),使用Octave 你能快速地实现你的算法,剩下的事情,你只需要进行大规模的资源配置,你只用再花时间用C++或Java这些语言把算法重新实现就行了。开发项目的时间是很宝贵的,机器学习的时间也是很宝贵的。所以,如果你能让你的学习算法在Octave上快速的实现,基本的想法实现以后,再用C++或者Java去改写,这样你就能节省出大量的时间。
据我所见,人们使用最多的用于机器学习的原始语言是Octave、MATLAB、Python、NumPy 和 R。
Octave很好,因为它是开源的。当然 MATLAB也很好,但它不是每个人都买得起的。貌似国内学生喜欢用收费的matlab,matlab功能要比Octave强大的多,网上有各种D版可以下载。这次机器学习课的作业也是用matlab的。如果你能够使用MATLAB,你也可以在这门课里面使用。
如果你会Python、NumPy或者R语言,我也见过有人用 R 的,据我所知,这些人不得不中途放弃了,因为这些语言在开发上比较慢,而且,因为这些语言如:Python、NumPy的语法相较于Octave来说,还是更麻烦一点。正因为这样,所以我强烈建议不要用NumPy或者R来完整这门课的作业,我建议在这门课中用Octave来写程序。
本视频将快速地介绍一系列的命令,目标是迅速地展示,通过这一系列Octave的命令,让你知道Octave能用来做什么。
图1 基本数学运算
请注意,不等于符号的写法是这个波浪线加上等于符号 ( ~= ),而不是等于感叹号加等号 ( != ),这是和其他一些编程语言中不太一样的地方。
图2 等于 不等于
图3 逻辑与、或
图4 异或
从左向右写着 Octave 324.x版本,是默认的Octave提示,它显示了当前Octave的版本,以及相关的其它信息。
如果你不想看到那个提示,这里有一个隐藏的命令
输入命令
图5 隐藏提示
现在命令提示已经变得简化了。
图6 赋值
如果你想分配一个变量,但不希望在屏幕上显示结果,你可以在命令后加一个分号,可以抑制打印输出,敲入回车后,不打印任何东西。
其中这句命令不打印任何东西。
现在举一个字符串的例子:变量b等于"hi"。
C等于3大于等于1,所以,现在C变量的值是真。
如果你想打印出变量,或显示一个变量,你可以像下面这么做:
设置A等于圆周率π,如果我要打印该值,那么只需键入A像这样就打印出来了。
对于更复杂的屏幕输出,也可以用DISP命令显示:
这是一种,旧风格的C语言语法,对于之前就学过C语言的同学来说,你可以使用这种基本的语法来将结果打印到屏幕。
例如 sprintf命令的六个小数:0.6%f ,a,这应该打印π的6位小数形式。
也有一些控制输出长短格式的快捷命令:
下面,让我们来看看向量和矩阵:
比方说建立一个矩阵A
对A矩阵进行赋值
考虑到这是一个三行两列的矩阵
你同样可以用向量
建立向量V并赋值1 2 3,V是一个行向量,或者说是一个3 ( 列 )×1 ( 行 ) 的向量,或者说,一行三列的矩阵。
如果我想,分配一个列向量,我可以写“1;2;3”,现在便有了一个3 行 1 列的向量,同时这是一个列向量。
下面是一些更为有用的符号,如:
V=1:0.1:2
这个该如何理解呢:这个集合V是一组值,从数值1开始,增量或说是步长为0.1,直到增加到2,按照这样的方法对向量V操作,可以得到一个行向量,这是一个1行11列的矩阵,其矩阵的元素是1 1.1 1.2 1.3,依此类推,直到数值2。
我也可以建立一个集合V并用命令“1:6”进行赋值,这样V就被赋值了1至6的六个整数。
这里还有一些其他的方法来生成矩阵
例如“ones(2, 3)”,也可以用来生成矩阵:
元素都为2,两行三列的矩阵,就可以使用这个命令:
你可以把这个方法当成一个生成矩阵的快速方法。
w为一个一行三列的零矩阵,一行三列的A矩阵里的元素全部是零:
还有很多的方式来生成矩阵。
如果我对W进行赋值,用Rand命令建立一个一行三列的矩阵,因为使用了Rand命令,则其一行三列的元素均为随机值,如“rand(3, 3)”命令,这就生成了一个3×3的矩阵,并且其所有元素均为随机。
数值介于0和1之间,所以,正是因为这一点,我们可以得到数值均匀介于0和1之间的元素。
如果,你知道什么是高斯随机变量,或者,你知道什么是正态分布的随机变量,你可以设置集合W,使其等于一个一行三列的
N矩阵,并且,来自三个值,一个平均值为0的高斯分布,方差或者等于1的标准偏差。
还可以设置地更复杂:
并用hist命令绘制直方图。
绘制单位矩阵:
如果对命令不清楚,建议用help命令:
以上讲解的内容都是Octave的基本操作。希望你能通过上面的讲解,自己练习一些矩阵、乘、加等操作,将这些操作在Octave中熟练运用。
在后面的小节中,将会涉及更多复杂的命令,并使用它们在Octave中对数据进行更多的操作。
5-2 Moving data around —— 移动数据
在这段关于 Octave的辅导课视频中,我将开始介绍如何在 Octave 中移动数据。
如果你有一个机器学习问题,你怎样把数据加载到 Octave 中?
怎样把数据存入一个矩阵?
如何对矩阵进行相乘?
如何保存计算结果?
如何移动这些数据并用数据进行操作?
本节中的程序如下:
注意:
size()获取矩阵的行数和列数,并存储在一个1x2的矩阵中。
length()获取矩阵的最大维度,故而length(A_3*2) = 3 。所以,通常,length()用于向量。
在打开Octave时,就已经在一个默认路径下,这个路径是Octave的安装路径。
pwd :显示当前路径
cd :改变路经
ls :列出当前路径上的所有文件和文件夹
load filename
load('filename')
who : 列出当前路径下,所有文件的文件名
whos : 列出当前路径下,所有文件的详细信息,包括文件名、数据格式等等。
clear variableName :删除某个变量
clear :删除所有变量
save filename variableName :将变量variableName中的值存储到文件fileName中,例如save hello.dat v。
save filename variableName -ascii :设置文件中数据的编码格式为ascii,这样就可以直接打开文件查看数据
了。否则,像上面没有设置编码格式的方式,将默认存储为二进制格式。
对于其他的命令,此处便不做详细介绍了。通过这几个命令可以发现, Octave的命令与Matalab非常相近,不过某些命令的使用方式更加简洁。
没有必要把这些命令都记住,你也不可能记得住。你要做的就是,了解一下你可以用哪些命令,做哪些事。这样在你今后需要编写学习算法时,如果你要找到某个Octave 中的命令,你可能回想起你之前在这里学到过,然后你就可以查找课程中提供的程序副本,这样就能很轻松地找到你想使用的命令了。
5-3 Computing on data —— 数据计算
5-4 Plotting data —— 绘制数据
subplot命令,我们要使用subplot(1,2,1),它将图像分为一个1*2的格子,也就是前两个参数,然后它使用第一个格子,也就是最后一个参数1的意思。
我现在使用第一个格子,如果键入plot(t, y1),现在这个图显示在第一个格子。如果我键入subplot(1,2,2),那么我就要使用第二个格子,键入plot(t, y2);现在y2显示在右边,也就是第二个格子。
最后一个命令,你可以改变轴的刻度,比如改成[0.5 1 -1 1],输入命令:axis([0.5 1 -1 1])也就是设置了右边图的x轴和y轴的范围。
让我们设置A等于一个5×5的magic方阵:
我有时用一个巧妙的方法来可视化矩阵,也就是imagesc(A)命令,它将会绘制一个5*5的矩阵,一个5*5的彩色格图,不同的颜色对应A矩阵中的不同值。
我还可以使用函数colorbar,让我用一个更复杂的命令 imagesc(A),colorbar,colormap gray。这实际上是在同一时间运行三个命令:运行imagesc,然后运行,colorbar 然后运行colormap gray。
它生成了一个颜色图像,一个灰度分布图,并在右边也加入一个颜色条。所以这个颜色条显示不同深浅的颜色所对应的值。
使用逗号连接函数调用。如果我键入a=1,b=2,c=3然后按Enter键,其实这是将这三个命令同时执行,或者是将三个命令一个接一个执行,它将输出所有这三个结果。
这很像a=1; b=2;c=3;如果我用分号来代替逗号,则没有输出出任何东西。
这里我们称之为逗号连接的命令或函数调用。
现在你知道如何绘制Octave中不同的图像,在下面的视频中,我将告诉你怎样在Octave中,写控制语句,比如ifwhile for语句,并且定义和使用函数。
5-5 Control Statements - for、while、if