Machine Learning

Octave Tutorial

2017-08-03  本文已影响225人  伤口不该结疤

0. 概述

机器学习 - Octave/Matlab Tutorial 课程,Octave 常用语法记录。

1. 基本操作

1.1 加减乘除

octave:1> 5+6
ans =  11
octave:2> 1-2
ans = -1
octave:3> 2*2
ans =  4
octave:4> 2/1
ans =  2
octave:5> 2^3
ans =  8

1.2 逻辑运算

octave:6> 1==1
ans = 1
octave:7> 1==0
ans = 0
octave:8> 1>0
ans = 1

octave:9> 1>-1 % true 注释使用%表示
ans = 1
octave:10> 1 ~= 2
ans = 1
octave:11> 1 && 0
ans = 0
octave:12> 1 || 0
ans = 1

1.3 变量定义

>> num = 1; % 加分号,不回显结果
>> num      % 不加分号,回显结果
num =  1
>> num = 3
num =  3
>> str = 'hello'
str = hello

1.4 disp打印

>> a=pi
a =  3.1416
>> disp(a)
 3.1416
>> disp(sprintf('a = %0.2f', a)) % 格式化打印
a = 3.14
>> disp(sprintf('a : %f', a)) % 格式化打印
a : 3.141593

1.5 格式化输出

>> format long
>> a
a =  3.14159265358979
>> format short
>> a
a =  3.1416

2. 矩阵和向量

2.1 矩阵和向量的初始化

>> A = [1 2; 3 4; 5 6]  % 矩阵的第一种赋值方法
A =

   1   2
   3   4
   5   6

>> A = [7 8; % 矩阵的第二种赋值方法
> 2 1;
> 1 1]
A =

   7   8
   2   1
   1   1

>> v = [1 2 3]
v =

   1   2   3

% 向量赋值方法1
>> v = [1;2;3]
v =

   1
   2
   3

% 向量赋值方法2 : 从0.1开始,每次增加0.1,直到0.5结束
>> v = 0.1:0.1:0.5
v =

    0.10000    0.20000    0.30000    0.40000    0.50000

% 向量赋值方法方法3 : 从1到8
>> v = 1:8
v =

    1   2   3   4   5   6   7   8

2.2 使用函数对矩阵和向量进行初始化

% ones快速生成一个元素值全部为1的矩阵
>> ones(2,3)
ans =

   1   1   1
   1   1   1

>> 2*ones(2,3)
ans =

   2   2   2
   2   2   2

% zeros生成一个元素值全为0的矩阵
>> zeros(2,3)
ans =

   0   0   0
   0   0   0
  
% rand生成一个随机矩阵
>> rand(2,3)
ans =

   0.979697   0.966868   0.633496
   0.445040   0.055706   0.765505

% 生成高斯分布矩阵

>randn(1,3)
 ans =

  -1.05789   0.32224   0.17978

   
 %  eye生成单位矩阵
 
 >> eye(2)
ans =

Diagonal Matrix

   1   0
   0   1

>> eye(5)
ans =

Diagonal Matrix

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

3. 移动数据

3.1 计算矩阵大小

>> A
A =

   7   8
   2   1
   1   1

% A是3 x 2的矩阵,使用size计算矩阵大小
>> size(A)
ans =

   3   2

% size返回的值也是一个矩阵
>> sz = size(A)
sz =

   3   2

% sz是一个1 x 2的矩阵
>> size(sz)
ans =

   1   2

3.2 求矩阵的行和列

% 求矩阵行数
>> size(A,1)
ans =  3

% 求矩阵列数
>> size(A,2)
ans =  2

>> A = rand(2,3)
A =

   0.766966   0.786498   0.290525
   0.510301   0.027376   0.071131

% 返回最大维度
>> length(A)
ans =  3

>> A = rand(4,5)
A =

   0.6164504   0.6345112   0.2603182   0.4056419   0.3731856
   0.8411107   0.5452773   0.9944839   0.4764993   0.6534092
   0.2136008   0.4495056   0.2458233   0.0045728   0.0553468
   0.4773705   0.2054836   0.1811563   0.2756683   0.7862909

% 返回最大维度
>> length(A)
ans =  5

>> v= [1 2 3 4]
v =

   1   2   3   4

>> length(v)
ans =  4

3.3 加载数据

% 路径查看和切换,和linux命令一样
>> pwd
ans = C:\Users\admin
>> cd D:
>> pwd
ans = D:\

