Octave编程基础入门

【README】

  • 0. octave介绍:        
    • octave是什么: octave是一种开源编程语言,通过它可以快速实现机器学习算法,并提供丰富的画图功能;(专业的算法做专业的事情)
    • 可以先使用 octave 构造算法原型(快速实现算法), 如果需要在大规模机器学习项目,再把算法通过c++或java来实现;
    • octave优点:
      • 在机器学习领域,人们通常选择的语言是 octave matlab python numPy 和 R;
        • octave是开源免费的;matlab不是每个人都可以买得起;
        • 相比于python, octave语法更加简单;
  • 1. 本文总结自【吴恩达机器学习系列课程】,非常棒,墙裂推荐
  • 2. octave安装,参见 Octave下载与安装教程_octave中editor如何下载-CSDN博客

【1】基本操作

【1.1】数学运算

octave:1> 56  
ans = 56
octave:2> 5+6 
ans = 11
octave:3> 1+2
ans = 3
octave:4> 1 == 2 % bool 运算
ans = 0
octave:5> 2^6  % 乘方 
ans = 64
octave:6> 1 ~= 2  % 非
ans = 1
octave:7> 1 && 0 % 且
ans = 0
octave:8> 1 || 0  % 或 
ans = 1

补充: 修改前缀提示 octave 为 >>

octave:9> PS1('>> ');
>>
>> a = 3;
>> a

【1.2】变量

>> a = 3; % 变量a,赋值为3 分号表示不打印 
>> a  % 打印变量a 
a = 3
>> a=4
a = 4
>> a=pi; 
>> a
a = 3.1416
>> disp(a)  % disp 表示打印字符串 
3.1416

>> disp(sprintf('2 decimals: %0.2f', a))  % 字符串格式化后打印
2 decimals: 3.14
>> format long  % 格式化为long
>> a
a = 3.141592653589793
>> format short
>> a
a = 3.1416
>> b='hello world'  % 声明字符串 
b = hello world
>> b
b = hello world

【1.3】矩阵操作

>> A = [1 2; 3 4; 5 6] % 定义矩阵
A =

   1   2
   3   4
   5   6

>>
>> V = [ 1 2 3 ] % 定义行向量(矩阵) 
V =

   1   2   3

>> V=[1;2;3]  % 定义列向量(矩阵)
V =

   1
   2
   3

>> V=1:0.1:2  % 数组 最小值1  最大值2 步长0.1
V =

    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000

>> V=1:6 % 数组 最小值1 最大值6 步长1
V =

   1   2   3   4   5   6

>>
>> ones(2,3) % 生成全为1的矩阵 ,2行3列 
ans =

   1   1   1
   1   1   1

>> B = 2*ones(2,3)  % 2乘以矩阵 
B =

   2   2   2
   2   2   2

【1.3.1】单位阵与直方图

>> D = zeros(1,3) % 0矩阵 
D =

   0   0   0

>> d = rand(3,3) % 随机数矩阵 
d =

   0.100062   0.491889   0.970450
   0.397184   0.755019   0.036465
   0.254940   0.213161   0.758412

>>
>> w = -6 + sqrt(10)*(randn(1,1000));  % randn产生高斯分布的数列 
>> hist(w)  %直方图 
>> hist(w,50)  % 直方图,50个柱子
>>
>> eye(4) % 单位阵 
ans =

Diagonal Matrix

   1   0   0   0
   0   1   0   0
   0   0   1   0
   0   0   0   1

>> help eye  % 帮助命令

【2】移动数据(数据文件加载与保存)

【2.1】size与length函数

>> A = [1 2;3 4;5 6] 
A =

   1   2
   3   4
   5   6

>> size(A) % 获取矩阵大小,返回值是一个矩阵(1*2);3行2列 
ans =

   3   2

>> sz=size(A)
sz =

   3   2

