逻辑回归Matlab/ Octave实现代码

本文是基于Prof.Ng 的机器学习课程作业所作的解释,代码和解释都是自己写的,有错误还请谅解,转载请注明原文链接。

0 线性代数运算基础

  • 实数*矩阵 = 实数.*矩阵
  • 为了防止混淆,可以如下记忆 .*就是每个对应每个元素相乘,结果还是一个向量或者矩阵; *是矩阵乘法,在本文中很多先乘再连加的算法都是用的矩阵乘法。
  • 很多时候由公式到代码的实现会一下子恰住该用哪个乘法?这时候可以看结果的维度。

1.代价函数 Cost Function

  function [J, grad] = costFunctionReg(theta, X, y, lambda)

  m = length(y); % 训练集数量
  J = 0;
  grad = zeros(size(theta));

  h = sigmoid(X*theta); %X[m*n] theta[n*1] [m*1]
  c1 = -y'*log(h); 
  c2 = (1-y)'*log(1-h);
  theta(1) = 0; %默认的theta0不参与正规化,因为每次迭代都会重新传入theta参数,所以也不会对后续迭代的theta产生影响
  r = lambda / (2*m) * (theta'*theta); %正规化
  J = (1/m) * (c1-c2) + r; %不加r部分就是不包含正规化的代价函数

  grad =  (1.0/m) .* X' * (h - y) + lambda / m * theta; %包含正规化的偏导计算

2. 梯度下降 Gradient Descent

这里没有手动编写下降算法,而是用自带的fminunc()函数。

  initial_theta = zeros(size(X, 2), 1); %训练集列数就是不包含θ0的参数个数,所以还要+1
  options = optimset('GradObj', 'on', 'MaxIter', 400); %提供偏导值;最高迭代次数400
  % Optimize
  [theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);

3. 准确性校验

校验可以采用如下方法。
把梯度下降得出的theta值与原来的训练集作为参数重新计算,将结果与训练集的结果做对比。

  function p = predict(theta, X)
  prediction = sigmoid(X*theta);%此处theta为最后的梯度下降得出的结果
  p = floor(prediction/0.5);  %>=0.5 输出1,
  end;
  

  p = predict(theta, X) %theta 为之前计算出来的结果s
  accuracy = mean(double(p==y)) * 100 %百分比形式
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载-刘建平Pinard-www.cnblogs.com/pinard/p/5970503.html 在求解机器学...
    商三郎阅读 3,520评论 0 2
  • AI人工智能时代,机器学习,深度学习作为其核心,本文主要介绍机器学习的基础算法,以详细线介绍 线性回归算法 及其 ...
    erixhao阅读 13,988评论 0 36
  • 前言 梯度下降算法现在变的越来越流行,但是对于使用者来说,它的优化过程变的越来越黑盒。本文我们介绍下不通梯度下降算...
    wendaJ阅读 1,588评论 0 1
  • 机器学习是做NLP和计算机视觉这类应用算法的基础,虽然现在深度学习模型大行其道,但是懂一些传统算法的原理和它们之间...
    在河之简阅读 20,598评论 4 65
  • 1.批判性思考 做事之前总结好自己是否适合,要学会自问自答,举一反三, 2.深度思考 分类划线把看懂的地方标出来,...
    再认真点阅读 155评论 0 0