要想顺利的完成作业,必须参考编程作业指导文件ex1.pdf 第一次作业主要包括两部分:必做题和选做题。其中必做题包括一道热身练习和完成单变量的线性回归问题,选做题是完成多变量的线性回归问题。

运行作业只要在具有Octave环境时候,进入到文件目录,执行ex1或者ex1_multi即可。

1.热身练习

热身练习主要是在warmUpExercise.m文件中生成一个5X5的单位矩阵。 代码如下:

A = eye(5);

2.单变量线性回归问题

完成该道题,我们主要是利用样本数据ex1data1.txt(第一列为城市人口,第二列为对应该城市餐车收益),完成plotData.mcomputeCost.m文件gradientDescent.m文件,然后进行给出人口数量,对餐车收益进行预测。ex1.m文件为入口函数文件,不需要修改。

2.1 绘制数据 plotData.m

具体plotData.m中补充如下代码

plot(x,y,'rx','MarkerSize', 10);
xlabel('Profit in $10,000s');
ylabel('Population of City in 10,000s');

2.2 代价函数 computeCost.m

该文件主要是实现代价函数 $$J(θ)= {1 \over 2m} \sum_{i=1}^m(h_θ(x^{(i)}) − y^{(i)})^2$$ 具体computeCost.m中补充如下代码

J = 1/(2*m)*sum((X*theta - y).^2);

2.3 梯度下降 gradientDescent.m

该文件主要是实现梯度下降函数 $$θj := θj − α{1 \over m}\sum_{i=1}^m(h_θ(x^{(i)}) − y^{(i)})x_j^{(i)} (对于所有的j同时更新 θ_j )$$ 具体gradientDescent.m中补充如下代码

theta_t = theta;
theta(1) = theta(1) - alpha * (1/m) * (sum(X*theta_t-y));
theta(2) = theta(2) - alpha * (1/m) * (sum((X*theta_t-y).*X(:,2)));

3.多变量线性回归问题

完成该道题,主要是利用样本数据ex1data2.txt(房屋面积、房间数,售价),完成gradientDescentMulti.mcomputeCostMulti.mfeatureNormalize.mnormalEqn.m。最终实现给出房屋面积1650,房间数3的时候对房价进行预测。

3.1 特征归一化 featureNormalize.m

要求我们完成featureNormalize.m,主要对特征进行缩放,依据公式: $$x_i = {x_i - u_1 \over s_1} (u_1 为均值 s_1为标准差)$$ 具体featureNormalize.m中补充如下代码

len = length(X);
mu = mean(X);
sigma = std(X);
X_norm = (X - ones(len, 1) * mu) ./ (ones(len, 1) * sigma);

3.2 梯度下降 gradientDescentMulti.m

同单变量一样的思想,我们在gradientDescentMulti.m中补充如下代码

theta_t = theta;
for i = 1:length(theta)
    theta(i,1) = theta_t(i,1) - alpha * (1/m) * (sum((X*theta_t-y).*X(:,i)));
end

3.2.1 可选练习

ex1_multi.m中默认定义了

alpha = 0.01
num_iters = 400;

我们可以更改学习率和迭代次数,通过观察绘图来获得最佳的学习率。

3.2.2 价格预测

在求预测价格时候,不要忘记同样需要对样本数据进行归一化处理:

price = [1 (1650-mu(1))/sigma(1) (3-mu(2))/sigma(2)] * theta;

我们可以优化alpha,观察梯度下降快满。

3.3 正规方程Normal Equations

在多变量线性规划问题中,我们求θ还可以直接应用正规方程求解。 其中: $$θ = (X^TX)^{-1} X^Ty$$ 所以我们可以在normalEqn.m中直接添加如下代码:

theta = pinv(X' * X) * X' * y;