机器学习(四)

前四章的内容学习完毕,第五章讲了Octave这个软件的使用,类似于matlab,大学有过学习matlab经验所以这个学起来想对比较轻松,不论是在Ubuntu还是windows安装都很简单,这个的界面布局都和matlab基本一模一样。

虽然用python都可以实现,但Octave开源免费,比numpy更简单的实现算法,所以有必要学习一下。

其实关于Octave的东西并不想记录,和matlab一样,但为了这个博客的完整性还是简单的记录一下,我使用的是windows版的直接打开GUI就能使用了。

基本操作

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%基本四则运算
>> 1+2
ans = 3
>> 6-1
ans = 5
>> 5*8
ans = 40
>> 1/5
ans = 0.20000
>> 3^6
ans = 729

%不等号是~而不是!
>> 1==2
ans = 0
>> 1~=2
ans = 1

%与 或 异或
>> 8 > 1 && 0
ans = 0
>> 9 > 1 || 0
ans = 1
>> xor(1, 0)
ans = 1

%如果你想分配一个变量,但不希望在屏幕上显示结果,你可以在命令后加一个分号,可以抑制打印输出,敲入回车后,不打印任何东西。
>> a = 3
a = 3
>> a = 3;
>> b = 'hello word';
>> b
b = hello word
%设置A等于圆周率π,如果我要打印该值,那么只需键入A像这样就打印出来了。
>> a = pi;
>> pi
ans = 3.1416
>> a
a = 3.1416
>> disp(sprintf('2 decimals: %0.12f', a))
2 decimals: 3.141592653590
这是一种,旧风格的C语言语法,对于之前就学过C语言的同学来说,你可以使用这种基本的语法来将结果打印到屏幕。

例如 sprintf命令的六个小数:0.6%f ,a,这应该打印π的6位小数形式。

也有一些控制输出长短格式的快捷命令:
>> format long
>> a
a = 3.14159265358979
>> format short
>> a
a = 3.1416

简单的运算符就是这些,重点是关于矩阵的

简单矩阵的创建

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
简单矩阵的创建
>> A = [1 2; 3 4; 5 6]
A =

1 2
3 4
5 6

>> A = [2 2;
3 3;
4 4]
A =

2 2
3 3
4 4

>> B = [1 2 3]
B =

1 2 3

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

1
2
3

>>
这个集合V是一组值,从数值1开始,增量或说是步长为0.1,直到增加到2,按照这样的方法对向量V操作,可以得到一个行向量,这是一个1行11列的矩阵,其矩阵的元素是1 1.1 1.2 1.3,依此类推,直到数值2。

我也可以建立一个集合V并用命令“1:6”进行赋值,这样V就被赋值了1至6的六个整数。
>> v = 1:6
v =

1 2 3 4 5 6

这里还有一些其他的方法来生成矩阵
例如“ones(2,3)”,也可以用来生成矩阵:
>> ones(2,3)
ans =

1 1 1
1 1 1

元素都为2,两行三列的矩阵,就可以使用这个命令:
>> C = 2*ones(2,3)
C =

2 2 2
2 2 2

你可以把这个方法当成一个生成矩阵的快速方法。
w为一个一行三列的零矩阵,一行三列的A矩阵里的元素全部是零:
>> W = zeros(1,3)
W =

0 0 0

如果我对W进行赋值,用Rand命令建立一个一行三列的矩阵,因为使用了Rand命令,则其一行三列的元素均为随机值,如“rand(3, 3)”命令,这就生成了一个3×3的矩阵,并且其所有元素均为随机。
>> rand(3,3)
ans =

0.60790 0.22000 0.10036
0.61343 0.58981 0.17660
0.22697 0.88276 0.42049

>>
你知道什么是高斯随机变量,或者,你知道什么是正态分布的随机变量,你可以设置集合W,使其等于一个一行三列的
N矩阵,并且,来自三个值,一个平均值为0的高斯分布,方差或者等于1的标准偏差。
>> w = randn(1,3)
w =

-1.24688 1.87417 -0.70878

并用hist命令绘制直方图。
>> w = -9 + sqrt(10)*(randn(1, 10000));
>> hist(w)
>> hist(w,50)

绘制单位矩阵:
>> I = eye(6)
I =

Diagonal Matrix

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

对命令不清楚可以通过help命令查询

size函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>> A = [1: 2; 3 4; 5 6]
A =

1 2
3 4
5 6

>> size(A) %输出[行数 列数]
ans =

3 2

>> size(A, 1) %行数
ans = 3
>> size(A, 2) %列数
ans = 2
>> length(A) %行数和列数中最大值
ans = 3

导入与导出数据

1
2
3
4
5
6
load 文件名
whos %将当前的变量都显示出来
clear A %将变量A删除

save hello.mat A; %将变量A存入hello.mat文件
save hello.txt A -ascii; %将A存为ascii

