一、基本操作

本课程有编程作业,编程作业需要使用Matlab或Octave,本文章使用Octave。下载地址:http://www.gnu.org/software/octave/#install。安装完成后,打开GNU Octave (GUI)开始写代码。

1、基本运算

 值得注意的是Octave使用“^”符号表示次幂,而不是向其他语言一样表示异或,而异或运算使用xor()函数。并且不等于使用“~=”而不是“!=”。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
% 基本运算
5 + 6
3 - 2
5 * 8
1 / 2 % 0.5
2 ^ 6 % 2的6次方

1 == 2 % false,返回0
1 ~= 2 % 1不等于2,true,返回1

1 && 0 % AND
1 || 0 % OR
xor(1, 0) % 异或

PS1('>> ') % 修改提示符

2、变量、打印

注意:当Octave变量声明语句后面不带分号(“;”)时,Octave会打印该变量,故不需要打印的务必加分号。

disp方法也可以用于打印,该方法支持较复杂打印,可以组合字符串和数字。如 disp(sprintf('2 decimals: %0.2f', a));。

% 变量
a = 3; % 数字变量,double。加分号不打印出来
b = 'hi'; % 字符串变量
c = (3 >= 1); % 返回1
a = pi;


% 打印
disp(a);
disp(sprintf('2 decimals: %0.2f', a));% C风格
disp(sprintf('6 decimals: %0.6f', a));
% 显示长变量
format long % 打印小数点后15位
a
% 显示短变量
format short % 打印小数点后四位
a

format long打印小数点后15位数字(注意是总共打印15位,而不是最后15位的意思),format short打印小数点后4位数字。

3、矩阵、向量

一般用大写字母表示矩阵,例如A、B、X等;用小写字母表示向量,例如v、w。

% 矩阵和向量
A = [1 2; 3 4; 5 6] % 3×2矩阵
v = [1 2 3] % 1×3向量
v = [1; 2; 3] % 3×1向量

v = 1: 0.1: 2 % 1到2,步长为0.1
v = 1: 6

ones(2, 3) % 生成一个2×3且全部元素为1的矩阵
C = 2 * ones(2, 3) % 矩阵和数 数乘运算

w = zeros(1, 3) % 1×3向量且全部元素为0
w = rand(1, 3) % 1×3的随机矩阵,数据大小在0-1之间
rand(3, 3) % 3×3随机矩阵

w = randn(1, 3) % 高斯随机变量?
w = -6 + sqrt(10) * (randn(1, 10000));
% 绘制直方图
%hist(w);
hist(w, 50)

eye(5) % 生成5×5的单位矩阵(对角线元素为1,其余全为0)

注意到声明矩阵的每一行时,用空格分隔每个元素,其实使用逗号也是可以的。语句v = 1:0.1:2表明按照步长0.1生成一个行向量,元素为[1 1.1 1.2 ....... 2]。语句v = 1:6的步长为1,不指定步长默认为1,生成[1 2 3 4 5 6]向量。

二、移动数据

1、获取大小、长度

A = [1 2; 3 4; 5 6]
sz = size(A) % 返回[3 2],分别表示行数和列数

size(A, 1) % 返回行数
size(A, 2) % 返回列数
% 返回长度4,length函数返回最大维度的大小
% 若矩阵为10×1,则长度为10。通常对向量使用length函数
v = [1 2 3 4]
length(v)

使用size函数可求得矩阵的行数与列数,使用size(A,1)取得行数,使用size(A, 2)取得列数。

length函数会返回长度最长的长度,如length(A)返回3,通常对向量使用length函数。

2、一些常用命令

pwd % 查看当前所在目录
% cd 'path' % 改变当前目录
ls % 列出当前所有文件
clc % 清空控制台输出

who % 查看工作空间所有变量
whos % 查看工作空间所有变量的细节

% clear data % 清空(删除)data变量
% clear % 清空所有变量

load hello.txt % 加载数据并赋值,注意:这样加载不能赋值到变量中
data = load('hello.txt') % 也可以这样加载

save hello.mat v % 将变量v存入hello.mat文件中

一些命令的运行结果如下:

吴恩达机器学习(四) 使用Octave 人工智能 第1张

3、访问、修改矩阵和向量

