DanielLaah

Coursera机器学习笔记(四) - Octave教程


基本操作

四则运算

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

逻辑运算

1
2
3
4
5
6
7
8
9
10
octave:6> 1 == 2
ans = 0
octave:7> 1 ~= 2
ans = 1
octave:8> 1 && 0
ans = 0
octave:9> 1 || 0
ans = 1
octave:10> xor(1,0)
ans = 1

其他

更改提示符:

1
2
octave:11> PS1('>> ')
>>

添加分号可抑制输出:

1
2
3
4
>> a = 1
a = 1
>> a = 1;
>>

圆周率$\pi$:

1
2
>> a = pi
a = 3.1416

常数$e$:

1
2
>> e
ans = 2.7183

格式化输出:

1
2
3
4
5
6
7
8
9
10
>> disp(sprintf('6 decimals: %0.6f', a))
6 decimals: 3.141593
>> disp(sprintf('6 decimals: %0.2f', a))
6 decimals: 3.14
>> format long
>> a
a = 3.14159265358979
>> format short
>> a
a = 3.1416

矩阵

构造一个矩阵,方式一:

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

1 2
3 4
5 6

构造一个矩阵,方式二:

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

1 2
3 4
5 6

构造一个横向量:

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

1 2 3

构造一个列向量:

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

1
2
3

从1到2,每次递增0.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> v = 1:0.1:2
v =

Columns 1 through 5:

1.0000 1.1000 1.2000 1.3000 1.4000

Columns 6 through 10:

1.5000 1.6000 1.7000 1.8000 1.9000

Column 11:

2.0000

从1到6,每次递增1(默认):

1
2
3
4
>> v = 1:6
v =

1 2 3 4 5 6

所有元素均为1:

1
2
3
4
5
>> ones(2, 3)
ans =

1 1 1
1 1 1

每个元素乘以2:

1
2
3
4
5
>> C = 2*ones(2, 3)
C =

2 2 2
2 2 2

高斯随机数:

1
2
3
4
5
6
>> rand(3, 3)
ans =

0.751588 0.906707 0.081204
0.411613 0.457779 0.882052
0.622524 0.774499 0.811092

所有元素均为0:

1
2
3
4
>> w = zeros(1, 3)
w =

0 0 0

单位阵:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> I = eye(5)
I =

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


A =

1 2
3 4
5 6

读取矩阵A第三行第二列的元素:

1
2
>> A(3, 2)
ans = 6

读取矩阵A第2列所有元素:

1
2
3
4
5
6
>> A(:,2)
ans =

2
4
6

读取矩阵A第2行所有元素:

1
2
3
4
>> A(2,:)
ans =

3 4

读取矩阵A第1行和第3行的所有元素:

1
2
3
4
5
>> A([1 3],:)
ans =

1 2
5 6

将A第二列替换为[10;11;12]:

1
2
3
4
5
6
>> A(:,2) = [10; 11; 12]
A =

1 10
3 11
5 12

在A的最后加上一列:

1
2
3
4
5
6
>> A = [A, [100; 101; 102]]
A =

1 10 100
3 11 101
5 12 102

将A所有的元素合并成一个列向量

1
2
3
4
5
6
7
8
9
10
11
12
>> A(:)
ans =

1
3
5
10
11
12
100
101
102

两个矩阵的合并(列合并)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> 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]
C =

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

两个矩阵的合并(行合并)

1
2
3
4
5
6
7
8
9
>> D = [A;B]
D =

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

查看帮助:

1
>> help eye


构造10000个随机数,并绘制出图形(高斯分布):

1
2
>> w=randn(1,10000);
>> hist(w,50)

高斯分布

数据的读取与存储

本节所用到的数据: featuresX.dat, priceY.dat

读取数据

1
2
3
4
5
% 找到文件所在目录:
>> cd Desktop/
>> cd 'Machine Learning/'
>> ls
featuresX.dat priceY.dat

数据如下所示:

读取数据:

1
2
3
% 方式一:
>> load featuresX.dat
>> load priceY.dat

