山东大学计算机学院机器学习实验一

山东大学计算机学院机器学习实验一

From lyz103
实验目的: 学习线性回归:学习到了线性回归的实践经验。线性回归模型为 (hθ(x)=θ^T x),其中 (θ)是我们需要优化的参数,x是(n + 1)维特征向量。给定一个训练集,我们的目标是找到(θ)的最优值,使得目标函数 J(θ)最小化。
④ 学习多变量线性回归:现在我们看一个更复杂的情况,其中每个训练数据包含多个特征。这是俄勒冈州波特兰的房价的训练集,其中输出y是价格,输入x是生活区域和卧室数量。
② 练习2D线性回归:我们从一个非常简单的情况开始,其中 n = 1。这部分的数据包含了不同年龄段(2到8岁)的男孩的身高测量值。y值是以米为单位的身高,x值是与身高对应的男孩的年龄。每个身高和年龄的元组构成我们数据集中的一个训练样本。使用这50个训练样本,使用梯度下降算法开发一个线性回归模型,基于此模型,我们可以预测给定新的年龄值的身高。
③ 理解 J(θ):我们希望更好地理解梯度下降已经做了什么,并可视化参数 (θ) 和 J(θ)之间的关系。在这个问题中,我们将J(θ) 绘制为一个3D曲面图。

实验步骤:
身高预测
① 首先读取数据集并加载数据:从两个数据文件中读取年龄(作为输入特征)和身高(作为目标变量)。
② 数据可视化: 打开一个新的图形窗口,并绘制年龄与身高的散点图。这有助于我们直观地看到数据的分布和潜在的关系。
③ 数据预处理:为输入数据添加一个全为1的列。这是线性回归中常见的做法,用于处理模型的截距项。
⑥ 绘制线性回归结果:在原始的散点图上,绘制了线性回归模型的预测结果,形成了一条线。这条线表示了年龄与身高之间的最佳线性关系。
④ 设置梯度下降参数:定义了学习率、迭代次数和初始的模型参数。这些参数将在后续的梯度下降算法中使用。
⑤ 梯度下降算法:使用当前的模型参数计算假设函数的值。根据误差(即假设函数的值与实际值之间的差异)更新模型参数。计算当前和上一次迭代的代价函数值,以监控模型的训练进度。
⑥ 绘制线性回归结果:在原始的散点图上,绘制了线性回归模型的预测结果,形成了一条线。这条线表示了年龄与身高之间的最佳线性关系。
请添加图片描述

⑦ 进行预测:使用训练好的模型,预测了两个特定年龄的男孩的身高。三岁半的男生的身高大约是0.9737米五岁的男生的身高大约是1.1973米
⑧ 对theta的值进行扫描。观测在不同的theta下的损失函数的值:对于一系列的模型参数值,计算了代价函数的值。这有助于我们了解不同参数值下模型的性能。
⑨ 绘制代价函数的3D曲面图:展示了代价函数与模型参数之间的关系。这有助于我们直观地看到哪些参数值能够使代价函数最小化。

请添加图片描述
房价预测
①数据预处理:从ex1_2x.dat和ex1_2y.dat加载数据。在x矩阵中添加一列全为1
的数据,以考虑截距项。使用均值归一化对x矩阵进行特征缩放。
②多个学习率的梯度下降:代码对线性回归运行了三次梯度下降算法,每次使用不同的学习率(alpha):0.12、0.15和0.18。对于每个学习率,算法迭代50次。在每次迭代中,它都会更新参(theta)并计算成本函数J,分别存储在J1、J2和J3中。
③预测:使用先前计算的均值和标准差对新数据点(1560, 3)进行缩放后进行预测。 预测的结果是:2.8088e+05
④可视化:为三个学习率绘制每次迭代(从0到49)的成本函数J的值。图表使用不
同的颜色来区分不同的学习率,并显示图例以识别它们。
请添加图片描述
结论分析与体会:

  1. 实验目的达成:
    通过本次实验,我们成功地实现了线性回归的梯度下降算法,并对结果进行了可视化。我们不仅探索了单变量线性回归,还进一步研究了多变量线性回归的情况。
  2. 数据可视化的重要性:
    通过绘制训练数据和线性回归的结果,我们可以直观地看到模型的拟合效果。这为我们提供了一个关于模型效果的直观印象,并有助于我们进一步调整模型参数。
  3. 学习率的选择:
    本实验中,我们观察到学习率对梯度下降的影响。选择合适的学习率是非常关键的,因为太小的学习率会导致收敛速度过慢,而太大的学习率可能会导致算法不收敛。
  4. 代价函数的理解:
    通过绘制J(θ)的3D曲面图,我们更深入地理解了代价函数与参数θ之间的关系。这种可视化方法为我们提供了关于如何优化代价函数的直观印象。
  5. 预测的应用:
    使用训练好的模型,我们成功地预测了给定年龄的男孩的身高。这验证了我们的模型不仅可以拟合训练数据,而且还可以用于实际的预测任务。
  6. 总体评价:
    本实验为我们提供了一个实际的机会,通过实践来理解线性回归和梯度下降的基本概念。通过不断的实验和调整,我们学习了如何优化模型以获得更好的结果。

身高预测 :

7. clear;clc; 
8. x = load ('data1/ex1_1x.dat') ; 
9. y = load ('data1/ex1_1y.dat') ; 
10. figure % open a new figure window 
11. plot(x,y,'o'); 
12. ylabel('Height in meters'); 
13. xlabel('Age in years'); 
14. m = length(y); 
15. x = [ones(m,1),x]; 
16.  
17. alpha = 0.07; 
18. num_iterations = 1500; 
19. J = zeros(num_iterations,1); 
20. theta(1, :) = [0, 0]; 
21.  
22. for i = 1:num_iterations 
23.      
24.     h = x * theta(i, :)'; % hypothesis h calculation using matrix multi
 plication 