A(3, 2) % 取第3行第2列的数据
A(3, 2) = 10 % 将第3行第2列赋值为10
A(2, :) % 取出第2行数据, :表示某一行或某一列的所有数据
A(:, 2) % 取出第2列数据
A([1 3], :) % 取出第1行和第3行所有数据
A([1;3], :) % 一样,取出第1行和第3行所有数据

A(:, 2) = [10; 11; 12] % 修改第2列
A = [A, [100; 101; 102]] % 附加1列作为最后一列
A(:) % 将A所有元素按列形成一个列向量

A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [A B] % A和B按列连接形成C(3×4)矩阵
C = [A; B] % A和B按行连接形成C(6×2)矩阵

使用冒号可以很方便的取出某一行或某一列的数据。访问和修改数据只需要使用下标即可。值得注意的是,在修改矩阵某一列或添加一列的时候赋值的向量一定要和矩阵的行数相同,否则报错。同理,修改一行时需要和列数相同。

三、矩阵、向量运算

1、基本运算

A = [1, 2; 3, 4; 5, 6] % 3x2矩阵
B = [11, 12; 13, 14; 15, 16] % 3x2矩阵
C = [1, 1; 2, 2] % 2x2矩阵

A * C % 矩阵乘法
A .* B % 矩阵对应元素相乘
A .^ 2 % 矩阵每个元素都做平方运算

A' % A的转置
v = [1; 2; 3]
1 ./ v % 向量每个元素取倒数

log(v) % 每个元素取对数
exp(v) % 每个元素进行指数运算
abs(v) % 每个元素取绝对值

矩阵乘法需要左矩阵的列数与右矩阵的行数相同,例如A矩阵为3x2,C矩阵为2x2,他们相乘后得到3x2矩阵。

点乘运算为“.*”,两个矩阵点乘需要为同型矩阵,同型矩阵就是行数和列数都一样的矩阵。同理还有“.+”、“.-”、“./”等运算,当两边都是矩阵时需要同型。

若点乘的时数字,如A .^ 2,这个运算就是矩阵中的每个元素都做平方运算。同理A.-2就是每个元素减2。

log函数、exp函数、abs函数对每个元素分别就行求对数、求指数、求绝对值。

吴恩达机器学习(四) 使用Octave 人工智能 第2张

吴恩达机器学习(四) 使用Octave 人工智能 第3张

2、查找、求和

使用max函数查找最大值,使用find函数查找满足条件的元素下标。

a = [1, 15, 2, 0.5]
[val, ind] = max(a) % 返回最大值以及最大值的下标

a < 3 % 返回所有值的比较结果,小于则返回1, 大于则返回0
find(a < 3) % 仅返回那些小于3的值的下标

A = magic(3) % 返回魔术矩阵,该矩阵每行、每列、对角线、副对角线之和均相等
[rows, cols] = find(A >= 7) % 返回行下标和列下标

sum(a) % 求和
prod(a) % 所有元素相乘
floor(a) % 向下取整
ceil(a) % 向上取整
round(a) % 四舍五入

max(rand(3), rand(3)) % 对应元素对比,较大者存入新矩阵
max(A, [], 1) % 找到每一列的最大值组成向量
max(A, [], 2) % 找到每一行的最大值组成向量
max(A) % 等价于max(A, [], 1)

max(max(A)) % 找到矩阵最大值,等价于max(A(:))

A = magic(9)
sum(A, 1) % 求出每一列之和
sum(A, 2) % 求出每一行之和
sum(A) %  等价于sum(A, 1)

A .* eye(9) % 取对角线元素
sum(sum(A .* eye(9))) % 求对角线元素之和

flipud(eye(9)) %翻转形成副对角
sum(sum(A .* flipud(eye(9)))) % 副对角元素求和

A = magic(3)
pinv(A) % 求逆矩阵

a<3将a向量中每个元素与3比较,小于的返回1,大于的返回0,这样每个元素的真假值组成一个向量。而find函数则是返回符合条件的所有元素的下标。

吴恩达机器学习(四) 使用Octave 人工智能 第4张

吴恩达机器学习(四) 使用Octave 人工智能 第5张

吴恩达机器学习(四) 使用Octave 人工智能 第6张

 

四、绘制图像