1
2
3
% 方式二:
>> load('featuresX.dat')
>> load('priceY.dat')

使用who命令显示当前所有变量:

1
2
3
4
5
6
>> who
Variables in the current scope:

A a featuresX v y
C ans priceY w
I c sz x

可以看到,刚才导入的数据已经在变量featuresXpriceY中了。
展示数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
>> featuresX
featuresX =

2104 3
1600 3
2400 3
1416 2
3000 4
1985 4
1534 3
... ..

>> size(featuresX)
ans =

27 2

>> priceY
priceY =

3999
3299
3690
2320
5399
2999
...

>> size(priceY)
ans =

27 1

使用whos查看变量更详细的信息:

使用如下命令用来删除某个变量:

1
2
>> clear featuresX
>> whos

这个时候再使用whos查看,发现featuresX已经不见了。

存储数据

假设我们现在需要取出priceY前十个数据,使用如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
>> v = priceY(1:10)
v =

3999
3299
3690
2320
5399
2999
3149
1989
2120
2425

该如何存储这十个数据呢?使用save命令:

1
2
3
>> save hello.mat v
>> ls
featuresX.dat hello.mat priceY.dat

清空所有变量:

1
2
3
>> clear
>> whos
>> %无任何输出

刚才存储数据是以二进制的形式进行存储,我们也可以使用人能够读懂的形式存储。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>> load hello.mat
>> whos
Variables in the current scope:

Attr Name Size Bytes Class
==== ==== ==== ===== =====
v 10x1 80 double

Total is 10 elements using 80 bytes

>> v
v =

3999
3299
3690
2320
5399
2999
3149
1989
2120
2425

>> save hello.txt v -ascii
>> ls
featuresX.dat hello.mat hello.txt priceY.dat

数据的计算

1
2
3
4
5
6
7
8
% 各种矩阵运算
>> A * B
>> A .* B
>> A .^ 2
>> 1 ./ A
>> log(A)
>> exp(A)
>> -A

A中的每个元素都加上1:

1
>> A + ones(size(A))

这样也可以:

1
>> A + 1

矩阵转置:

1
>> A'

向量中的最大值:

1
2
3
4
5
6
7
8
>> A = [1 3 0.5 10 100]
A =

1.00000 3.00000 0.50000 10.00000 100.00000

>> [val ind] = max(A)
val = 100
ind = 5

比较大小:

1
2
3
4
5
6
7
8
9
10
11
12
13
>> A = [1 2; 3 4; 5 6]
A =

1 2
3 4
5 6

>> A > 3
ans =

0 0
0 1
1 1

找出向量中特定元素:

1
2
3
4
5
6
>> find(A > 3)
ans =

3
5
6

找出矩阵中特定元素:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> [r c] = find(A >= 3)
r =

2
3
2
3

c =

1
1
2
2

生成任意行、列、对角线和相等的矩阵:

1
2
3
4
5
6
>> magic(3)
ans =

8 1 6
3 5 7
4 9 2

向量所有元素的和:

1
2
3
4
5
6
7
>> a = [1.2 2.3 4.5 6.6]
a =

1.2000 2.3000 4.5000 6.6000

>> sum(a)
ans = 14.600

向上及向下取整:

1
2
3
4
5
6
7
8
9
>> floor(a)
ans =

1 2 4 6

>> ceil(a)
ans =

2 3 5 7

构造一个由A,B两个矩阵中对应位置较大的数组成的矩阵:

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

A =

1 2
3 4
5 6

>> B = [3 1; 4 6; 2 9]
B =

3 1
4 6
2 9

>> max(A, B)
ans =

3 2
4 6
5 9

A =

1 2
3 4
5 6

取出矩阵每列最大的元素:

1
2
3
4
>> max(A, [], 1)
ans =

5 6

取出矩阵每行最大的元素:

1
2
3
4
5
6
>> max(A, [], 2)
ans =

2
4
6

想要直接获得矩阵中最大的元素,以下两种方式都可以:

