学习笔记

机器学习笔记(6)MATLAB/Octave基础

/*本课程笔记依托于Machine Learning——Andrew Ng(Stanford University)*/

通过前面几篇笔记的记录,我们对机器学习中线性回归方法的一些基本算法有了一些新的了解,但是机器学习毕竟属于计算机领域,是要实际应用的。我们可以选择使用常见的高级语言C/C++ JAVA Python来进行算法的实现,但是采用这些语言会带来一个问题,因为从前面的笔记中我们可以看得出来,在对线性回归的算法中有很多对于矩阵的操作,而上述的高级语言中并没有对矩阵的相关操作进行原生的支持,如果在上述高级语言中实现矩阵的相关运算,对于我们的学习成本来说太高了。鉴于上述理由我们决定采用MATLAB或者Octave。实际上MATLAB或者Octave在算法开发上的应用很广泛,硅谷的很多大公司都采用上述软件开发算法。那么MATLAB和Octave有什么区别,实际上Octave是MATLAB的开源高仿版,他可以运行95%的MATLAB代码,至于缺少的5%则是MATLAB的高级拓展库,二者语法几乎完全相似,因此无论是使用MATLAB还是Octave都可以用MATLAB来学习,因此下面简称为MATLAB

下面我们将大概理解一下MATLAB的基本用法

MATLAB和Octave是弱类型脚本语言,因此并不需要像C/C++ JAVA那样有严谨的结构,因此当我们需要执行MATLAB代码最简单就可以这么写

3 + 5

这样就会显示ans = 8,同样我们可以以此类推+ – * /四种基本算法以及次方运算^都可以在MATLAB中执行

1 == 2

这段代码中使用了逻辑判断符号==,其中一个=表示赋值运算符,==则表示逻辑判断是否相等,~=则表示判断是否相等,至于其他逻辑运算符(|| && > >= < <=)的用法和其他编程语言类似,至于异或运算,则是以xor()函数的形式出现,例如

xor(0,1)

接下来简单的介绍一下MATLAB中如何回显,所谓回显包括的是输入语句3+5是否立刻回显,以及如何在屏幕上显示一行文字

3 + 5;    %这里在语句的最后使用;来产生不回显的效果
3 + 5     %这里的3 + 5就会回显为8
disp(3 + 5) %在使用disp函数时无论是否加分好都会产生输出值

至于最后一个disp这是MATLAB的输出语句,因此在何时何地都会产生输出。对于任何比较复杂的输出都可以使用disp函数

a = 10
b = 'hi'
c = (3 >= 1)
b = 100

上面展示出了几种了赋值的方法,我们可以看到变量是不需要进行声明的,而且变量没有特定的类型,字符串的表示在MATLAB中是使用”(单引号)来表示的而c的赋值内容则是一个条件表达式,我们还可以对变量赋值3.14或者3.14f,这里需要注意的是MATLAB默认对将浮点数识别为double类型,当设置为3.14f时MATLAB才会以float类型储存变量

因为MATLAB的回显特点,我们无法控制输出数据的格式,所以MATLAB给我们提供了format函数,通过format函数的参数我们可以更改显示的模式

format long    %长数字格式输出
format short    %短数字格式输出(默认)
format rat    %分数形式输出

至于其他的format参数我们可以使用help命令来查看format的参数

help format

当然我们也可以在help后面加上所有的命令来看他们的帮助文档

前面的笔记以及上面的内容可以知道,MATLAB相对于其他语言的优势就是对矩阵的原生支持,那么下面就要简述一下MATLAB如何使用矩阵

a = [1 2;3 4;5 6]

这样就声明了一个两行三列的矩阵,也就是说矩阵行元素之间使用空格分隔,行与行之间的分隔使用分号。当然还有一个简单的生成矩阵的方法

a = 0:6
a = 0:0.1:6

上面的两个语句可以快速的生成数组,第一个语句是生成从0-6步长为1的数组。而第二个语句中间的0.1则规定了步长也就是说第二个语句是以步长0.1生成矩阵,自然生成范围是0-6。再说下去估计你们也就晕了,看一下运行结果吧

大概就是这样,当然我们不止可以使用这种方法创建数组

once(2,3)    %生成两行三列全1矩阵
zeros(1,3)    %生成一行三列全0矩阵
rand(3,3)    %生成三行三列全随机数矩阵
eye(6)    %生成六行六列的单位矩阵
magic(6)    %生成六行六列的魔方矩阵

上面说到好像已经很清楚了,就不补充了,假设我们有一个数组a,如何进行矩阵的基本操作呢

a'    %a的转置
inv(a)    %a的逆矩阵(前提可逆)
pinv(a)    %a的逆矩阵(不论是否可逆)

假设a b为两个矩阵

a + b    %将两个矩阵相加
a * b    %将两个矩阵相称(前提是能相乘的话)
a .* b    %将两个矩阵对应位置的元素相乘

这里可以类推出对于除法运算符的相关操作,同样基本操作需要符合线性代数的相关知识