>> size(A,1) % 返回矩阵第1维度的大小 
ans = 3
>> size(A,2) % 返回矩阵第2维度的大小 
ans = 2
>>
>> V=[1 2 3 4] % 定义行向量 
V =

   1   2   3   4

>> length(V) % 行向量的最大维度 (length一般用于向量, 不用于矩阵) 
ans = 4
>> length(A) % 矩阵的最大维度(2 3 取3) 
ans = 3 
>>

【2.2】加载文件

>> pwd % 当前路径
ans = C:\Users\pacoson
>> cd D:\studynote\compute_basis\machine_learning\wuenda_ml\dataset  %打开路径 
>>
>> load featureX.dat  %  加载文件
>> who % 查看变量 
Variables visible from the current scope:

A         B         C         D         V         a         ans       b         d         featureX  featureY  sz        w

>> whos % 查看变量详情 
Variables visible from the current scope:

variables in scope: top scope

  Attr   Name          Size                     Bytes  Class
  ====   ====          ====                     =====  =====
         A             3x2                         48  double
         B             2x3                         48  double
         C             1x3                         24  double
         D             1x3                         24  double
         V             1x4                         32  double
         a             1x1                          8  double
         ans           1x16                        16  char
         b             1x11                        11  char
         d             3x3                         72  double
         featureX      9x2                        144  double
         featureY      9x1                         72  double
         sz            1x2                         16  double
         w             1x1000                    8000  double

Total is 1088 elements using 8515 bytes

>> clear b  % 清空变量b 
>>

【2.3】保存数据到文件 

>> load priceY.dat % 加载文件 
>>
>> whos
Variables visible from the current scope:

variables in scope: top scope

  Attr   Name          Size                     Bytes  Class
  ====   ====          ====                     =====  =====
         A             3x2                         48  double
         B             2x3                         48  double
         C             1x3                         24  double
         D             1x3                         24  double
         V             1x4                         32  double
         a             1x1                          8  double
         ans           1x16                        16  char
         d             3x3                         72  double
         featureX      9x2                        144  double
         priceY        9x1                         72  double
         sz            1x2                         16  double
         w             1x1000                    8000  double

Total is 1077 elements using 8504 bytes

>> v=priceY(1:5)  % priceY矩阵的前5行赋值给v 
v =

   11234
   86234
   21334
   44244
   51235

>> whos
Variables visible from the current scope:

variables in scope: top scope

  Attr   Name          Size                     Bytes  Class
  ====   ====          ====                     =====  =====
         A             3x2                         48  double
         B             2x3                         48  double
         C             1x3                         24  double
         D             1x3                         24  double
         V             1x4                         32  double
         a             1x1                          8  double
         ans           1x16                        16  char
         d             3x3                         72  double
         featureX      9x2                        144  double
         priceY        9x1                         72  double
         sz            1x2                         16  double
         v             5x1                         40  double
         w             1x1000                    8000  double

Total is 1082 elements using 8544 bytes

>> save copyOfPriceY.mat v; % 保存为.mat文件,会压缩数据,用于保存大数据 
>>
>> clear
>> load copyOfPriceY.mat
>> whos
Variables visible from the current scope:

variables in scope: top scope

  Attr   Name        Size                     Bytes  Class
  ====   ====        ====                     =====  =====
         v           5x1                         40  double

Total is 5 elements using 40 bytes
>>
>> save copyOfPriceY3.txt v -ascii;  % 保存变量v到txt文本文件 编码为ascii 
>>

【2.4】矩阵操作

>> A=[1 2;3 4;5 6] % 定义矩阵 
A =

   1   2
   3   4
   5   6

>> A(3,2) % 获取矩阵A的值,坐标第3行第2列 
ans = 6
>> A(2,:) % 获取矩阵A的第2行 (行向量)
ans =

   3   4

>> A(:,2) %获取矩阵A的第2列的列向量 
ans =

   2
   4
   6

>> A([1 3],:) % 获取矩阵第1行和第3行的行向量
ans =

   1   2
   5   6
>> A
A =

   1   2
   3   4
   5   6
