ML学习五——Octave教程(Octave Tutorial)

前期准备

下载Octave:https://ftp.gnu.org/gnu/octave/windows/octave-5.2.0-w64-installer.exe

安装完成会桌面会出现两个图标

打开GUI输入命令

5-1基本操作

可以切换提示符: ps1('>> ');

进入命令操作页面,我们可以做些基本的数学运算,如,2+5, 2^6 表示2的6次方,等

打印输出:如果键入a=3 命令行里会打印输出a=3、如果在命令行里键入a=3; 则不会在命令窗口打印出来

逻辑运算:&&-->and、|| ---> or 、xor--->异或 ,如,1 && 2 结果为0(这里的false用0来表示),xor(0,1) 其返回值为1

值得注意的是,这里的不等于用~=表示,和一般的编程语言不一样,注释用%表示

打印矩阵有以下两种方法                                                                                                                                        

 

 矩阵V :1为起始数字,0.5为步长,2为结束数字,表示1X3的矩阵,(默认步长为1,例如v = 1:6,表示1X6的矩阵)

   

随机产生3X3的矩阵(随机数实在0~1之间产生)

 

以下的是一些技巧的使用

键入ones(2,3) 表示元素都为1 的2X3 的矩阵

键入2*ones(3,2) 表示元素都为2 的3X2的矩阵

键入zeros(3,3)表示元素都为0 的3X3的矩阵

键入eye(4)则会绘制4X4的单位矩阵

w=-6+sqrt(10)*(randn(1,1000))表示均值为-6,方差为10的高斯变量随机值

hist(w,50),表示将这个矩阵中数值利用直方图表现出来如下图所示

  

 5-2移动数据

如果你有一个机器学习问题,你怎样把数据加载到 Octave 中?

怎样把数据存入一个矩阵?

如何对矩阵进行相乘?

如何保存计算结果?

如何移动这些数据并用数据进行操作?

我们键入 A=[1 2;3 4; 5 6]  会得到一个3X2的矩阵,Octave 中的  size() 命令返回矩阵的尺寸,所以size(A) 命令返回 3 2 ,事实上size()返回的命令是1X2的矩阵

如果我们键入size(A,1)命令会返回 3 ,返回的是A的行数

你也可以键入length(A),由于矩阵是一个3×2的矩阵,因此最大的维度应该是3,因此该命令会返回3。

事实上在我当前的工作区间有两个文件 ,和Linux类似 ls 可以列出文件

 

load('文件名') 可以加载文件 ,将来两个文件加载到工作区间,如图

 

who 可以查看当前区间的所有变量,whos 可以详细地查看当前区间的所有变量 

 键入 Y=  priceY(1:10)将priceY的前十个数据存入Y中

如何存储数据呢 我们可以键入命令 save hello.mat Y 将Y存入hello.mat 文件中 ,在你的工作区间就会出现hello.mat 文件

 如果你想把数据存成一个人能看懂的形式,那么可以键入 save hello.txt Y -ascii ,那么工作区间就会出现hello.txt文件

以上是读取和存储文件操作,接下来进行数据的操作

还是如上的矩阵A

如果我们键入A(3,2) 表示第三行第二列的元素 6

还可以有较为复杂的索引A([1,3],:)

 也可以为它赋值,我可以取 A 矩阵的第二列,然后将它赋值为 11 12 13,

 让我们把 设为A=[A,[101;102;103]]这样做的结果是在原矩阵的右边附加了一个新的列矩阵

还有一个小技巧,如果你就输入A(:),这是一个很特别的语法结构,意思是把 中的所有元素放入一个单独的列向量,这样我们就得到了一个 9×1 的向量,这些元素都是 A中的元素排列起来的。

我们也可以将两个矩阵组合A=[1 2; 3 4; 5 6 ] B=[11 22 ; 33 44 ;55 66]

可以新建一个C=[A B]

 也可以新建一个D =[A;B]

 5-3 计算数据

比如设置为一个3×2的矩阵A=[1 2;3 4;5 6],设置为一个3 ×2矩阵B=[11 22;33 44;55 66],设置为2 × 2矩阵C=[1 1;2 2]

键入pinv(A),通常称为伪逆矩阵

键入A*C这是矩阵的运算

你也可以做点乘运算A.*B,这么做Octave将矩阵A中的每一个元素与矩阵B中的对应元素相乘

这里我输入A.^2,这将对矩阵A中每一个元素平方

矩阵也可以这样操作,1./A 得到A中每一个元素的倒数

还有自然数e的幂次运算,就是以为e底,以这些元素为幂的运算exp(A)

我们还可以进行求对数运算,也就是对每个元素进行求对数运算log(A)

还可以用 abs()来对矩阵中的每一个元素求绝对值

我们首先构造一个V=[1;2;3]

 ones(length(v),1)就相当于ones(3,1),然后我做的是V+ones(3,1),也就是将 V的各元素都加上这些1,这样就将V的每个元素增加了1,另一种更简单的方法是直接用 V+1,V+1也就等于把  中的每一个元素都加上1

 接下来是更多的操作

矩阵A如果你想要求它的转置,那么方法是用A',将得出 A 的转置矩阵,当然,如果我写(A')',也就是A转置两次,那么我又重新得到矩阵A

还有一些有用的函数,比如:a=[1,2,5,8],这是一个1行4列矩阵,val=max(a),这将返回矩阵中的最大值8。我还可以写 [val,ind]=max(a),这将返回矩阵中的最大值存入,以及该值对应的索引,元素15对应的索

引值为4,存入

