逻辑回归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 %百分比形式

你可能感兴趣的:(逻辑回归Matlab/ Octave实现代码)