Advertisement

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

阅读量:

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

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米(即约97.37厘米),五岁男孩身高中约1.1973米(即约119.73厘米)。
⑧ 遍历θ的不同取值以观察其对应损失函数的变化情况:对于给定的一系列模型参数组合计算相应的损失度量从而分析模型在不同参数设置下的表现。
⑨ 生成θ-损失函数三维曲面图以揭示损失度量随θ变化的趋势:此图表有助于识别最优θ取值范围。

请添加图片描述

房价预测
①数据预处理:从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. 数据可视化的重要性:
    利用训练数据与线性回归结果绘制图表能够清晰地观察到模型拟合效果的变化趋势。这有助于我们形成对模型效果的直观认知,并且让我们更容易地优化模型参数。

在本实验中, 我们发现学习率对梯度下降具有显著影响. 合适的学习速率是非常关键的, 因为使用过小的学习速率可能导致收敛速度缓慢, 而采用过大学习速率可能导致算法无法收敛.

  1. 代价函数的理解:
    通过绘制J(\theta)的三维曲面图, 我们对代价函数与参数\theta之间的关系进行了深入探究. 该直观展示有效呈现了优化过程的关键要素.

  2. 预测的应用:
    通过训练好的模型系统,在特定年龄段的小男生身高中取得了显著成效。这一结果证实了我们的模型不仅能够良好地拟合训练数据集,并且在实际应用中也能有效完成预测任务。

总体评价:
本实验给我们一个实践机会,帮助我们掌握线性回归与梯度下降的核心概念.经过多次实验与调整,我们成功地优化了模型,得到了更好的效果.

身高预测 :

复制代码
 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');
    
    
    matlab
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/yoZEH9POF6aJ1BGi2NXnWpDTSr83.png)

房价预测:

复制代码
 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');  % 显示图例
    
    
    matlab
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/yDBvRaUupTieZVm6cwFxYdECLIPJ.png)

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

复制代码
 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)
    
    
    matlab
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/hEXvcCxfwNSyoLZmMtj2Q0rzAHli.png)

全部评论 (0)

还没有任何评论哟~