【机器学习笔记3】Stanford公开课Exercise 2——Linear Regression

Stanford公开课Exercise 2原题地址:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex2/ex2.html。看Stanford的机器学习公开课真是舒服,视频讲解的非常清楚,练习也布置的非常好,把所有重要内容总结了一遍,给出了很多参考信息,让读者非常清晰的知道怎么去做。下面是我完成的笔记。



(一)原理回顾


简单重复一下实现的过程,具体的看上一篇(【机器学习笔记】Linear Regression总结):

1. h(θ)函数

                                                                         (公式1)

2. J(θ)函数

                                                                   (公式2)

向量化后简化为:

                                                                                    (公式3)

3. θ迭代过程

                                                            (公式4)

向量化后简化为:

                                                              (公式5)



(二)实现代码


原题中给出了详细的步骤和提示,下面的代码是根据原题中的提示实现的,代码中加有注释,这里不再对代码进行解释。

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. %=============================================  
  2. % Exercise 2: Linear Regression  
  3. % author : liubing (liubing80386@gmail.com)  
  4. %  
  5.   
  6. %LB_c: 加载数据 ===============  
  7. x = load("ex2x.dat");  
  8. y = load("ex2y.dat");  
  9. %LB_c: 矩阵x第一列加上全1  
  10. x = [ones(size(x)(1),1), x];  
  11. %==============================  
  12.   
  13. %LB_c: 常量数据准备===========================================  
  14. iter_total = 1500;  %theta更新的迭代次数  
  15. %m为样本数,n为特征数(包含第一列的常数项,实际特征数为n-1)  
  16. [m,n] = size(x);      
  17. alpha = 0.07;     
  18. %=============================================================  
  19.   
  20. %LB_c: 迭代过程 ================================================================  
  21. theta = zeros(n,1); %theta初始化为全0,其他值也可以  
  22. J = zeros(iter_total,1);    %存储每一步迭代的J(theta)值  
  23.   
  24. for iter_index = [1:iter_total]       
  25.     J(iter_index) = (x*theta-y)' * (x*theta-y) / (2*m); %求当前的J(theta),参考上面的(公式3)  
  26.     err = x * theta - y;  
  27.     grad = ( x' * err ) / m;    %求gradient  
  28.     theta = theta - alpha * grad;   %梯度下降法更新theta,参考上面的(公式5)          
  29. end   
  30. %===============================================================================  
  31.   
  32. %LB_c: 结果绘制 =============================================  
  33. %绘制J(theta)迭代过程  
  34. figure;  
  35. plot([1:iter_total], J');  
  36. xlabel('iteration (times)');  
  37. ylabel('J(theta)');  
  38. axis([1,1550, 0, 0.6]);  
  39.   
  40. %绘制训练数据  
  41. figure;  
  42. plot(x(:,2), y, 'o', 'Markersize', 3);  
  43. xlabel('Age (years)');  
  44. ylabel('Height (meters)');  
  45. %绘制回归结果  
  46. hold on;  
  47. plot(x(:,2), x*theta, 'r-');  
  48. legend('Training data', 'Regression result');  
  49.   
  50. %绘制J(theta)曲面  
  51. theta0_vals = linspace(-3,3,100);  
  52. theta1_vals = linspace(-1,1,100);  
  53. J_arr = zeros(length(theta0_vals), length(theta1_vals));  
  54. for i = [1:length(theta0_vals)]  
  55.     for j = [1:length(theta1_vals)]  
  56.         t = [theta0_vals(i); theta1_vals(j)];  
  57.         J_arr(i,j) = (x*t-y)' * (x*t-y) / (2*m);    %求J(theta),参考上面的(公式3)  
  58.     end  
  59. end  
  60. J_arr = J_arr';  
  61. figure;  
  62. surf(theta0_vals, theta1_vals, J_arr);  
  63. xlabel('theta0');  
  64. ylabel('theta1');  
  65. zlabel('J(theta)');  
  66.           
  67. %绘制J(theta)等高线图  
  68. figure;  
  69. contour(theta0_vals, theta1_vals, J_arr, logspace(-2,2,15));  
  70. xlabel('theta0');  
  71. ylabel('theta1');  
  72. %============================================================  
  73.   
  74. %LB_c: theta结果输出与测试 =================  
  75. printf('result of theta : ');  
  76. theta  
  77. printf('result of testing data(age=3.5):');  
  78. [1,3.5]*theta  
  79. printf('result of testing data(age=7):');  
  80. [1,7]*theta  
  81. %===========================================  


(三)执行结果


1. 训练样本及回归结果(直线)



2. J(θ)函数迭代变化趋势


3. J(θ)函数相对于theta0和theta1的变化趋势(曲面图)



4. J(θ)函数相对于theta0和theta1的变化趋势(等高线图)


5. 最终的回归系数(theta)结果及使用该回归系数对测试数据(age=3.5和age=7)进行预测的结果




最终显示的结果与原题中给出的结果基本一致。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值