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