% D中有一支文件featuresX.dat,里面存有数据
>> ls
 驱动器 D 中的卷是 本地磁盘
 卷的序列号是 0003-7901

 D:\ 的目录

[AppData]                 [Gliffy Diagrams]         [PTCRB]
[ASM]                     [MachineLearningInAction] [Python]
[Document]                [MyDrivers]               [RTMP]
featuresX.dat             [Program Files]           [Tool]
[FreeMind]                [Program Files (x86)]
               1 个文件             30 字节
              13 个目录  9,018,798,080 可用字节

% 使用load命令将featuresX.dat加载进来
>> load featuresX.dat

% 打印出featureX的值
>> featuresX
featuresX =

   2102      1
   2020      2
   1123      4
   2339      5
   
% 取featuresX的第1到第8个值,一列一的取值
>> B = featuresX(1:8)
B =

   2102   2020   1123   2339      1      2      4      5
   
% 保存数据到磁盘

>> save v.mat v;
% v.mat的内容,被保存到D盘
# Created by Octave 4.2.1, Wed Jul 26 09:40:12 2017 GMT <unknown@unknown>
# name: v
# type: matrix
# rows: 1
# columns: 8
 2102 2020 1123 2339 1 2 4 5
 
 
>> A = featuresX
A =

   2102      1
   2020      2
   1123      4
   2339      5

% 也可以保存为普通文本
>> save A.txt A -ascii

% A.txt的文件内容
 2.10200000e+003 1.00000000e+000
 2.02000000e+003 2.00000000e+000
 1.12300000e+003 4.00000000e+000
 2.33900000e+003 5.00000000e+000

3.4 变量查看和管理

% 使用who命令,可以查到当前有哪些变量
>> who
Variables in the current scope:

A          a          ans        featuresX  num        str        sz         v

% 使用whos,可以查看变量的详细信息
>> whos
Variables in the current scope:

   Attr Name           Size                     Bytes  Class
   ==== ====           ====                     =====  =====
        A              4x5                        160  double
        a              1x1                          8  double
        ans            1x2                         16  double
        featuresX      4x2                         64  double
        num            1x1                          8  double
        str            1x5                          5  char
        sz             1x2                         16  double
        v              1x4                         32  double

Total is 43 elements using 309 bytes

% 使用clear可以清除某个变量

>> clear featuresX
>> whos
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        A           4x5                        160  double
        a           1x1                          8  double
        ans         1x2                         16  double
        num         1x1                          8  double
        str         1x5                          5  char
        sz          1x2                         16  double
        v           1x4                         32  double

Total is 35 elements using 245 bytes

% clear清除所有变量
>> clear
>> whos
>>

3.5 取矩阵中的元素

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

   1   2
   3   4
   5   6

% 取第3行第1列的元素的值
>> A(3,1)
ans =  5

% 取第2行的元素的值
>> A(2,:)
ans =

   3   4

% 取第2列的元素的值
>> A(:,2)
ans =

   2
   4
   6
    
% 取index为1和3的那两行
>> B = [2 390 1;48 39 03;2003 3 1]
B =

      2    390      1
     48     39      3
   2003      3      1

>> B([1 3], :)
ans =

      2    390      1
   2003      3      1

% 以sigle向量的形式输出所有元素
>> B(:)
ans =

      0
      1
      3
      2
     48
   2003
      0
      0
      0
      1
      3
      1
      1
      2
      3

3.6 更改、新增和合并矩阵中的元素

% 修改B的第2列的值
>> B(:,2) = [0;0;0]
B =

      2      0      1
     48      0      3
   2003      0      1
   
% 为矩阵多增加一列
>> B = [B, [1;2;3]]
B =

      2      0      1      1
     48      0      3      2
   2003      0      1      3

>> B = [[0;1;3], B]
B =

  0      2      0      1      1
  1     48      0      3      2
  3   2003      0      1      3
  

% 合并2个矩阵
>> A = [1 2;3 4;5 6]
A =

   1   2
   3   4
   5   6

>> B = [7 8;9 10;11 12]
B =

    7    8
    9   10
   11   12

>> C = [A B] % 和[A, B]结果相同
C =

    1    2    7    8
    3    4    9   10
    5    6   11   12

>> C = [A; B]
C =

    1    2
    3    4
    5    6
    7    8
    9   10
   11   12

4. 矩阵计算

4.1 乘法

>>A
A =

   1   2
   3   4
   5   6

>>C
C =

   1   2
   1   2

>>A * C
ans =

    3    6
    7   14
   11   22
   