>> A(:,2) % 矩阵第2列的列向量 
ans =

   2
   4
   6
>> A(:,2)=[10;11;12] % 赋值: 给矩阵A第2列的列向量赋值,赋值后形成新的矩阵A
A =

    1   10
    3   11
    5   12
>> A=[A,[100;101;102]] % 给矩阵A新增一个列向量 
A =

     1    10   100
     3    11   101
     5    12   102
>> A(:) % 收集并打印A的所有元素
ans =

     1
     3
     5
    10
    11
    12
   100
   101
   102

>> A=[1 2;3 4;5 6];
>> B=[11 12;13 14;15 16]
B =

   11   12
   13   14
   15   16

>> C=[A B] % 把B作为新列向量拼接 
C =

    1    2   11   12
    3    4   13   14
    5    6   15   16
>> C=[A;B] % 把B作为新行向量拼接
C =

    1    2
    3    4
    5    6
   11   12
   13   14
   15   16

【3】矩阵计算

 【3.1】矩阵运算

>> A=[ 1 2;3 4;5 6] 
A =

   1   2
   3   4
   5   6

>> B=[11 12;13 14;15 16]
B =

   11   12
   13   14
   15   16

>> C=[1 1 ;2 2]
C =

   1   1
   2   2

>> A*C % 矩阵乘法 
ans =

    5    5
   11   11
   17   17

>> A.*B % 对应位置的元素相乘 
ans =

   11   24
   39   56
   75   96

>> A.^2  % 矩阵每个元素平方
ans =

    1    4
    9   16
   25   36

【3.2】矩阵函数

>> V=[1;2;3]
V =

   1
   2
   3

>> 1./V  % 矩阵元素的倒数
ans =

   1.0000
   0.5000
   0.3333

>> 1./A
ans =

   1.0000   0.5000
   0.3333   0.2500
   0.2000   0.1667

>> log(V) # 每个元素求对数 
ans =

        0
   0.6931
   1.0986

>> abs(V) % 绝对值 
ans =

   1
   2
   3

【3.3】矩阵转置

>> V+1 % 矩阵加法 
ans =

   2
   3
   4

>> A
A =

   1   2
   3   4
   5   6

>> A'  % 转置 
ans =

   1   3   5
   2   4   6

【3.4】矩阵元素的函数

>> A=[1 15 2 0.5]
A =

    1.0000   15.0000    2.0000    0.5000
>> val=max(A) % 找出矩阵元素的最大值 
val = 15
>> [val,ind]=max(A) % 找出矩阵元素的最大值和下标
val = 15
ind = 2
>> A < 3
ans =

  1  0  1  1

>>
>> find(A<3) % 找出小于3的元素的下标 
ans =

   1   3   4


>> A 
A =

    1.0000   15.0000    2.0000    0.5000

>> sum(A)  % 矩阵元素累加
ans = 18.500
>> prod(A) % 矩阵元素相乘 
ans = 15
>> floor(A) % 矩阵元素向下取整数
ans =

    1   15    2    0

>> ceil(A) % 向上取取整
ans =

    1   15    2    1

>> rand(3) % 随机值矩阵 
ans =

   0.4904   0.4963   0.9169
   0.7345   0.5650   0.5107
   0.7243   0.4943   0.4580

>> max(rand(3), rand(3)) % 随机值矩阵最大元素构成的矩阵 
ans =

   0.8598   0.9433   0.5683
   0.4264   0.4045   0.3570
   0.6971   0.1840   0.7685

>>

【3.5】魔法矩阵及其运算

>> M=magic(3)  % 魔法矩阵magic,每行元素或每列元素或对角线上元素累加值相同 
M =

   8   1   6
   3   5   7
   4   9   2

>> [r,c]=find(M>=7) % 找出大于等于7的元素的位置 第1行第1列,第3行第2列,第2行第3列;
r =

   1
   3
   2

c =

   1
   2
   3

>> M
M =

   8   1   6
   3   5   7
   4   9   2