25.      
26.     theta(i + 1, 1) = theta(i, 1) - alpha * (1/m) * sum((h - y) .* x(:,
 1)); 
27.     theta(i + 1, 2) = theta(i, 2) - alpha * (1/m) * sum((h - y) .* x(:,
 2)); 
28.      
29.     theta_before = theta(i, :)'; 
30.     theta_now = theta(i + 1, :)'; 
31.      
32.     J_before = (0.5/m) * sum((x * theta_before - y) .^ 2); 
33.     J_now = (0.5/m) * sum((x * theta_now - y) .^ 2); 
34.      
35. end 
36.  
37.  
38. hold on 
39. plot(x(:,2),theta(1500,:) * x','-') 
40. legend('Training data','Linear regression') 
41. 3.5 * theta(num_iterations,2) + theta(num_iterations,1) 
42. 7 * theta(num_iterations,2) + theta(num_iterations,1) 
43.  
44.  
45. J_vals = zeros(100,100); 
46.  
47. theta0_vals = linspace(-3,3,100); 
48. theta1_vals = linspace(-1,1,100); 
49.  
50. for i = 1: length(theta1_vals) 
51.     for j = 1: length(theta0_vals) 
52.         t = [theta0_vals(i);theta1_vals(j)]; 
53.         J_vals(i,j) = 1/(2 * m) * sum((x * t - y).^2); 
54.     end 
55. end 
56. J_vals = J_vals'; 
57. figure; 
58. surf(theta0_vals,theta1_vals,J_vals) 
59. xlabel('\theta_0');ylabel('\theta_1');

房价预测:

1. clear;clc; 
2. x = load ('data1/ex1_2x.dat') ; 
3. y = load ('data1/ex1_2y.dat') ; 
4. m = length(y); 
5. x = [ones(m,1),x]; 
6. sigma = std ( x ) ; 
7. mu = mean( x ) ; 
8. x ( : , 2 ) = ( x ( : , 2 ) - mu ( 2 ) ) ./ sigma ( 2 ) ; 
9. x ( : , 3 ) = ( x ( : , 3 ) - mu ( 3 ) ) ./ sigma ( 3 ) ; 
10. %% 
11. theta = zeros(size(x(1,:)))'; 
12. alpha = 0.12; 
13. J1 = zeros (50 , 1) ; 
14. for i = 1:50 
15.      
16.     hypothesis = x * theta; 
17.     error = hypothesis - y; 
18.      
19.     theta = theta - alpha *(1 / m) *(x' * error); 
20.      
21.     J1(i) = (1 / (2 * m)) * (error' * error); 
22.      
23.      
24. end 
25. %% 
26. theta = zeros(size(x(1,:)))'; 
27. alpha = 0.15; 
28. J2 = zeros (50 , 1) ; 
29. for i = 1:50 
30.      
31.     hypothesis = x * theta; 
32.     error = hypothesis - y; 
33.     
34.     theta = theta - alpha *(1 / m) *(x' * error); 
35.  
36.     J2(i) = (1 / (2 * m)) * (error' * error); 
37.      
38. end 
39. %% 
40. theta = zeros(size(x(1,:)))'; 
41. alpha = 0.18; 
42. J3 = zeros (50 , 1) ; 
43. for i = 1:50 
44.      
45.     hypothesis = x * theta; 
46.     error = hypothesis - y; 
47.      
48.     theta = theta - alpha *(1 / m) *(x' * error); 
49.      
50.     J3(i) = (1 / (2 * m)) * (error' * error); 
51.      
52.      
53. end 
54. xt = (1560 - mu(2))/sigma(2); 
55. yt = (3 - mu(3))/sigma(3); 
56. xp = [1,xt,yt]; 
57. yp = xp * theta 
58.  
59. plot(0:49, J1(1:50), '-b', 'DisplayName', 'alpha 0.12'); 
60. hold on; 
61. plot(0:49, J2(1:50), '-r', 'DisplayName', 'alpha 0.15'); 
62. plot(0:49, J3(1:50), '-g', 'DisplayName', 'alpha 0.18'); 
63.  
64. legend('show');  % 显示图例

身高预测的随机梯度下降方法:

1. clear;clc; 
2. x = load ('data1/ex1_1x.dat') ; 
3. y = load ('data1/ex1_1y.dat') ; 
4. figure % open a new figure window 
5. plot(x,y,'o'); 
6. ylabel('Height in meters'); 
7. xlabel('Age in years'); 
8. m = length(y); 
9. x = [ones(m,1),x]; 
10.  
11. alpha = 0.07; 
12. theta = zeros(2,1); 
13. num_iterations = 20000; 
14. J = zeros(num_iterations,1); 
15.  
16. for i = 2:num_iterations 
17.     idx = randi(m); 
18.     X_i = x(idx,:); 
19.     Y_i = y(idx); 
20.      
21.     hypothesis = X_i * theta; 
22.     error = hypothesis - Y_i; 
23.      
24.     theta = theta - alpha *(1 / m) *(X_i' * error); 
25.      
26.     J(i) = (1 / (2 * m)) * sum((x * theta - y).^2); 
27.     if abs(J(i) - J(i - 1)) < 1E-20 
28.         break; 
29.     end 
30.      
31. end 
32.  
33. hold on 
34. plot(x(:,2),x * theta,'-') 
35. legend('Training data','Linear regression') 
36. 3.5 * theta(2) + theta(1) 
37. 7 * theta(2) + theta(1)
  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕噜咕噜咕噜128

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值