zoukankan      html  css  js  c++  java
  • 线性回归——梯度下降法_实例

    上篇文章介绍了梯度下降法在线性回归中的相关理论与证明,这里使用程序实例代码方式看梯度下降法是怎样一步一步下降求出最优解的;

    X = [1 4;2 5;5 1;4 2];
    y = [19;26;19;20]; 
    
    m = length(y);
    alpha = 0.002;   %步长
    num_iters = 200;
    
    % Init Theta
    theta = zeros(2, 1);
    
    % 数据集大小
    m = length(y);  
    % 损失函数记录
    J_history = zeros(num_iters, 1);
    
    for iter = 1:num_iters   
    
       h= zeros(m,1);
       h = X*theta;     
    
       J_history(iter) = (1/(2*m))*sum((h-y).^2);    %计算每次迭代的损失
    
       tmp1 = zeros(size(X,2),1); 
       for i=1:m
          tmp1= tmp1+(h(i)-y(i)).*X(i,:)';        %等同于公式中累加中的计算结果
       end; 
       theta = theta - (alpha/m)*tmp1;            %每次迭代计算theta的值
       %disp(J_history(iter));
       %disp(theta);
    end;
    
    % 绘制图形
    figure;
    plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);       %绘制迭代次数于损失值关系图
    xlabel('Number of iterations');
    ylabel('Cost J');
    
    numel(J_history);
    
    fprintf('Theta computed from gradient descent: 
    ');
    fprintf(' %f 
    ', theta);
    fprintf('
    ');
    
    
    expect = 0;  
    X_p=[4 2];     %预测
    
    expect = theta'*X_p';   %预测结果
    
    Expect
    

      X坐标为迭代次数,Y坐标为损失函数的值,从图中可以看到损失函数下降得很块几乎时线性的,在迭代大约60次的时候损失值已经接近0;这里说的是批量梯度下降法所以数据集有多大也就迭代了多少次;如果数据比较大还是会影响性能,下次有机会再讲讲随机梯度下降法;

    文章首发地址:Solinx
    http://www.solinx.co/archives/796

  • 相关阅读:
    【原创】谈一个数学教育专业的IT职业生涯
    应用程序测试方法与技巧
    Windows和MacOS的比较——不断完善和补充,欢迎吐槽
    【原创】Windows上应用程序报错常用分析方法总结
    职场感悟,发现言语背后的故事
    职场感悟,乐业感恩
    javadoc
    包机制的创建
    运算符
    变量和常量
  • 原文地址:https://www.cnblogs.com/softlin/p/6115788.html
Copyright © 2011-2022 走看看