>> max(M, [], 1)  % 计算每列的最大元素
ans =

   8   9   7

>> max(M, [], 2) % 计算每行的最大元素 
ans =

   8
   7
   9

>> max(M) % 默认% 计算每列的最大元素
ans =

   8   9   7

>> max(max(M)) % 整个矩阵的最大元素 
ans = 9
>>
>> M(:) % 把矩阵所有列向量转为一个列向量  
ans =

   8
   3
   4
   1
   5
   9
   6
   7
   2

>> max(M(:)) 
ans = 9

【3.5.1】计算魔法矩阵的元素累加和

>> M=magic(9)
M =

   47   58   69   80    1   12   23   34   45
   57   68   79    9   11   22   33   44   46
   67   78    8   10   21   32   43   54   56
   77    7   18   20   31   42   53   55   66
    6   17   19   30   41   52   63   65   76
   16   27   29   40   51   62   64   75    5
   26   28   39   50   61   72   74    4   15
   36   38   49   60   71   73    3   14   25
   37   48   59   70   81    2   13   24   35

>> sum(M,1) % 求每个列向量的元素累加和 
ans =

   369   369   369   369   369   369   369   369   369

>> sum(M,2) % 求每个行向量的元素累加和 
ans =

   369
   369
   369
   369
   369
   369
   369
   369
   369

>>  M.*eye(9) % 矩阵点乘单位阵 
ans =

   47    0    0    0    0    0    0    0    0
    0   68    0    0    0    0    0    0    0
    0    0    8    0    0    0    0    0    0
    0    0    0   20    0    0    0    0    0
    0    0    0    0   41    0    0    0    0
    0    0    0    0    0   62    0    0    0
    0    0    0    0    0    0   74    0    0
    0    0    0    0    0    0    0   14    0
    0    0    0    0    0    0    0    0   35

>> M.*flipud(eye(9)) % 矩阵点乘反向单位阵 
ans =

    0    0    0    0    0    0    0    0   45
    0    0    0    0    0    0    0   44    0
    0    0    0    0    0    0   43    0    0
    0    0    0    0    0   42    0    0    0
    0    0    0    0   41    0    0    0    0
    0    0    0   40    0    0    0    0    0
    0    0   39    0    0    0    0    0    0
    0   38    0    0    0    0    0    0    0
   37    0    0    0    0    0    0    0    0

>>
>> M=magic(3)
M =

   8   1   6
   3   5   7
   4   9   2

>> pinv(M)  % 求伪逆 
ans =

   0.147222  -0.144444   0.063889
  -0.061111   0.022222   0.105556
  -0.019444   0.188889  -0.102778

>> M*pinv(M) % 矩阵乘以矩阵的逆得到单位阵 
ans =

   1.0000e+00  -1.1380e-14   6.3005e-15
   1.7347e-17   1.0000e+00  -1.3878e-17
  -5.8148e-15   1.2768e-14   1.0000e+00

【4】数据绘制(画图)(可视化)

1. 通过绘制模型结果的图像,可以促使研究人员更好的优化算法

2. 画图函数 plot();

【4.1】正弦与余弦函数

>> t=[0:0.01:0.98];
>> y1=sin(2*pi*4*t); % 正弦函数 
>> plot(t,y1);
>>
>> y2=cos(2*pi*4*t); % 余弦函数 
>> plot(t,y2);
>>

【4.2】多个函数在一个画布上画图

>> plot(t, y1); % 画 sin 图
>> hold on; % 等待,在同一个画图上画第2个函数 
>>
>> plot(t, y2,'r'); % 画第2个函数 cos ,且 r=红色 
>> xlabel('time');ylabel('value'); % 设置x标签,y标签名称 
>> legend('sin', 'cos'); % 添加线条说明 
>>
>> title('my plot test') % 新增图标题 
>>
>> print -dpng 'myplot.png' % 保存到本地
>> close % 关闭画步 

【4.3】为图像标号(如 1 2  3 )

