深度学习-练习2 多变量线性回归

多变量线性回归

在这个练习中,我们主要解决的问题是房价的数据,在数据集中http://openclassroom.stanford.edu/MainFolder/courses/MachineLearning/exercises/ex3materials/ex3Data.zip

数据是Portland, Oregon的房价数据 共47个,变量是房价面积和卧室的个数,预测量为房价数据。

跟第一个练习一样,将训练集导入到程序当中,并且设clip_image001

>> x = load('ex3x.dat');

>> y = load('ex3y.dat');

>> m = length(y);

>> x = [ones(m, 1), x];

 

下面我们对所有的特征进行缩放,将所有特征的尺度缩放到-1到1之间,我们的做法是求均值和标准差。

通过原值减去均值之后除以标准差得到。具体代码如下:

>> sigma = std(x);

>> mu = mean(x);

>> x(:,2) = (x(:,2) - mu(2))./ sigma(2);

>> x(:,3) = (x(:,3) - mu(3))./ sigma(3);

 

下面我们开始使用梯度下降法

这一部分跟单变量线性回归类似,不同的是这边变成了两个变量。

下面代价函数:

clip_image002

批量梯度下降算法 迭代规则是:

clip_image003

这边我们仍然是做如下初始化:clip_image004

在前面我们给出了学习率为0.7,在这边我们要计算学习率通过代价函数。

学习率的范围大概如下:

clip_image005

具体的就是我们以另外一种向量的形式定义代价函数

clip_image006 变为如下形式:

clip_image007

这边理解1Xm 与mX1 两个向量相乘。

具体如下:

clip_image008

这边要说的是对于matlab之类的工具,处理向量,矩阵更加的优化,因此能转成向量矩阵运算的转成向量矩阵运算。

下面我们给出初始学习率,让其迭代100次,将迭代最终形成的图画出。

clip_image009

我们可以看出在学习率为1的时候,收敛速度最快,最容易达到局部最小值,因此使用学习率为1.

具体全部代码如下:

x = load('ex3x.dat');
y = load('ex3y.dat');
m = length(y);
x = [ones(m, 1), x];
sigma = std(x);
mu = mean(x);
x(:,2) = (x(:,2) - mu(2))./ sigma(2);
x(:,3) = (x(:,3) - mu(3))./ sigma(3);
 
MAX_ITR = 100;
sample_num = size(x,1);
 
figure;
alpha = [0.01, 0.03, 0.1, 0.3, 1, 1.3];
plotstyle = {'b', 'r', 'g', 'k', 'b-', 'r-'};
 
theta_final = zeros(size(x(1,:)))';
for alpha_i = 1:length(alpha)
    theta = zeros(size(x(1,:)))';
    J = zeros(MAX_ITR, 1);
    for i = 1: MAX_ITR
        J(i) = (0.5 * sample_num).* (x*theta - y)'* (x * theta - y); 
        grad = (1/sample_num).*x'*(x*theta-y);
        theta = theta - alpha(alpha_i).*grad;
    end
    
    plot(0:49, J(1:50), char(plotstyle(alpha_i)));
    hold on;
    
    if( 1 == alpha(alpha_i))
        theta_final = theta;
    end
end
 
legend('0.01','0.03','0.1','0.3','1','1.3');
xlabel('Number of iterations');
ylabel('Cost J');
 
price_gred_descend = [1 (1650-mu(2))/sigmax(2) (3-mu(3)/sigmax(3))]* theta_final;

 

最终预测结果为

price_gred_descend =

2.9935e+05

另外我们再使用基本的方程求解,更前面单变量线性回归一样:

clip_image010

price_normal =

2.9308e+05

具体代码:

theta_normal = (x_unscaled' * x_unscaled)\x_unscaled' * y;

price_normal = dot(theta_normal, [1, 1650, 3]);

 

这边x_unscaled在没有改变的时候赋值。

这样多变量的线性回归就结束了,主要学习的时候,学习率的选择。

posted @ 2014-05-11 21:33 越影&逐日而行 阅读(...) 评论(...) 编辑 收藏