zoukankan      html  css  js  c++  java
  • 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中是否用线性代数库的比较

     另一个例子

     

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

  • 相关阅读:
    LM算法学习笔记(一)
    USB3.0剖析(锆石科技FPGA)
    USB2.0系列(锆石科技FPGA)
    异步FIFO
    总线时钟同步
    [已解决]Mac下Anaconda-Navigator闪退问题
    [已解决]Mac下运行spyder提示"Python 意外退出"
    博客园账号被盗
    unhandled event loop exception解决方案
    初识ListView
  • 原文地址:https://www.cnblogs.com/lmr7/p/12667957.html
Copyright © 2011-2022 走看看