5.Octave使用
Octave
1. 基本操作
1. 数学运算,逻辑运算
2. 注释
% 这是注释
3. 分号
一个语句的后面加上分号,则不会再次打印该语句(或赋予的值)
4. 输出
-
disp(a)
-
disp(sprintf('2 decimals: %0.2f ', a))
5. 矩阵
分号分隔:
A = [1 2; 3 4; 5 6]
A = [1 2;
3 4;
5 6]
v = [1 2 3]
v = [1; 2; 3]
步长:
v = 1:0.1:2 % 以1开始,步长为0.1, 2结束的一组数
v = 1:10 % 以1开始,步长为1, 2结束的一组数
函数:
ones(2,3) % 2×3 全是1的矩阵
C = 2 * ones(2, 3) % 2×3 全是2的矩阵
w = zeros(1, 3) % 1×3 全是0的矩阵
w = rand(1, 3) % 1×3 由0~1的随机值组成的矩阵
w = randn(1, 3) % 1×3 服从高斯分布的值组成的矩阵
w = -6 + sqrt(10)*(randn(1, 100000))
hist(w)``% 绘制直方图
hist(w, 50)
单位矩阵:
eye(6)
帮助函数:
help 函数名
按 q
退出
2. 移动数据
如果有一些机器学习问题的数据,如何把这些数据加载到Octave中, 如何把数据存入矩阵, 如何对矩阵进行操作,如何保存计算结果?
>> A = [1 2; 3 4; 5 6]
A =
1 2
3 4
5 6
>> size(A) % 返回矩阵A的大小, 其实size函数返回的是一个 1×2 矩阵
ans =
3 2
>> sz = size(A);
>> sz
sz =
3 2
>> size(sz)
ans =
1 2
ݣ>> size(A, 1) % 返回A矩阵的第一维度大小,即A矩阵的行数
ans = 3
>> v = [1, 2, 3, 4]; % this is a vector
>> length(v) % 返回v最大维度的大小
ans = 4
>>
1. 文件系统中加载和查找数据
% load 文件名
% load ('文件名')
% 将数据载入Octave中
load ex1data1.txt
% who 查看当前Octave中的变量
% who 查看当前Octave中的变量, 能够显示变量的信息
% 删除变量
clear(ex1data1)
clear % 删除工作空间中的所有变量
% 存储数据
v = ex1data1(1:10) % 将矩阵ex1data1第一列的前10个元素存入v中
% 将数据存储到硬盘中
save hello.mat v; % 存储为二进制的形式
save hello.txt -ascii % 存储为文本文档
2. 操作数据
A = [1 2; 3 4; 5 6;]
% 索引
A(3, 2) % 对应第三行第二列的元素
A(2, :) % 对应第二行的所有元素,冒号表示行或列的所有元素
A([1 3], :) % 对应第一行和第三行的所有元素
A(:, 2) = [10; 11; 12] % 对A的第二列重新赋值
A = [A,[100; 101; 102]] % 在A的右边重新加上一列
A(:) % 把A的所有元素放入一个单独的列向量
3. 计算数据
>> A=[1 2;3 4;5 6];
>> B=[11 12; 13 14; 15 16];
>> C = [1 1; 2 2];
>> A * C % 两个矩阵相乘
ans =
5 5
11 11
17 17
>> A .* B % 两个矩阵对应元素相乘, . 告诉我们这是针对元素的运算
ans =
11 24
39 56
75 96
>> A .^ 2 % A 中的每个元素乘方
ans =
1 4
9 16
25 36
>> v = [1; 2; 3];
>> 1 ./ v % v中的每个元素取倒数
ans =
1.0000
0.5000
0.3333
>> log(v) % v中的每个元素进行对数运算
ans =
0
0.6931
1.0986
>> exp(v) % 以e为底,以v中元素为指数进行幂运算
ans =
2.7183
7.3891
20.0855
>> abs(v) % v中所有元素的绝对值
ans =
1
2
3
>> -v % 相当于 -1 * v
% 将v中的每个元素加1
% 方法一:构造一个3×1的每个元素都是1的矩阵y, 将v与y相加
>> v + ones(length(v),1)
ans =
2
3
4
% 方法二: 直接 v+1
>> v = [1;2;3];
>> v +1
ans =
2
3
4
>> A' % 矩阵转置
ans =
1 3 5
2 4 6
>>
常用函数
a = [12 13 14 15]
% max
val = max(a); % 获取a中的最大元素, 刺死a必须是向量
[val, ind] = max(a); % 获取a中的最大元素, 赋值给val, 并将最大元素的索引赋值给ind
% 比较和find
val = a < 3; % 将a中的每个元素与3比较,根据比较结果返回真假
ind = find(a<3); % 找到a中所有满足小于3的元素,并返回他们的索引
% magic 返回名为幻方的矩阵
% 幻方的数学性质:它任意行、列、对角线上的元素加起来等于相同的值
A = magic(3) % 生成3×3的幻方矩阵
[r,c] = find(A>=7) % 找到A中所有满足大于等于7的元素,并返回他们的索引,其中r存储这些元素的行索引, % c存储这些元素的列索引
% 求和函数
sum(a) % 返回a中所有元素的和
prod(a) % 返回a中所有元素的乘积
floor(a) % 向下取整
ceil(a) % 向上取整
% rand
rand(3) % 返回一个3×3的随机矩阵
max(A, [], 1) % 返回A中每一列的最大值, 1表示从A的第一维度取值
max(A, [], 2) % 返回A中每一行的最大值, 2表示从A的第二维度取值
max(A) % max默认求每列的最大值
% 求矩阵A的最大值
max(max(A))
max(A(:))
A = magic(9)
sum(A,1) % 得到每一列的总和
sum(A,2) % 得到每一行的总和
% 获取对角线的和
eye(9) % 构造单位矩阵
A .* eye(9) % 将A中的元素与9×9单位矩阵的元素对应相乘
sum(sum(A .* eye(9))) % 获得A对角线元素的和
% 获取反对角线的和
flipud(eye(9)) % flipud 表示将矩阵垂直翻转
sum(sum(A .* flipud(eye(9)) )) % 获得A反对角线元素的和
A = magic(3)
pinv(A) % 求A的逆矩阵
4. 数据绘制
plot(t, y1); # t 横轴,y1纵轴
hold on; # 在旧的图像上绘制新的图像
plot(t, y2, 'r'); # r代表颜色
xlabel('time') # 横轴标签
ylabel('value') # 纵轴标签
legend('sin', 'cos'); # 标记绘制的图像
title('为图像命名')
cd 'C:\Users\Yang\Desktop':print -dpng 'MyPlot.png' # 将绘制的图像保存
close # 关闭图片
figure(1);plot(t, y1) # 绘制第一个图像
subplot(1,2,1) # 将图像分成 1*2 的格子(前两个参数的含义), 使用第一个格子(第三个参数的含义)
plot(t, y1);
# 改变坐标轴的刻度
axis([0.5 1 -1 1]) # 前两个参数改变横坐标的范围, 后两个参数改变纵坐标的范围
clf # 清除图像
# 可视化矩阵
A = magic(5) # A为5*5矩阵
imagesc(A) # 将矩阵绘制成 5*5的彩色方格图,不同的颜色对应A矩阵中的不同值
imagesc(A), colorbar, colormap grey; # 灰度分布的矩阵图像
5. for while if
v = zeros(10,1)
for i=1:10,
v(i) = 2^i;
end;
indices = 1:10;
for i = indices,
disp(i);
end;
# break continue
# while
i = 1;
while i<=5,
v(i) = 100*i;
i=i+1;
end;
i = 1;
while true,
v(i) = 999;
i = i+1;
if i==6:
break;
end;
end;
# if else
v(1) = 2;
if v(1) == 1,
disp('It is 1');
elseif v(1) == 2,
disp('It is 2');
else
disp('It is not 1 or 2');
end;
6. 定义和调用函数
创建一个文件,并在文件中定义函数,并且将文件命名为 函数名.m
, 如area.m
再在Octave中调用定义的函数 area
需要注意的是,需要先把工作路径切换到定义函数的文件所在的路径下,然后再调用定义的函数
area.m
function y = area(x);
y = x^2;
Octave调用:
cd C:\Users\Yang\Desktop
a = area(2);
a
Octave一个函数可以返回多个值
area2.m
function [y1,y2] = area(x);
y1 = x^2;
y2 = x^3;
Octave调用:
cd C:\Users\Yang\Desktop
[a,b] = area2(2);
a
b
更复杂的函数:
定义一个Octave函数计算代价函数\(J(\theta)\) 不同 \(\theta\) 值所对应的代价函数 \(J\)
costFunctionJ.m
function J = costFunctionJ(X,y,theta)
% X is the "design matrix"containing our training examples.
% y is the class labels
m size(X, 1); % number of training examples
predictions = X*theta; % predictions of hypothesis on all m examples
sqrErrors =(predictions-y)^2; %squared errors
J = 1/(2*m)*sum(sqrErrors);
Octave 调用
X = [1 1; 1 2; 1 3];
y = [1; 2; 3];
theta = [0; 1];
J = costFunctionJ(X, y, theta);
7. 向量化实现
梯度下降:
\[\frac{1}{m}\sum_{i=0}^n(h_\theta(x^{(i)})-y^{(i)})x^{(i)}
\]