美文网首页
AndrewNG Coursera课程编程作业(一)梯度下降求解

AndrewNG Coursera课程编程作业(一)梯度下降求解

作者: UnderStorm | 来源:发表于2019-01-17 23:19 被阅读32次

    使用课程推荐的Octave进行编程实现,可以将Octave理解为开源版本的MATLAB

    1. 读入数据

      data = load('ex1data1.txt'); % 导入的数据文件为用逗号隔开的两列,第一列为x,第二列为y
      X = data(:, 1);
      y = data(:, 2);
      % 可以尝试绘图
      % figure;plot(x,y);
      m = length(y);
      

      数据分布图如下:

    2. 梯度下降前的数据预处理与设置

      X = [ones(m,1),data(:,1)]; % 添加x0列,都设为1
      theta = zeros(2,1); % 初始化θ值
      
      % 梯度下降的一些设置信息
      iterations = 1500; % 迭代次数
      alpha = 0.01; % 学习率α
      
    3. 计算损失函数

      线性回归的损失函数为:

      % 定义一个函数computeCost来计算损失函数
      function J = computeCost(X, y, theta)
          m = length(y);
          predictions = X*theta; % 计算预测值hθ
          sqerrors = (predictions - y).^2; % 计算平方误,矩阵的点乘运算得到的是一个向量
          J = 1/(2*m)* sum(sqerrors);
      end
      
    4. 执行梯度下降

      % 定义一个函数gradientDescent来执行梯度下降,为了后面观察梯度下降过程中损失函数的变化,记录每一步迭代后的损失函数值
      function [theta, J_history] = gradientDescent(X, y, theta, alpha, iterations)
          m = length(y);
          J_history = zeros(num_iters, 1);
          % 以迭代次数为唯一迭代终止条件
          for iter = 1:num_iters
              % 计算梯度
              predictions = X*theta;
              updates = X'*(predictions - y);
              theta = theta - alpha*(1/m)*updates;
              J_history(iter) = computeCost(X, y, theta);
          end
      end     
      
    5. 绘制拟合直线

      hold on; % 保留之前的绘图窗口,在这个绘图窗口继续画出拟合直线
      plot(X(:,2), X*theta, '-');
      legend('Training data', 'Linear regression');
      

    相关文章

      网友评论

          本文标题:AndrewNG Coursera课程编程作业(一)梯度下降求解

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