>>B
B =

   11    2
    4    3
    1    2

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

   11    4
   12   12
    5   12

% 必须要维数相同
>>A .* C
error: product: nonconformant arguments (op1 is 3x2, op2 is 2x2)

4.2 对矩阵中的每一个元素进行操作

% .表示对每个元素操作
>>A .^2
ans =

    1    4
    9   16
   25   36

% 对每一个元素的值加1   
>>A .+1
ans =

   2   3
   4   5
   6   7

% 求每一个元素的倒数   
>>1 ./ A
ans =

   1.00000   0.50000
   0.33333   0.25000
   0.20000   0.16667

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

   1
   2
   3

>>log(v)
ans =

   0.00000
   0.69315
   1.09861

>>exp(v)
ans =

    2.7183
    7.3891
   20.0855

>>log(A)
ans =

   0.00000   0.69315
   1.09861   1.38629
   1.60944   1.79176

>>v = [-1;-2;-3]
v =

  -1
  -2
  -3

% 求绝对值
>>abs(v)
ans =

   1
   2
   3

% 加-直接求负数
>>-abs(v)
ans =

  -1
  -2
  -3

>>v
v =

  -1
  -2
  -3

% 每个元素+1
>>v + 1
ans =

   0
  -1    
  -2

4.3 求转置矩阵

% 求转置矩阵
>>v'
ans =

  -1  -2  -3

4.4 过滤出小于/大于某个值的那一行

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

    1.00000   15.00000    2.00000    0.50000

% 小于3返回1,大于3返回0
>>a < 3
ans =

  1  0  1  1

% 返回小于3的索引
>>find(a < 3)
ans =

   1   3   4

% 生成magic矩阵,对角线和每行的值之和都相同    
>>A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2

% r是行的index,c是列的index
>>[r, c] = find(A >= 7)
r =

   1
   3
   2

c =

   1
   2
   3

4.7 max函数 - 求矩阵中元素的最大值

% 求矩阵中最大值
>>max(v)
ans = -1

% 返回值和index
>>[value, index] = max(v)
    value = -1
    index =  1

% 取矩阵中最大的一行    
>>max(A)
ans =

   5   6  


% 取2个矩阵中的最大元素
>max(rand(4),rand(4))
ans =

   0.839613   0.858532   0.737582   0.927485
   0.556008   0.852108   0.948826   0.204084
   0.158905   0.911859   0.804915   0.083046
   0.920546   0.724880   0.693291   0.267202

>A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2

% 1表示取每一列的最大值
>max(A,[],1)
ans =

   8   9   7

% 2表示取每一行的最大值
>max(A,[],2)
ans =

   8
   7
   9

% 默认是取的每一行最大
>max(A)
ans =

   8   9   7

% 取所有元素中的最大
>max(max(A))
ans =  9
>

>A(:)
ans =

   8
   3
   4
   1
   5
   9
   6
   7
   2

>max(A(:))
ans =  9

4.8 矩阵求和

>A = magic(9)
A =

   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(A,1)
ans =

   369   369   369   369   369   369   369   369   369

>sum(A,2)
ans =

   369
   369
   369
   369
   369
   369
   369
   369
   369

>A.*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

>sum(A.*eye(9))
ans =

   47   68    8   20   41   62   74   14   35

>sum(sum(A.*eye(9)))
ans =  369

% 
>flipud(eye(9))
ans =

Permutation Matrix

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

>sum(sum(A.*flipud(eye(9))))
ans =  369

>A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2


>A * pinv(A)
ans =

   1.00000  -0.00000   0.00000
   0.00000   1.00000  -0.00000
  -0.00000   0.00000   1.00000

4.9 矩阵相关的函数

>>a = rand(2)
a =

   0.93306   0.80896
   0.69141   0.48648

>>prod(a)
ans =

   0.64513   0.39354

>>floor(a)
ans =

   0   0
   0   0

>>ceil(a)
ans =

   1   1
   1   1

5. 控制语句和函数

5.1 for循环

>num=0
num = 0
>for i=1:5,
> num = i + num;
> end;
>i
i =  5
>num
num =  15

>a=1:10;
>a
a =

    1    2    3    4    5    6    7    8    9   10

5.2 while

>v
v =

      2
      4
      8
     16
     32
     64
    128
    256
    512
   1024

>i=1;
>while i<
> v(i)=10
> i=i+1;
> end;
>v
v =

    100
    100
    100
    100
    100
     64
    128
    256
    512
   1024

