Octave Tutorial
Basic operations 基本操作
基本操作
- 基本运算:+、-、*、/、^(指数)
- 逻辑运算:==、~=、&&、||、xor(a, b),0为False、1为True
- 注释:%注释内容
- 等待命令样式可使用
PS1命令
更改:PS1('>>')
变量
赋值:
变量名 = 内容
(数字、字符串、布尔值…)
在赋值语句后加上;
语句执行完后不会输出结果。查看变量:输入变量名或者使用语句
disp(变量名)
。-
format的用法:
format long
:输出字符串的默认的位数。format short
: 输出少量小数点后位数。 格式化输出:用类似C语言风格的格式化字符串来控制打印结果。
disp(sprintf('%.6f', tem))
向量与矩阵
直接创建
A = [1 2; 3 4; 5 6] %三行两列
B = [1 2;
3 4;
5 6] %三行两列
V1 = [1 2 3] %一行三列
V2 = [1; 2; 3] %三行一列
使用增量
V3 = 1:0.1:2 %一个从0开始,增量为0.1,到2为止的行向量
V4 = 1:6 %不写增量,默认为1
使用内置函数
ones(n, m) %生成一个元素全为1的n行m列的矩阵
zeros(n, m) %生成一个元素全为0的n行m列的矩阵
eye(n) %生成一个n阶单位矩阵
rand(n, m) %生成一个元素符合高斯分布的n行m列矩阵
使用直方图演示高斯分布。
W = rand(1, 10000)
hist(W)
hist(W, 50)
查看帮助
使用方法:help 方法名
help eye
help help
退出命令
quit
或exit
Moving data around
如果你有一个机器学习问题,你怎样把数据加载到Octave中?怎样把数据存入一个矩阵?如何对矩阵进行相乘?如何保存计算结果?如何移动这些数据并用数据进行操作?
矩阵大小
size():返回矩阵的行数和列数
A = [1 2; 3 4; 5 6]
sz = size(A) %3 2
size(sz) %1 2
length():返回矩阵最大维度的大小
V = [1 2 3 4]
length(V) %4
length(A) %3
length([1;2;3;4;5]) %5
Octave路径
pwd %查看当前所处路径
cd 'C:\Users\a\Desktop' %更改路径
载入数据
load featuresX.dat
load ('featuresX.dat') %效果同上
load priceY.dat
查看&删除
who %显示出当前Octave存储的变量
whos %更详细的查看Octave存储的变量的内容
clear featuresX %删除变量featuresX
clear all %删除所有变量
储存矩阵
v = priceY(1:10) %截取矩阵
save hello.mat v %按照二进制(或者说是更压缩的二进制)形式存储
save hello.txt v -ascii %存为一个文档
矩阵进阶操作
索引
A = [1 2;3 4; 5 6]
A(3, 2) %返回A_32
A(2,:) %返回第二行所有元素
A(:,2) %返回第二列所有元素
A([1, 3], :) %返回第一、三行所有元素
A(:) %将A中所有元素按照一列输出
修改值/增广
A(:,2) = [10; 11; 12] %更改第二列元素的值
A = [A, [101; 102; 102]] %在原有基础上增加一列
矩阵间操作
A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [A B] %形成A左B右的新矩阵
C = [A, B] %同上
C = [A, B] %形成A上B下的新矩阵
Computing on data 对数据的运算
A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [1 1; 2 2]
V = [1; 2; 3]
矩阵相乘
A * C %矩阵乘法
矩阵中元素的运算
A .* B %A中的每个元素与B中对应元素相乘
A .^ 2 %A中的每个元素的平方
1 ./ A %A中每个元素的倒数
内置函数
log()
exp()
abs()
floor()
ceil()
加法
V + ones(length(V), 1)
V + 1 %功能同上
转置
A'
(A')' %A
求最大值
a = [1 15 2 0.5]
val = max(a) %返回最大值
[val, ind] = max(a) %返回最大值及最大值的位置
max(A) %返回每一列的最大值
D = magic(3)
max(D,[],1) %求D中每一列的最大值
max(D,[],2) %求D中每一行的最大值
比较
a < 3 %返回每个值与3比较的结果
find(a < 3) %返回<3的值的元素下标
[r, c] = find(A >= 4) %返回值>=4的元素的位置
求和求积
sum(a) %a中元素求和
prod(a) %a中元素求积(仅适用于一行或一列的矩阵)
sum(A) %A中每一列元素求和
D = magic(9)
sum(D,1) %D中每一列的和
sum(D,2) %D中每一行的和
%求对角线元素的和
E = eye(9) %构造一个9阶单位矩阵
D .* E %保留对角线元素
sum(ans(:)) %求对角线元素的和
%求副对角线元素的和
P = flipud(E) %9阶反对交矩阵
D .* P %保留副对角线元素
sum(ans(:)) %求副对角线元素的和
矩阵求逆
pinv(A) 对矩阵A求逆
magic()
magic(n)会生成一个所有行和列加起来都等于相同的值的n阶方阵。
rand()
rand(n)会生成一个n阶矩阵,矩阵中的每个元素大小都在0~1之间。
Plotting data 绘制数据
绘制图线
t = [0 : 0.01 : 0.98]
y1 = sin(2 * pi * 4 * t)
plot(t, y1)
y2 = cos(2 * pi * 4 * t) ;
plot(t, y2)
同时绘制两个曲线
plot(t, y1)
hold on
plot(t, y2, 'r')
添加其他信息
xlabel('time')
ylabel('value')
legend('sin','cos') %曲线说明
title('my plot')
保存图像
print -dpng 'myPlot.png'
清除/关闭图像
clf %清除图像内容
close %关闭打开的图像
同时绘制两幅图
figure 1; plot(t, y1)
figure 2; plot(t, y2)
在一个绘画框内绘制两幅图
subplot(1, 2, 1)
plot(t, y1)
subplot(1, 2, 2)
plot(t, y2)
axis([0.5 1 -1 1]) %修改x轴和y轴的范围
矩阵可视化
imagesc(A) %生成的图像中不同颜色代表不同数值
imagesc(A), colorbar, colormap gray; %生成一个灰度分布图
imagesc(magic(15)), colorbar, colormap gray;
Control Statements 控制语句
for
V = zeros(10, 1) %初始化
for i = 1:10
V(i) = 2 ^ i;
end;
disp(V) %V[i]成为了2的i次方
indices = 1:10
for i = indices %i:1->10
disp(i)
end
while
i = 1
while i <= 5
V(i) = 100;
i += 1;
end
break
i = 1;
while true,
V(i) = 999;
i += 1;
if i == 6,
break;
end;
end;
if 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;
函数
-
在对应路径下定义一个
函数名.m
的文件,文件内容是函数功能。如squareThisNumber.m
,文件内容:function y = squareThisNumber(x) y = x^2;
运行函数及结果:
squareThisNumber(5) ans = 25
-
函数可有多个返回值
squareAndCubeThisNumber.m
文件内容:function [y1, y2] = squareAndCubeThisNumber(x) y1 = x^2; y2 = x^3;
运行函数及结果:
[a, b] = squareAndCubeThisNumber(3) a = 9 b = 27
尝试编写代价函数
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);
找组样例试试:
X = [1 1; 1 2; 1 3];
y = [1; 2; 3]
theta = [0; 1];
j = costFunctionJ(X, y, theta)
另一组样例:
X = [1 1; 1 2; 1 3];
y = [1; 2; 3]
theta = [0; 0];
j = costFunctionJ(X, y, theta)
Vectorization 向量化
Vectorization example
\(h_\theta(x) = \sum_{j = 0}^{n}\theta_jx_j\)
Unvectorized implemention
prediction = 0.0
for j = 1 : n+1,
prediction = prediction + theta(j) * x(j)
end;
上式 = \(\theta^Tx\)
Vectorized implementation
prediction = theta' * x
Gradient descent
梯度下降算法公式:
\[ \theta_j := \theta_j - \alpha\frac{1}{m}\sum_{i = 1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \]
n = 3时的情况:
\[
\left\{
\begin{aligned}
\theta_0 := \theta_0 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_0^{(i)} \\
\theta_1 := \theta_1 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_1^{(i)} \\
\theta_2 := \theta_2 - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_2^{(i)}
\end{aligned}
\right.
\tag1
\]
将上式向量化后的结果为:
\[ \theta := \theta - \alpha\delta \tag2 \]
上式中\(\theta、\delta\)都为向量,\(\alpha\)是实数,其中
\[ \delta = \frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})X^{(i)} \tag3 \]
推导一下:
一、将公式(1)进行整体向量化操作:
\[ \begin{pmatrix} \theta _0 \\ \theta_1 \\ \theta_2 \end{pmatrix} := \begin{pmatrix} \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta (x^{(i)}) - y^{(i)})x_0^{(i)} \\ \theta_1 - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta (x^{(i)}) - y^{(i)})x_1^{(i)} \\ \theta_2 - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta (x^{(i)}) - y^{(i)})x_2^{(i)} \end{pmatrix} \]
二、拆分、提取公因式:
\[ \begin{pmatrix} \theta _0 \\ \theta_1 \\ \theta_2 \end{pmatrix} := \begin{pmatrix} \theta _0 \\ \theta_1 \\ \theta_2 \end{pmatrix} - \alpha \frac{1}{m} \begin{pmatrix} \sum_{i=1}^{m} (h_\theta (x^{(i)}) - y^{(i)})x_0^{(i)} \\ \sum_{i=1}^{m} (h_\theta (x^{(i)}) - y^{(i)})x_1^{(i)} \\ \sum_{i=1}^{m} (h_\theta (x^{(i)}) - y^{(i)})x_2^{(i)} \end{pmatrix} \]
三、将后一个矩阵展开:
\[ \theta := \theta - \alpha \frac{1}{m} \begin{pmatrix} (h_\theta (x^{(1)}) - y^{(1)})x_0^{(1)} + (h_\theta (x^{(2)}) - y^{(2)})x_0^{(2)} + \ldots + (h_\theta (x^{(m)}) - y^{(m)})x_0^{(m)} \\ (h_\theta (x^{(1)}) - y^{(1)})x_1^{(1)} + (h_\theta (x^{(2)}) - y^{(2)})x_1^{(2)} + \ldots + (h_\theta (x^{(m)}) - y^{(m)})x_1^{(m)} \\ (h_\theta (x^{(1)}) - y^{(1)})x_2^{(1)} + (h_\theta (x^{(2)}) - y^{(2)})x_2^{(2)} + \ldots + (h_\theta (x^{(m)}) - y^{(m)})x_2^{(m)} \end{pmatrix} \]
四、展开后的矩阵拆分:
\[ \theta := \theta - \alpha \frac{1}{m} \begin{pmatrix} (h_\theta (x^{(1)}) - y^{(1)})x_0^{(1)} \\ (h_\theta (x^{(1)}) - y^{(1)})x_1^{(1)} \\ (h_\theta (x^{(1)}) - y^{(1)})x_2^{(1)} \end{pmatrix} + \begin{pmatrix} (h_\theta (x^{(2)}) - y^{(2)})x_0^{(2)} \\ (h_\theta (x^{(2)}) - y^{(2)})x_1^{(2)} \\ (h_\theta (x^{(2)}) - y^{(2)})x_2^{(2)} \end{pmatrix} + \ldots + \begin{pmatrix} (h_\theta (x^{(m)}) - y^{(m)})x_0^{(m)} \\ (h_\theta (x^{(m)}) - y^{(m)})x_1^{(m)} \\ (h_\theta (x^{(m)}) - y^{(m)})x_2^{(m)} \end{pmatrix} \]
五、提取公因式:
\[ \theta := \theta - \alpha \frac{1}{m} \left[ \left( h_\theta (x^{(1)}) - y^{(1)} \right) \begin{pmatrix} x_0^{(1)} \\ x_1^{(1)} \\ x_2^{(1)} \end{pmatrix} + \left( h_\theta (x^{(2)}) - y^{(2)} \right) \begin{pmatrix} x_0^{(2)} \\ x_1^{(2)} \\ x_2^{(2)} \end{pmatrix} + \ldots + \left( h_\theta (x^{(m)}) - y^{(m)} \right) \begin{pmatrix} x_0^{(m)} \\ x_1^{(m)} \\ x_2^{(m)} \end{pmatrix} \right] \]
六、将\(x\)写为向量形式:
\[ \theta := \theta - \alpha \frac{1}{m} \left[ \left( h_\theta (x^{(1)}) - y^{(1)} \right) X^{(1)} + \left( h_\theta (x^{(2)}) - y^{(2)} \right) X^{(2)} + \ldots + \left( h_\theta (x^{(m)}) - y^{(m)} \right) X^{(m)} \right] \]
七、写成求和形式:
\[
\theta
:=
\theta -
\alpha \frac{1}{m}
\sum_{i=1}^m(h_\theta (x^{(i)}) - y^{(i)})X^i
\]
推导完毕。