下面我们看一下如何在MATLAB中移动数据,这点你可能会觉得很奇怪,这里需要解释一下,在MATLAB中内存保存的变量是可以被保存成文件的(.mat文件),这一点也和其他传统的编程语言相差很大

size(a)
size(a,1)
size(a,2)

通过size函数可以返回一个矩阵的尺寸,说白了就是几行几列(a矩阵参照上文),也就是二行三列,第二个语句返回的是a的行数,第三个则是a的列数

同时我们还可以length命令

length(a)

length命令并不像size命令那样能返回行和列,length只会返回最大的维度,例如上面的输出结果就应该是3

当然啦我们说我们是需要移动数据,也说了MATLAB中的变量是可以保存到磁盘的,首先我们需要知道MATLAB现在的工作文件夹,我们可以使用pwd命令来显示现在的工作路径,cd用于切换不同的工作路径,当然和linux一样,也可以用ls来显示当前文件夹的所有文件,当我们到达了目标文件夹也找到了目标文件,如何将目标文件载入到MATLAB中呢

load('1.dat')

用上述语句可以将1.dat文件调入到MATLAB中,当执行完了load函数时我们可以使用who命令来查看当前工作区的所有变量,这点类似于python的字典,可以查询字典中有什么变量,如果你嫌弃who显示的不够详细,我们可以键入whos来获取更详细的关于变量更详细的信息,如果我们想清除所有的数据只需要键入clear命令就可以清除当前工作区的所有变量

前面我们只讲述了如何载入变量,但是没有简述如何将工作区的变量保存到电脑里我们需要使用

save hello.mat v

这样的一句话可以将变量v保存到hello.mat里,当然我们并不是非要把变量储存为mat格式的文件,我们也可以用下面的语句将v变量储存成txt格式

save hello.txt v -ascii

当然对于矩阵有一些简单明了的显示方法例如

a(:,2)
a(2,:)
a([1 3],;)

这三个语句分别展示了如何快速的显示矩阵中的特定项目,例如第一个语句时列出第二列的所有元素,第二个语句是列出第二行的所有元素,第三个语句则是列出第一、三行的所有元素。自然我们也可以对其进行替换操作。当然我们也可以给数组添加一行元素或添加一列元素

这样就为原来的数组添加了新的一列,同时数组还可以进行合并操作

a = [1 2;3 4;5 6]
b = [3 4;5 6;7 8]
c = [a b]

c矩阵这样就变成了4*3的矩阵,这样就实现了矩阵的合并

如果我们希望矩阵进行竖排合并的话就需要使用

c = [a;b]

其实简单的可以理解成;就是换到下一行。这里就是和矩阵的声明很类似,使用;表示这一行的结束

我们前面已经说了很多的关于矩阵的基本操作,那么下面就要利用MATLAB进行数据的计算了

我们可以用MATLAB来进行很多数学计算,例如log()、exp(),另外我们可以对矩阵进行find()操作

find(a < 3)

用这个命令来查找数组中小于3的元素,并加以显示。(自然在任何时候都可以使用help命令来获取帮助文档)

通过sum(a)函数可以求解矩阵a内所有元素的和,prod(a)函数可以求解矩阵a所有元素的内积,floor(a)函数可以对矩阵a中的每一个元素进行向下四舍五入,也就是0.5会被向下舍入为0,ceil(a)函数可以对矩阵中的每一个元素进行向上四舍五入,也就是0.5会被向上舍入为1,max(a)函数则会返回矩阵a中的最大元素,当然max()并不只有这么几种用法

max(a,[],1)    %返回每一列的最大值
max(a,[],2)    %返回每一行的最大值

同样的,对于sum函数也有相同的用法

sum(a,1)    %返回每一列相加的结果
sum(a,2)    %返回每一行相加的结果

自然还有inv和pinv两个函数。pinv称为伪逆函数,关于这个两个函数在上面已经有了深入的讲述了

到这里数值计算基本基本说完了,现在要说一下如何用MATLAB来绘制图像

在MATLAB中我们可以使用plot函数来进行图像绘制,不过这里的绘图是给计算机大量的点,并不是直接丢给计算机一个方程,因此我们需要生成合适的矩阵

t = [0:0.01:0.98]
y1 = sin(2*pi*4*t)
plot(t,y1)

这样一组数据就可以完成绘制一幅sin(8πt)的图像

同理我们也可以绘制其他的函数图像,如果我们想要在同一个窗口绘制一条新的曲线而旧曲线不消失,我们可以使用hold on函数来保持旧图像,xlabel()函数可以设置x轴显示的文字,ylabel()可以设置y轴显示的文字,title()函数可以设置图像的标题,而legend()则可以设置图像的图例

xlable('time')
ylabel('value')
legand('sin','cos')
title('my plot')

如果我们想要保存这副图像,那么我们可以使用

print -dpng 'filename'

来保存图像,至于plot和print的更多用法,同样可以使用help来查询

在MATLAB中我们不止可以创建一个图像显示窗口,我们可以使用figure(1)来跳转到第一个窗口

发表评论

您的电子邮箱地址不会被公开。