5.3 break

>i=1;
>while true,
> v(i) = 999;
> i = i+1;
> if i==6,
> break;
> end;
> end;
>v
v =

    999
    999
    999
    999
    999
     64
    128
    256
    512
   1024

5.4 if - else

>num=1
num =  1
>if num==1,
> disp('num = 1...');
> elseif num==2,
> disp('num = 2...');
> else
> disp('num = ?...');
> end;
num = 1...

6. 自定义函数

6.1 function

% D:\MachineLearningInAction\Test\sumFunc.m
% y为返回值,x1和x2为传入的参数
function y = sumFunc(x1,x2)

y=x1+x2;

% 运行
>sumFunc(30,1)
ans =  31

% 返回多个参数
% D:\MachineLearningInAction\Test\funTest.m
function [y1,y2] = funTest(x1,x2)

y1=x1+x2;
y2=x1-x2;

% 运行
>[a,b] = funTest(20,30);
>a
a =  50
>b
b = -10

6.2 设置路径

>pwd
ans = C:\
>sumFunc(30,1)
error: 'sumFunc' undefined near line 1 column 1
>addpath('D:\MachineLearningInAction\Test')
>sumFunc(30,1)
ans =  31

7. 向量化

通过向量化的方式计算假设函数
>X = [1 0.5;1 0.3; 1 0.7];
>theta = [1;2];
>X*theta
ans =

   2.0000
   1.6000
   2.4000

Programming Exercise 1: Linear Regression会有很多用到向量化的示例,此处不再做累述。

8. 其他

8.1 隐藏Octave版本号

octave:22> PS1('>> ');
>>

8.2 help命令

>> help eye
    'eye' is a built-in function from the file libinterp/corefcn/data.cc
    
     -- eye (N)
     -- eye (M, N)
     -- eye ([M N])
     -- eye (..., CLASS)
         Return an identity matrix.
    
         If invoked with a single scalar argument N, return a square NxN
         identity matrix.
    
         If supplied two scalar arguments (M, N), 'eye' takes them to be the
         number of rows and columns.  If given a vector with two elements,
         'eye' uses the values of the elements as the number of rows and
         columns, respectively.  For example:
    
              eye (3)
               =>  1  0  0
                   0  1  0
                   0  0  1

9. 图形化

9.1 plot绘制图形

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

9.2 hold on将多个图像显示到一个figure上

>hold on; % 将y1和y2画到一个figure上
>plot(t,y1,'g'); % 设置y1的颜色为绿色
>plot(t,y2,'r') % 设置y2的颜色为red
>xlabel('time') % 设置x的label为time
>ylabel('value') % 设置y的label为value
将y1和y2画到一个figure上

9.3 设置legend和title

>legend('sin','cos');
>title('my plot')
legend和title

9.4 保存图像为png

>print -dpng 'myPlot.png'
% 图片将保存到C盘
>pwd
ans = C:\
print -dpng

9.5 关闭figure - close

close.gif

9.6 分别绘制到2个figure

>figure(1);plot(t,y1);
>figure(2);plot(t,y2);
分别绘制

9.7 分块 subplot

% 将图形分为1个1*2的格子,使用第一个格子
subplot(1,2,1);
将图形分为1个1*2的格子,使用第一个格子
% 将y1画到第一个格子中
plot(t,y1);
将y1画到第一个格子中
% 将图形分为1个1*2的格子,使用第2个格子
>subplot(1,2,2);
% 将y2画到第2个格子中
>plot(t,y2);
将图形分为1个1*2的格子,使用第2个格子,将y2画到第2个格子中

9.8 设置刻度 axis

 % 设置y2的刻度:x轴大小范围0.5 - 1,y轴大小范围-1 - 1
 >axis([0.5 1 -1 1])
设置y2的刻度:x轴大小范围0.5 - 1,y轴大小范围-1 - 1

9.9 clf - 清除图像内容

>clf
清除图像内容

9.10 可视化矩阵

>A = magic(5)
A =

   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

>imagesc(A)
可视化矩阵
 % 显示colorbar,并设置为灰色
 >imagesc(A),colorbar,colormap gray;
显示colorbar,并设置为灰色
% 通过help colormap可以查看支持的颜色
>help colormap
通过help colormap可以查看支持的颜色
% 设置颜色为hot,hot由black, red, orange, yellow, white几种颜色组成
>imagesc(A),colorbar,colormap hot;
colormap hot
上一篇下一篇

猜你喜欢

热点阅读