>> figure(1);plot(t, y1);  // 声明画布1
>> figure(2);plot(t, y2,'r'); // 画布2 
>>

【4.4】把画布分割为多个格子

(即一个画布用于展示多个模型的图像)

>> subplot(1,2,1); %把画布分为 1*2的格子,使用第1个格子 
>> plot(t, y1);  % 把图像画在第1个格子
>> subplot(1,2,2); %把画布分为 1*2的格子,使用第2个格子 
>> plot(t,y2);  % 把图像画在第2个格子 
>>
>> axis([0.5 1 -1  1]) % 修改第2个格子图像的坐标 (横坐标范围0.5到1,纵坐标范围 -1 到1)

补充:清除图像: clf;


【4.5】彩色图与颜色条

>> M = magic(5);
>> imagesc(M) % 彩色格子图 
>>
>> imagesc(M), colorbar, colormap gray; % 逗号分割,同时执行3条命令;colorbar带颜色条 
>> M
M =

   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9


【5】控制语句for-whole-if

【5.1】for循环与while循环

>> v=zeros(10,1) %定义10*1的矩阵,值为0 
v =

   0
   0
   0
   0
   0
   0
   0
   0
   0
   0

>> for i=1:10, % 声明for循环 
> v(i)=2^i;
> end;  % 结束标志 
>> v
v =

      2
      4
      8
     16
     32
     64
    128
    256
    512
   1024

>> i=1;
>> while i<=5,  % 声明while循环 
> v(i)=100;
> i=i+1;
> end;  % while循环结束
>> v
v =

    100
    100
    100
    100
    100
     64
    128
    256
    512
   1024

【5.2】if判断语句

>> i=1;
>> while true,
>    v(i)=999;
>    i=i+1;
>    if i == 6,  % if判断语句 
>      break;
>    end ; % if结束 
> end ;
>> v
v =

    999
    999
    999
    999
    999
     64
    128
    256
    512
   1024

>>
>> v(1)=2;
>> if v(1)==1, disp('one');  % if判断
> elseif v(1) == 2, disp('two')  % elseif判断
> ;else disp('other');  % else判断
> end;  % if判断结束 
two
>>

【5.3】定义函数

函数声明: 新建 mysqure.m 文件,如下:

function y = mysqure(x)

y=x^2;
>> mysqure(3) % 搜索路径下查找函数 mysuqre ,并执行 
ans = 9
>> addpath('D:\studynote\compute_basis\machine_learning\wuenda_ml\dataset')  % 把路径添加到函数搜索路径 
>>
>> mysqure(5)
ans = 25

【5.3.1】定义返回多个值的函数

function [y1,y2] = mysqureReturnResults(x)

y1=x^2;
y2=x^3;

执行函数结果:

>> [r1, r2] = mysqureReturnResults(5)
r1 = 25
r2 = 125
>>

【5.3.2】例子-计算成本函数值

function J = costFunJ(X, y, theta)

m = size(X,1) % 训练集个数 
predictions = X * theta; % 预测值 
sqrErrors = (predictions-y).^2; % 误差 

J= 1/(2*m) * sum(sqrErrors); % 成本函数
>> X=[1 1;1 2;1 3] % 定义X矩阵 
X =

   1   1
   1   2
   1   3

>> y=[1; 2; 3] % 定义预测值向量y 
y =

   1
   2
   3

>> theta=[0;1];  % 定义模型参数 theta 
>> j=costFunJ(X,y,theta) % 送入成本函数,计算成本 
m = 3
j = 0 
>> theta=[0;0]; % 更换模型参数,再次计算成本 
>>
>> j=costFunJ(X,y,theta)
m = 3
j = 2.3333 

【6】矢量 (向量化)

使用各种语言提供的数值线性函数库,计算会更加高效; 

此外,代码也会更少, 出错少,而且运行高效(因为底层做了并行优化,更好利用硬件资源); 

【6.1】非向量化与向量化对比

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值