美文网首页
逻辑回归Matlab/ Octave实现代码

逻辑回归Matlab/ Octave实现代码

作者: JaiUnChat | 来源:发表于2017-01-12 11:52 被阅读1019次

    本文是基于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 %百分比形式

    相关文章

      网友评论

          本文标题:逻辑回归Matlab/ Octave实现代码

          本文链接:https://www.haomeiwen.com/subject/uiydbttx.html