机器学习练习之多变量线性回归

来源:互联网 发布:淘宝宝贝属性怎么填 编辑:程序博客网 时间:2024/06/06 09:50

      在做完上一篇只有一个变量的线性回归后,这里继续完成多元线性回归模型的练习:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=MachineLearning&doc=exercises/ex3/ex3.html。其实模型也是完全一样的,只不过输入是多维的特征而已,这里的数据是给定了房子大小和房间数相对应的房价,给了这些数据,用线性回归模型求出模型参数,然后对新数据作出预测。


%% Exercise 3: Multivariate Linear Regression% 多变量线性回归%%%% 载入数据并作预处理x = load('ex3x.dat');y = load('ex3y.dat');m = length(x);x = [ones(m, 1), x];  %第一列全为1,加入偏置项x_unscaled = x; %保存为归一化的x,后面方程解要用到sigma = std(x);  % 如果为vector,则返回标准差,如果是矩阵,返回每一列即每个维的标准差mu = mean(x);  % 如果为vector,返回平均值,如果为矩阵,返回每一列的平均值x(:,2) = (x(:,2) - mu(2))./ sigma(2);  % 归一化:减去平均值再除标准差x(:,3) = (x(:,3) - mu(3))./ sigma(3);%%%% 为画图做准备figure;plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'}; %不同的学习率用不同的画线风格%%%% 梯度下降MAX_ITR = 100;alpha = [0.01, 0.03, 0.1, 0.3, 1, 1.3];theta_grad_descent = zeros(size(x(1,:)));n = length(alpha);for i = 1:n    theta = zeros(size(x(1,:)))'; % size(x(1,:))返回1*n向量,n为每个样本的维数,转置后为n*1的0向量    J = zeros(100, 1);    for num_iterations = 1:MAX_ITR        J(num_iterations) = (0.5/m) .* sum((y-x*theta).^2);  % 损失函数        theta = theta - alpha(i)*(1/m).*x'*(x*theta-y);    end    plot(0:49, J(1:50), char(plotstyle(i)), 'LineWidth', 2);    hold on;        %通过实验发现alpha为1时损失最小,这里记录下这时的theta    if alpha(i) == 1        theta_grad_descent = theta;    endendlegend('0.01', '0.03', '0.1', '0.3', '1', '1.3');xlabel('Number of iterations');ylabel('Cost L');%% 预测theta_grad_descent% 预测房子面积为1650,房间数为3的房价price_grad_desc = dot(theta_grad_descent, [1, (1650-mu(2))/sigma(2), (3-mu(3))/sigma(3)])%% Normal equationstheta = inv(x_unscaled'*x_unscaled)*x_unscaled'*yprice_normal = dot(theta, [1, 1650, 3])%%
实验结果:


 从上面的结果看出,选择不同的步长会有不一样的结果,如果选得不好,算法可能不会收敛,即损失不会减少到某一极小点,可能在某一局部最优解上震荡,这样的模型对训练数据都没找出正确的规律,用来预测新数据也肯定不会好。做实验时,调参是一个很重要的步骤。还有就是预处理也非常重要,像这里的数据中,一个是房子面积,数目大而且变化大,而房间数数目小而且变化小,如果不做归一化等预处理学习到的模型可能会过拟合,做了归一化处理可能加加快学习速度,学到的模型更稳定,variance更小。

     

0 1
原创粉丝点击