吴恩达ML笔记-ex.1-线性回归
前言
最近开始从吴恩达的教程入手机器学习,这门课在coursera推出,我是在网易云课堂上学习的,对应的练习题则是从github上找到的;
在这里做一个学习笔记,如果有幸能被人看到,也算做一个分享,我也会把简单的函数加入进来,方便和我一样的初学者;
Exercise 1.1: Linear Regression
任务列表
Part 1: Basic Function
Part 2: Plotting
Part 3: Cost and Gradient descent
具体实现
1. Basic Function (warmUpExercise.m)
热身运动,返回一个5*5的单位矩阵
A = eye(5);
2. Plotting (plotData.m)
把原版的plot加入了标签,标题等,打包成了一个函数
plot(x, y, 'rx', 'MarkerSize', 10);
xlabel('Population of City in 10,000s');
ylabel('Profit in $10,000s'); % 给X,Y轴添加标签
另注:
legend('a','b'); %添加图例
title(‘my plot’); %添加标题
subplot(1,2,1); %将画图窗口一分为二,并激活第一个窗口
3. Cost and Gradient descent (computeCost.m & gradientDescent.m)
(1) computeCost.m
计算代价函数,公式为:
其中,
习题的框架中,已经把X扩充了一行:X = [ones(m, 1), data(:,1)];
,于是在计算 h(x) 的时候不需要用for循环嵌套,只需要把X的第一列的’1’全部乘以theta(1),第二列的数据全部乘以theta(2)即可;另外需要注意的是,h(x)和y都是97*1的向量,运算时只需要两向量相减,不需要for循环嵌套;
其中需要注意的是在计算J,进行平方的时候,用的是 .^(点平方),课上也提到过,是对每个元素进行平方,相似的还有 .*(点乘) ,计算得到的是一个向量,还需要把各行加起来,用的是sum()函数:
hx = theta(1)*X(:,1) + theta(2)*X(:,2);
J = sum((hx-y).^2)/(2*m);
(2)gradientDescent.m
计算公式:
这里需要注意的就是红圈中的X(i), 前边得到的是一个向量,后边也需要用 .* 去做按元素的乘法,做法如下:
theta(1) = theta(1) - (alpha/m)*sum(hx-y);
theta(2) = theta(2) - (alpha/m)*sum((hx-y).*X(:,2));
Exercise 1.2: Linear regression with multiple variables
任务列表
Part 1: Feature Normalization
Part 2: Gradient Descent
Part 3: Normal Equations
具体实现
1. Feature Normalization (featureNormalize.m)
这个函数实现的就是特征的缩放(均值归一化),防止数值大的特征(房价)与数值小的特征(房间数)在同时进行拟合时,数值小的特征对结果的影响太小的问题。
以下是ex3的pdf中对特征缩放必要性的描述:
当特征相差数量级时,首先执行特征缩放可以使梯度下降更快地收敛。
以下是均值归一化用到的公式以及代码:
mu = mean(X);
sigma = std(X);
X_norm = (X-mu)./sigma;
2. Gradient Descent (gradientDescentMulti.m&computeCostMulti.m)
这里用到的思想和单变量线性回归类似,只是因为输入的X特征为两个,所以算上常数项theta(1),一共需要三个theta,另外就是需要计算的代价函数,这里完全采用向量化的思想,关于向量或者矩阵的操作完全按元素进行计算,如下所示:
(1) gradientDescentMulti.m
hx = sum(theta'.*X,2);
theta(1) = theta(1) - (alpha/m)*sum(hx-y);
theta(2) = theta(2) - (alpha/m)*sum((hx-y).*X(:,2));
theta(3) = theta(3) - (alpha/m)*sum((hx-y).*X(:,3));
(2) computeCostMulti.m
hx = sum(theta'.*X,2);
J = sum((hx-y).^2)/(2*m);
另注:作业中提出建议将不同学习率的梯度下降图像显示在同一张图中进行比较,我将四种不同的学习率(0.01,0.03,0.1,0.3)对应的曲线画出,图像如下所示:
(3) predict price
最后就是进行房价预测了,需要注意的点就是theta是用特征缩放计算出来的,所以在用theta预测房价的时候,要讲缩放的特征还原回去,做法如下:
area = 1650;
room = 3;
price = theta(1) + theta(2)*(area-mu(1))/sigma(1) + theta(3)*(room-mu(2))/sigma(2);
3. Normal Equations(normalEqn.m)
正规方程方法和梯度下降法都是用来求取参数theta最合适的值的,但是正规方程方法的优势在于不需要进行特征缩放,不需要添加循环,实现方式也更加简单,所需的公式和代码如下:
normalEqn.m:
theta = pinv(X' * X) * X'*y;
predict:
price = [1 1650 3] * theta ;
以上,就是机器学习ex1-线性回归的全部内容。
另注:这是我第一次写这种文章,会有纰漏在所难免,所以如果有什么错误,非常希望您能指正。