绘制图像使用plot函数,plot函数绘制的是曲线图。绘制函数主要是使用向量(行向量或列向量均可)给出x轴和y轴的一系列点,每个点(x,y)绘制在二维坐标系上,再将这些点连线。

t = [0: 0.01: 0.98];% x轴

y1 = sin(2 * pi * 4 * t); % sin函数,函数值,y轴
plot(t, y1);

y2 = cos(2 * pi * 4 * t); % cos函数
plot(t, y2); % 绘制后sin函数会被cos替代

上图的函数一起绘制的话sin函数会被cos函数覆盖。

吴恩达机器学习(四) 使用Octave 人工智能 第7张

要使得两个函数绘制在同一个窗口中,需要使用hold on命令。此外使用xlabel、ylabel、legend、title分别制动x轴标签、y轴标签、图例和标题。

plot(t, y1);
hold on; % 在同一个坐标系上绘制
plot(t, y2, 'r'); % 绘制为红色
xlabel('time') % x轴标签
ylabel('value') % y轴标签
legend('sin', 'cos') % 图例
title('my plot')

print -dpng 'myPlot.png' % 保存为图片文件
close; % 关闭图像

吴恩达机器学习(四) 使用Octave 人工智能 第8张

 

还可以使用figure命令打开多个窗口,用数字对窗口编号。

% 打开两个窗口
figure(1); plot(t, y1);
figure(2); plot(t, y2);

吴恩达机器学习(四) 使用Octave 人工智能 第9张

 

还可以使用subplot函数将窗口分为多个格子,指定在某一格子绘图。用axis指定x轴的范围和y轴的范围。

subplot(1, 2, 1) % 将画板分为1×2的格子,并使用第1个格子绘制
plot(t, y1);
subplot(1, 2, 2) % 使用第2个格子
plot(t, y2, 'r')

axis([0.5 1 -1 1]) % 前两个是x的范围,后两个是y的范围

clf; % 清除所有绘制图像

 

吴恩达机器学习(四) 使用Octave 人工智能 第10张

 

还可以对矩阵绘制,每一格表示一个数值,元素数值越大越接近黄色。对于绘制灰色图像,数值越大越接近白色。这可以帮助我们直观了解矩阵内元素的大小关系。

A = magic(5);
imagesc(A), colorbar; % 可视化矩阵,绘制为彩色
imagesc(A), colorbar, colormap gray; % 绘制为灰白色

吴恩达机器学习(四) 使用Octave 人工智能 第11张

吴恩达机器学习(四) 使用Octave 人工智能 第12张

 

五、控制语句

和其他语言基本一样,不一样的是没有花括号包住语句,取而代之的是缩进和end。

v = zeros(10, 1);
% for
for i = 1 : 10,
  v(i) = 2 ^ i;
end
v % 打印,下面的同理

indices = 1:10;
for i = indices,
  disp(i);
end

% while
i = 1;
while i <= 5,
  v(i) = 100;
  i = i + 1;
end
v

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


% if、elseif、else
v(1) = 2;
if v(1) == 1,
  disp('The value is one');
elseif v(1) == 2,
  disp('The value is two');
else
  disp('The value is not one or two');
end;

 

函数的编写与其他语言差别较大,Octave函数可以返回多个返回值。多返回值用逗号隔开。y1和y2是返回值,Octave不使用return语句返回,而是在函数体内直接对返回变量赋值。

function [y1, y2] = squareThisNumber(x),
  y1 = x ^ 2;
  y2 = x ^ 3;
end

调用函数

[val1, val2] = squareThisNumber(10) % 调用函数

打印输出

吴恩达机器学习(四) 使用Octave 人工智能 第13张

 

六、向量化

若我们要求解θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x45x5。为向量化的实现可能是使用for循环实现。

吴恩达机器学习(四) 使用Octave 人工智能 第14张

但如果使用向量化将令θ = [θ0;  θ1;  θ2;  θ3;  θ4;  θ5](l列向量),令 x = [x0; x1; x2; x3; x4; x5](列向量)。

这样只需要用θTx就可求解θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x4 +θ5x5。极大方便了我们的运算。称之为向量化

吴恩达机器学习(四) 使用Octave 人工智能 第15张

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