特别注意一下,如果你用命令max(A),A是一个矩阵,这样做就是对每一列求最大值

 这个矩阵a=[1,2,5,8],如果输入a<3,这将进行逐元素的运算,所以元素小于3的返回1,否则返回0。如果我写 find(a<3),这将告诉我 a中的哪些元素是小于3的

设d=magic(3),magic 函数将返回一个矩阵,d称为魔方阵或幻方 (magic squares),它们具有以下这样的数学性质:它们所有的行和列和对角线加起来都等于相同的值(机器学习里面基本用不到)

键入[r,c]=find(A<=3),这将找出所有矩阵中小于等于3的元素 ,r和c分别表示行和列

键入sum(a),就把 a 中所有元素加起来

如果我想把它们都乘起来,键入prod(a),prod 意思是product(乘积),它将返回元素的乘积

floor(a) 是向下四舍五入,因此0.5将被下舍入变成0,ceil(a),表示向上四舍五入,所以0.5将上舍入变为最接近的整数,也就是1

键入type(3),这通常得到一个3×3的矩阵,如果键入max(type(3),type(3)),这样做的结果是返回两个3×3的随机矩阵,并且逐元素比较取最大值

假如我输入max(A,[],1),这样做会得到每一列的最大值

相对地,如果我键入max(A,[],2),这将得到每一行的最大值

如果你想要找出整个矩阵A的最大值,你可以输入max(max(A)),或者你可以将 矩阵转成一个向量,然后键入max(A(:)),这样做就是把A当做一个向量,并返回A向量中的最大值。

接下来做个小实验^*^

d=magic(3)验证这个矩阵的正确性

计算他们列的和,键入sum(d,1)

计算他们行的和,键入sum(d,2)

计算他们对角线的和,构造一个3X3的单位矩阵,键入eye(3),然后我们要用 d 逐点乘以这个单位矩阵,除了对角线元素外,其他元素都会得到0,键入sum(sum(d.*eye(3)))

5-4 数据绘制

当开发学习算法时,往往几个简单的图,可以让你更好地理解算法的内容,并且可以完整地检查下算法是否正常运行,是否达到了算法的目的

我们先来快速生成一些数据用来绘图

   

横轴是变量 t,纵轴是 y1,也就是所输出的正弦函数

 

Octave将会消除之前的正弦图 y1,并且用这个余弦图 y2 来代替它

 

 解决以上的问题,我们可以用hold on

 

 我们也可以为x轴和y轴添加标签和内容,键入xlabel('time') ,键入ylabel('value'),键入legend('sin','cos'),键入title('my plot')

 

 

保存图片为PNG格式:cd  'C:\Users\用户名\Desktop'; print -dpng 'myplot.png' ,可以进入保存的路径查看

Octave也可以让你为图像标号,键入figure(1);  plot(t,y1); 将显示第一张图绘制的变量 ,键入figure(2);  plot(t,y2); 将显示第二张图绘制的变量 

还有另外一种显示方法,键入subplot(1,2,1) ;%他将图像分为1*2个格子,第三个参数表示使用第一个格子,键入plot(t,y1); 键入subplot(1,2,2); 键入plot(t,y2);

 

 可以改变坐标轴的命令:键入axis([0.5 1 -1 1])

 

 键入clf 可以清楚一张图像

可视化矩阵:键入A=magic(5)  然后键入imagesc(A)

      

 

可以将以上图像生成一个颜色的图像,键入imagesc(A),colorbar,colormap gray; 这里的三个命令同时运行逗号为连接的命令

 

 

 

 5-5 控制语句

 for 循环,首先 v = zeros(10,1)

另外,还可以通过设置你的 indices =1:10(索引) ,这时indices 就是一个从1到10的序列。

你也可以写i =indices(),这实际上和我直接把 i 写到 1 到 10 是一样。你可以写 disp(i),也能得到一样的结果。所以 这就是一个 “for” 循环。

 

 如果你对 “break” 和 “continue” 语句比较熟悉,Octave里也有 “break” 和 “continue”语句,你也可以在 Octave环境里使用那些循环语句

while循环

 

 

 if - elseif 循环

 

在当前的工作目录下有相应的 .m 文件,在我的工作目录下就有相应的文件,我们也可以切换工作区间,也可以添加pass : 键入 addpass('绝对路径')

      

 

 接下来我们来计算代价函数,他的函数内容如下

 

 首先将x和y在命令行里定义出来 :键入 x = [1 1;1 2;1 3]  键入y = [1; 2; 3] 这就表示我们的样本 

键入 theta = [0; 1] 这里的0表示代价函数的y轴的值为0,1表示斜率为1,然后键入 j = costFunJ(x,y,theta) ,他打印的结果为0 ,说明这个曲线完美的拟合了我的数据集

 当然我们也可以输入其他的theta来证明我们的代价函数的原理比如taheta[0,0],这个时候的j=2.333,通过验证(1^2+2^2+3^2)/(2*3)=2.333,这个也证明了我们的代价函数

5-6矢量

具体内容请戳:https://www.bilibili.com/video/BV164411S78V?p=31

当你实现机器学习算法时,如果你能好好利用这些线性代数库,或者数值线性代数库,并联合调用它们,而不是自己去做那些函数库可以做的事情。如果是这样的话,那么通常你会发现:首先,这样更有效,也

就是说运行速度更快,并且更好地利用你的计算机里可能有的一些并行硬件系统等等;这也意味着你可以用更少的代码来实现你需要的功能。

下面是octave中是否用线性代数库的比较

 另一个例子

 

 

 

 如何对不同的向量进行相加,请务必看视频,并且保证你确实能理解它

 

posted @ 2020-04-14 09:45  咻咻咻变小富婆  阅读(697)  评论(2编辑  收藏  举报