4.机器学习
前四章的内容学习完毕,第五章讲了Octave这个软件的使用,类似于matlab,大学有过学习matlab经验所以这个学起来想对比较轻松,不论是在Ubuntu还是windows安装都很简单,这个的界面布局都和matlab基本一模一样。
虽然用python都可以实现,但Octave开源免费,比numpy更简单的实现算法,所以有必要学习一下。
其实关于Octave的东西并不想记录,和matlab一样,但为了这个博客的完整性还是简单的记录一下,我使用的是windows版的直接打开GUI就能使用了。
基本操作
%基本四则运算
>> 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
简单的运算符就是这些,重点是关于矩阵的
简单矩阵的创建
简单矩阵的创建
>> 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函数
>> 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
导入与导出数据
load 文件名
whos %将当前的变量都显示出来
clear A %将变量A删除
save hello.mat A; %将变量A存入hello.mat文件
save hello.txt A -ascii; %将A存为ascii
取矩阵中的值
>> 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
拼接矩阵
>> 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
>>
矩阵计算
>> 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
>>
矩阵的索引
>> 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) %伪逆矩阵
画图
> t = [0 : 0.01 : 0.98];
>> y1 = sin(2*pi*4*t);
>> plot(t, y1,'r')

在一个画布上画两副如图
>> y1 = sin(2*pi*4*t);
>> y2 = cos(2*pi*4*t);
>> plot(t,y2)
>> hold on;
>> plot(t, y1,'r')

并列显示两个图
>> subplot(1,2,1)
>> plot(t,y1)
>> subplot(1,2,2)
>> plot(t,y2)
>> axis([0.5 1 -1 1])

绘制矩阵
>> 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)

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

控制语句
%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 将文件目录加入当前会话
本章学习结束