人工智能/模式识别/机器学习精华专题

UFLDL新版教程与编程练习(三):Vectorization(

2019-08-06  本文已影响2人  赖子啊

UFLDL是吴恩达团队编写的较早的一门深度学习入门,里面理论加上练习的节奏非常好,每次都想快点看完理论去动手编写练习,因为他帮你打好了整个代码框架,也有详细的注释,所以我们只要实现一点核心的代码编写工作就行了,上手快!

有人对这一篇也有翻译,可以看一下

第三节是:Vectorization(向量化)

这节的思想就是,运用向量化编程思维,让代码运行更加高效,而不是用for循环,所以通过这次之后,我看到\sum这种符号,脑子里第一下就想,能不能用向量化编程。

要用向量化编程,最好自己能写一两项求和的内容,之后再用类似内积的矩阵乘法来表述,教程写的不是太明白,自己能用矩阵乘法表示出来即可,注意矩阵维数对应就好!!

当然还是学到了一个之后会经常用到的函数: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倍!

有理解不到位之处,还请指出,有更好的想法,可以在下方评论交流!

上一篇下一篇

猜你喜欢

热点阅读