取矩阵中的值

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
>> A
A =

1 2
3 4
5 6

>> A(3,2) %矩阵A第三行第二列的数
ans = 6

>> A(2,:) %第二行的数
ans =

3 4

>> A(:,2) %第二列的数
ans =

2
4
6

>> A([1 3],:) %第一行和第三行的数
ans =

1 2
5 6

>> A(:,2) = [10;11;12] %修改第二列的数
A =

1 10
3 11
5 12

>> A = [A,[100;200;300]] %增加一列数据
A =

1 10 100
3 11 200
5 12 300

>> A(:) %修改为一列向量
ans =

1
3
5
10
11
12
100
200
300

拼接矩阵

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
>> 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 = [A B] %将矩阵A和B并列拼接
C =

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

>> C = [A;B] %加分号是将B矩阵拼接到A下面
C =

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

矩阵计算

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
>> a = [1 2; 3 4; 5 6]
a =

1 2
3 4
5 6

>> B = [11 22; 33 44; 55 66]
B =

11 22
33 44
55 66

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

1 1
2 2

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

1
2
3

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

5 5
11 11
17 17

>> A*B %相乘条件必须是A矩阵的列等于B矩阵的行,否则报错
error: operator *: nonconformant arguments (op1 is 3x2, op2 is 3x2)

>> A.*2 %矩阵中的每个元素都乘二
ans =

2 4
6 8
10 12

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

1 4
9 16
25 36


>> 1./V %每个元素的倒数
ans =

1.00000
0.50000
0.33333

>> V + ones(length(V), 1) %每个元素都加一
ans =

2
3
4

>> A' %A的转置
ans =

1 3 5
2 4 6

>>

矩阵的索引

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
>> a = [1 15 2 0.5]
a =

1.00000 15.00000 2.00000 0.50000

>> [val,ind] = max(a) % val 矩阵中的最大元素,ind 最大值的index
val = 15
ind = 2
>> val = max(A) %矩阵每列的最大值
val =

5 6

>> a < 3 %检查矩阵中比3小的元素,返回布尔型
ans =

1 0 1 1

>> find(a<3) %比3小的元素的位置
ans =

1 3 4

>> A = magic(3) %创建一个幻方 (行,列,对角线相加想等)
A =

8 1 6
3 5 7
4 9 2

>> [r c] = find(A>=7) % 符合A>=7元素的行列坐标
r =

1
3
2

c =

1
2
3


>> sum(a) %求所有元素的和
ans = 18.500
>> prod(A) %求每列的乘积
ans =

96 45 84

>> sum(A) %求每列的和
ans =

15 15 15

>> floor(a) %返回小于元素的最小整数
ans =

1 15 2 0

>> ceil(a) %返回大于元素的最大整数
ans =

1 15 2 1

>> max(rand(3), rand(3)) %比较两个矩阵返回最大值
ans =

0.65329 0.32803 0.23948
0.56627 0.37716 0.64170
0.17771 0.81867 0.73937

>> max(A, [], 1) %返回每一列的最大值
ans =

8 9 7

>> max(A, [], 2) %返回每一行的最大值
ans =

8
7
9

>> 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,2) %行的和
ans =

369
369
369
369
369
369
369
369
369

>> sum(A,1) %列的和
ans =

369 369 369 369 369 369 369 369 369

>> sum(sum(A.* eye(9))) %对角线的和
ans = 369
>> pinv(A) %伪逆矩阵

画图

1
2
3
> t = [0 : 0.01 : 0.98];
>> y1 = sin(2*pi*4*t);
>> plot(t, y1,'r')


在一个画布上画两副如图

1
2
3
4
5
>> y1 = sin(2*pi*4*t);
>> y2 = cos(2*pi*4*t);
>> plot(t,y2)
>> hold on;
>> plot(t, y1,'r')


并列显示两个图

1
2
3
4
5
>> subplot(1,2,1)
>> plot(t,y1)
>> subplot(1,2,2)
>> plot(t,y2)
>> axis([0.5 1 -1 1])


绘制矩阵

1
2
3
4
5
6
7
8
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)


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

控制语句

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
%for循环语句
>> v = zeros(1,10)
v =

0 0 0 0 0 0 0 0 0 0

>> for i = 1: 10
v(i) = 2^i;
end;
>> v
v =

2 4 8 16 32 64 128 256 512 1024

>>

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

2 4 8 16 32 64 128 256 512 1024

%if break语句
>> i = 1;
>> while true;
v(i) = 999;
i = i+1
if i==6,
break;
end
end
i = 2
i = 3
i = 4
i = 5
i = 6
>> v
v =

999 999 999 999 999 64 128 256 512 1024

>>

>> 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
The value is not one or two!
>>

定义函数

将函数定义写在文件中,并把文件名命名为‘函数名.m’,将文件放在当前路径下,或者用 addpath 将文件目录加入当前会话

本章学习结束

0%