在这节中将介绍如何在Ocatve中移动数据。如果你有些机器学习问题的数据,你如何将这些数据加载到Ocatve中?怎么把数据存入矩阵中?怎么对矩阵进行操作?如何保存计算结果?如何移动这些数据然后对它们进行操作?
首先我们让A = [ 1 2 ; 3 4 ; 5 6 ],我们会得到一个3x2矩阵,我们可以用size(A)返回矩阵A的大小,这里返回的就是3 2。实际上,size(A)也可以看作是一个1x2的矩阵,我们可以用sz来存放,设置sz = size(A)。因此,sz是一个1x2矩阵,它的第一个元素是3,第二个元素是2。
你也可以输入size(A,1),返回的是A矩阵的行数,即返回3。输入size(A,2),返回的是A矩阵的列数,即返回2。
如果你有一个向量v,v = [ 1 2 3 4 ],然后输入length(v),这个指令将返回最大维度的大小,即返回4。你也可以输入length(A),因为矩阵A是一个3x2矩阵,所以较大的维度是3,返回3。但通常我们还是对向量使用length命令,比如length([1;2;3;4;5]),结果为5,而不是对矩阵使用length命令,因为这可能会造成误解。
下面让我们看一下如何在系统中加载数据和寻找数据。
当我们打开Ocatve时,我们通常已经在一个默认路径中,这个路径是 Octave的安装位置,pwd 命令可以显示出Octave 当前所处路径。
cd命令,意思是改变路径,我可以把路径改为C:\Users\ang\Desktop,这样当前目录就变为了桌面。
如果键入 ls,ls 来自于一个 Unix 或者 Linux 命令,ls命令将列出我桌面上的所有路径。
事实上,我的桌面上有两个文件:featuresX.dat 和priceY.dat,是两个我想解决的机器学习问题。
featuresX文件如图所示,是一个含有两列数据的文件,这是我的房屋价格数据,数据集中有47行,第一套房子样本,面积是2104平方英尺,有3个卧室,第二套房子面积为1600,有3个卧室等等。
priceY这个文件里的数据就是训练集中的价格数据,所以 featuresX 和priceY就是两个存放数据的文档,那么应该怎样把数据读入 Octave 呢?
实际上,我们只需要键入featuresX.dat,这样我将加载了 featuresX 文件。同样地,我可以通过键入priceY.dat加载priceY.dat。其实有好多种办法可以完成,如果你把命令写成字符串的形式load('featureX.dat'),也是可以的,这跟刚才的命令效果是相同的,只不过是把文件名写成了一个字符串的形式。Octave中使用单引号来表示字符串。
另外 who 命令,能显示出在Octave工作空间中的所有变量。我们能看到这里包括了我们之前定义的一些变量还有featuresX和priceY。所以我可以键入featuresX 回车,来显示 featuresX的数据。我们还可以键入size(featuresX),返回47 2,表示这是一个47x2的矩阵。类似地,输入size(priceY),返回47 1,表示这是一个47维的向量,是一个列矩阵,存放的是训练集中的所有价格。
who 函数能让你看到当前工作空间中的所有变量,同样还有另一个 whos命令,能更详细地进行查看。
如果你想删除某个变量,你可以使用 clear 命令,我们键入 clear featuresX。然后再输入 whos 命令,你会发现 featuresX 从列表上消失了。
另外,我们怎么储存数据呢?
我们设变量v = priceY(1:10), 这表示将向量Y的前十个数赋值给v。
我们输入whos就能看到Y的大小为47x1,而v的大小为10x1。
假如我想把这些数据存入硬盘,我们可以使用save hello.mat v 命令,这会将变量v保存为一个叫hello.mat 的文件,回车,现在桌面上就出现了一个新文件,名为hello.mat。
现在我们清除所有变量,直接键入clear,这样将删除工作空间中的所有变量。所以,我们输入whos之后会发现工作空间已经被清空了。但如果我输入load hello.mat ,加载hello.mat 文件,现在变量v又可以被读取了。
要注意的是:save hello.mat v 命令将数据存为二进制的格式或者说是更压缩的二进制格式。如果v的数据量很大,那么压缩的程度也更大,占用空间也更小。
如果想将数据存储成人类能看得懂的形式,可以输入save hello.txt v -ascii这样就会把数据存成一个文本文档,或者说用ascii码存成文本文档。键入了这个命令以后,桌面上就有了hello.txt文件。如果打开它,我们可以发现这个文本文档存放着我们的数据。这就是读取和储存数据的方法。
下面讲一下如何操作数据。
我们还是将A= [ 1 2 ; 3 4 ; 5 6 ],它还是那个3x2矩阵。下面讲讲索引。
比如键入A(3,2)这将索引到A的第三行第二列位置的元素。通常我们会将3,2写成下标的形式,来对应A的第三行第二列的元素。
我也可以键入A(2,:) 来返回第二行的所有元素,冒号表示该行或该列的所有元素,返回3 4。类似地,如果我键入A(:,2),这将返回第二列的所有元素,返回2 4 6。
你也可以在运算中使用这些较为复杂的索引。我再给你展示几个例子,可能你也不会经常使用。
我们可以输入A([1 3],:),这个命令意思是取第一个索引值为1或3的元素,也就是说我取的是A的第一行和第三行的所有列的元素。
我们还可以输入A(:,2) = [10 ; 11; 12],取矩阵的第二列,然后将它赋值为10 11 12。
我们还可以输入A = [ A, [100 ;101 ;102 ] ]; 这样做的结果是在原矩阵的右边加了一个新的一列。现在A矩阵就变成了一个3x3矩阵。
最后,还有一个小技巧,如果你就输入 A(:),这是一个很特别的语法结构,意思是把A中的所有元素放入一个单独的列向量,这样我们就得到了一个9x1的向量。
再来几个例子:我还是把A重新设为[1 2; 3 4; 5 6],我再设一个B[11 12; 13 14; 15 16],我可以新建一个矩阵C = [ A B ]这个意思就是把这两个矩阵结合在一起。
我还可以设C = [A; B],这里的分号表示把分号后面的矩阵放到前面矩阵的下面。所以,[A;B]的作用依然还是把两个矩阵放在一起,只不过现在是上下排列。
简单地说,分号的意思就是换到下一行。所以C = [A; B]就是把矩阵A放进去,然后换一行,再把矩阵B放进去。另外顺便说一下,这个[A B]命令跟[A, B] 是一样的,这两种写法的结果是相同的。
通过以上这些操作,我们知道了怎样构建矩阵,怎样把矩阵放到一起,怎样取出矩阵,并且把它们放到一起,组成更大的矩阵。通过几句简单的代码,Octave能够很方便地很快速地帮助我们组合复杂的矩阵以及对数据移动。
在下节中,我们将学习如何对数据进行更复杂的运算。