1
2
3
4
5
6
% 方式一:
>> max(max(A))
ans = 6
% 方式二:
>> max(A(:))
ans = 6

矩阵的上下翻转:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>> eye(3)
ans =

Diagonal Matrix

1 0 0
0 1 0
0 0 1

>> flipud(eye(3))
ans =

Permutation Matrix

0 0 1
0 1 0
1 0 0

矩阵的逆:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> A = rand(3, 3)
A =

0.68934 0.12881 0.80507
0.49777 0.41907 0.37271
0.32607 0.27877 0.41814

>> tmp = pinv(A)
tmp =

1.795801 4.294380 -7.285421
-2.180466 0.647802 3.620828
0.053345 -3.780710 5.658801

>> tmp * A
ans =

1.00000 0.00000 0.00000
0.00000 1.00000 0.00000
-0.00000 -0.00000 1.00000

绘制数据

绘制出sin函数图像:

1
2
3
x = [0: 0.01: 0.98];
>> y = sin(2*pi*4*x);
>> plot(x,y);


绘制出cos函数图像

1
y2 = cos(2*pi*4*x);


将两个函数绘制在一起:

1
2
3
>> plot(x,y);
>> hold on;
>> plot(x,y2,'r')

添加说明:

1
2
3
4
5
>> xlabel("time");
>> ylabel("value");
>> lengend("sin", "cos");
error: 'lengend' undefined near line 1 column 1
>> legend("sin", "cos");

存储图像:

1
>> print -dpng "myPlot.png"

关掉绘制的图像:

1
>> close

分别在两个窗口显示两个图像:

1
2
>> figure(1); plot(x, y);
>> figure(2); plot(x, y2);

在同一窗口不同位置显示两个图像:

1
2
>> subplot(1,2,1);plot(x, y);
>> subplot(1,2,2);plot(x, y2);

改变左边图像的横坐标的刻度:

1
2
>> subplot(1,2,1)
>> axis([0 0.5 -1 1])

清除所有绘制的图像:

1
>> clf

将矩阵可视化:

1
>> imagesc(magic(15))

1
>> imagesc(A), colorbar, colormap gray

控制语句

for循环:

1
2
3
4
5
6
7
>> for i=1:10,
> v(i) = i^2;
> end;
>> v
v =

1 4 9 16 25 36 49 64 81 100

while循环:

1
2
3
4
5
6
7
8
9
10
11
>> i = 1;
>> while i <= 10,
> v(i) = sqrt(v(i));
>
Display all 1753 possibilities? (y or n)
> i = i + 1;
> end;
>> v
v =

1 2 3 4 5 6 7 8 9 10

定义一个函数:

1
2
3
4
5
6
>> ls
featuresX.dat myPlot.png squareThisNumber.m
hello.mat octave-workspace
hello.txt priceY.dat
>> squareThisNumber(3)
ans = 9

如果该定义的函数不在当前目录下,我们就不能使用它:

1
2
3
4
5
>> cd ~
>> pwd
ans = /Users/bobo
>> squareThisNumber(3)
error: 'squareThisNumber' undefined near line 1 column 1

不过我们也可以更改Octave的搜索路径:

1
>> addpath("~/Desktop/Machine-Learning")

更改之后,我们现在虽然在/User/bobo目录下,但是仍然可以使用squareThisNumber函数。

1
2
3
4
>> pwd
ans = /Users/bobo
>> squareThisNumber(5)
ans = 25

返回两个值的函数:

1
2
3
>> [y1, y2] = squareAndCube(3)
y1 = 9
y2 = 27

代价函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
>> X = [1 1; 1 2; 1 3]
X =

1 1
1 2
1 3

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

1
2
3

>> theta = [0; 1]
theta =

0
1

>> costFunctionJ(X, y, theta)
ans = 0

如果$\theta=[0; 0]$

1
2
3
4
5
6
7
8
>> theta = [0; 0]
theta =

0
0

>> costFunctionJ(X, y, theta)
ans = 2.3333

向量化

Vectorization