UFLDL新版教程与编程练习(三):Vectorization(
2019-08-06 本文已影响2人
赖子啊
UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!
第三节是:Vectorization(向量化)
这节的思想就是,运用向量化编程思维,让代码运行更加高效,而不是用for循环,所以通过这次之后,我看到这种符号,脑子里第一下就想,能不能用向量化编程。
要用向量化编程,最好自己能写一两项求和的内容,之后再用类似内积的矩阵乘法来表述,教程写的不是太明白,自己能用矩阵乘法表示出来即可,注意矩阵维数对应就好!!
当然还是学到了一个之后会经常用到的函数:bsxfun函数,用来作element-wise操作,即向量元素之间的对应操作,具体可看matlab官方文档介绍!
下面是我用向量化编写之前的线性回归和逻辑回归的代码(运行的时候去注释相应的非向量化调用语句):
我这里用的是:matlab2016a
linear_regression_vec.m:
function [f,g] = linear_regression_vec(theta, X,y)
%
% Arguments:
% theta - A vector containing the parameter values to optimize.
% X - The examples stored in a matrix.
% X(i,j) is the i'th coordinate of the j'th example.
% y - The target value for each example. y(j) is the target for example j.
%
m=size(X,2);
% initialize objective value and gradient.
% f = 0;
% g = zeros(size(theta));
%
% TODO: Compute the linear regression objective function and gradient
% using vectorized code. (It will be just a few lines of code!)
% Store the objective function value in 'f', and the gradient in 'g'.
%
%%% YOUR CODE HERE %%%
f = 0.5 .* (theta' * X - y) * (theta' * X - y)';
% g = g';
g = (theta' * X - y) * X';
g = g';
运行结果:
线性回归(向量化)图
可以看到和之前的0.78秒,现在有了较快的提升!
linear_regression_vec.m:
function [f,g] = logistic_regression_vec(theta, X,y)
%
% Arguments:
% theta - A column vector containing the parameter values to optimize.
% X - The examples stored in a matrix.
% X(i,j) is the i'th coordinate of the j'th example.
% y - The label for each example. y(j) is the j'th example's label.
%
m=size(X,2);
% initialize objective value and gradient.
f = 0;
g = zeros(size(theta));
%
% TODO: Compute the logistic regression objective function and gradient
% using vectorized code. (It will be just a few lines of code!)
% Store the objective function value in 'f', and the gradient in 'g'.
%
%%% YOUR CODE HERE %%%
h = inline('1./(1+exp(-z))');
% Calculate f
f = f - (y*log(h(X'*theta)) + (1-y)*log(1-h(X'*theta)));
% Calculate g
g = X * (h(theta' * X) - y)';
运行结果:
逻辑回归(向量化).png
可以看到和之前的6.84秒,现在速度提升了23倍!
有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!