/*本课程笔记依托于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)来跳转到第一个窗口