第五章 Octave教程(二)
5.4 绘图数据
参考视频 : 5 - 4 - Plotting Data (10 min).mkv
Octave可以绘制图表来可视化数据。例1
PS1('>> ');
t=[0:0.01:0.98];
y1=sin(2*pi*4*t);
plot(t,y1); // 绘制正弦函数
y2=cos(2*pi*4*t);
plot(t,y2); // 绘制余弦图,在此之前消除原来的正弦图
hold on; // 将图像绘制在旧的上
plot(t,y1);
plot(t,y1,'r'); // 绘制正弦图,颜色为红色
xlabel('time'); // 标识横坐标
ylabel('value'); // 标识纵坐标
legend('sin','cos'); // 标识曲线
title('myplot'); // 显示图的名字
print -dpng 'myplot.png' // 保存图像,png格式
help plot; // 查看plot帮助
close; // 关闭图像
figure(1); // 新的图像
plot(t,y1);
figure(2); // 又一个新的图像
plot(t,y2);
close;
close;
figure(1);
subplot(1,2,1); // 将图像分成1*2的格子,使用第1个格子
plot(t,y1); // y1显示在左边
subplot(1,2,2); // 使用第2个格子
plot(t,y2); // y2显示在右边
axis([0.5 1 -1 1]); // 此时作用在右图上,修改了右图的横纵坐标
clf; // 清除一幅图像
例2
A=magic(5);
imagesc(A);
colorbar; // 添加颜色条 颜色条表示不同深浅的颜色所对应的值
colormap gray; // 变成灰度图像
// 上数三个命令可以用一行命令来代替:imagesc(A),colorbar,colormap gray(命令依次执行)
imagesc(magic(15)),colorbar,colormap gray // 生成15*15的灰度图像
5.5 控制语句:for,while,if语句
参考视频 : 5 - 5 - Control Statements_ for, while, if statements (13 min).mkv
用Octave程序写控制语句,如:for、while、if等,并且如何定义和使用方程。
1.基础
PS1('>> ');
v=zeros(10,1);
v
// for 1
for i=1:10,
v(i)=2^i;
end;
v
// for 2
indices=1:10;
indices
for i=indices,
disp(i);
end;
// while 1
i=1;
while i <= 5,
v(i)=100;
i=i+1;
end;
v
// while 2 and break
i=1;
while true,
v(i) = 999;
i = i+1;
if i ==6,
break;
end;
end;
v
// if-else
v(1)
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;
2.函数
// 函数定义例1-返回一个值
function y = squareThisNumber(x)
y = x^2;
end
y = squareThisNumber(5); // 函数调用
// 函数定义例2-返回两个值
function y1,y2 = squareAndCubeThisNumber(x)
y1 = x^2;
y2 = x^3;
end
[a,b] = squareAndCubeThisNumber(5);
复杂一点
function J = computeCost(X, y, theta)
% Compute cost for linear regression
% X is the "design matrix" containing our training example.
% 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; % square errors
J = 1/(2*m) * sum(sqeErrors);
end
5.6 向量化
参考视频 : 5 - 6 - Vectorization (14 min).mkv
本节介绍有关向量化的内容。无论你是用Octave还是别的语言(Python、Java或C++),这些语言中都有各种线性代数库。库文件内置,容易获取。当你实现机器学习算法时,你应该好好利用这些线性代数库,调用他们,这样会很有效。
1.举个例子,这是常见的线性回归假设函数:
如果你想要计算 hθ(x) h θ ( x ) ,注意右边是求和,那么你可以从 j=0 j = 0 计算到 j=n j = n ,并求和。但是换一种方式想,把 hθ(x) h θ ( x ) 看作 θTx θ T x ,那么就可以写成两个向量的内积。
2.Matlab代码举例:
这是未向量化的代码实现方式。
// Unvectorized implementation
prediction = 0.0;
for j = 1:n+1, // Matlab中下标从1开始
prediction = prediction + theta(j) * x(j);
end;
这是向量化的代码实现。
// Vectorized implementation
prediction = theta' * x; // 向量相乘
3.C++代码举例
// Unvectorized implementation
double prediction = 0.0;
for (int j = 0; j <= n; j++)
{
prediction += theta[j] * x[j];
}
// Vectorized implementation
double prediction = theta.transpose() * x;
将两个向量相乘,如果使用一个库来做内积,你可以得到一段更简单、更有效的代码。
4.更复杂的例子
我们用这条规则对j=0, 1, 2, … ,n更新对象 θj θ j 。假设我们有两个特征量(n=2),我们需要对 θ0,θ1,θ2 θ 0 , θ 1 , θ 2 进行更新,这些都应该是同步更新。简单来说,我们可以用一个for循环,让j=0,j=1,j=2来更新 θj θ j 。
看一下向量化的方式:将 θ θ 看做一个向量,然后用 θ−α∗δ θ − α ∗ δ 来更新 θ θ ,其中 α α 是学习率, δ=1m∑mi=1(hθ(x(i))−y(i))x(i) δ = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x ( i ) 。
So the vectorized implementation is:
有时我们使用几十或几百个特征量来计算线性回归,当你使用向量化实现时,运行速度就会比你以前用for循环快得多。
因此使用向量化实现方式,你能够得到一个高效得多的线性回归算法。能够把学到的算法向量化是一个很好的技巧,无论是对于Octave,还是其他的语言(C++、Java等),向量化可以让你的代码运行的更高效。
5.7 工作和提交的编程练习
参考视频:5 - 7 - Working on and Submitting Programming Exercises (4 min).mkv
介绍一下这门课程提交作业的流程,以及如何是哟个作业提交系统,这个提交系统可以即时检验你的程序是否正确。
目录中包含大量的文件,其中一些需要由你来编辑完成。
回到Octave窗口,保证当前目录为作业目录,输入submit(),输入【登陆邮箱】,输入【Token】后按下回车,等待一段时间后就会返回作业结果,其中包含作业的分数,如果有错误的话可以修改后再提交。
【Token】在编程作业网页右边(红框标记)
这就是提交作业的方法!