第二周-Coursera/Stanford机器学习课程学习笔记-多变量线性回归

第二周的课程在理论方面主要是多变量线性回归Multivariate Linear Regression,基本上是对第一周内容的泛化。另外讲解了Octave软件的使用,Octave是一个遵从GNU General Public License自由软件Free Software,它对Matlab具有很好的兼容性,基本上能在Matlab上运行的m文件都能在Octave上运行。


多变量线性回归

顾名思义,在多变量线性回归中,变量将不止一个。以下表所示数据为例:

面积/ m2 卧室数量楼层楼龄/年价格/万元
2105145460
1403240232
1503230315
852136178

共有4个输入变量和1个输出变量。
n= 变量数量;
x(i)j= j 个变量在第i个训练集中的值;
y(i)= i 个训练集中输出变量的值。
针对上面示例数据就有:
n=4
x(3)4=30
y(3)=315

假设函数

对单变量线性回归的假设函数进行更改可得到 :

hθ(x)=θ0x0+θ1x1+...+θnxn

上式中的 x0=1 ,是为了规范化公式,方便将公式向量化。令:
θ=θ0θ1θn,x=x0x1xn,y=y0y1yn

则可得:
hθ(x)=θTx

多变量梯度下降法

多变量线性回归的损失函数对应为:

J(θ)=J(θ0,θ1,,θn)=12mi=1m(hθ(x(i))y(i))2

对应的 梯度下降为:
Repeat {θj:=θjαθjJ(θ)}

在迭代的每一步应该对 j=0,,n 的所有 θj 同步更新。
带入损失函数,上式可变换为:
θj:=θjα1mi=1m(hθ(x(i))y(i))x(i)j

变量缩放/Feature Scaling

进行多变量线性回归时,会遇到一个新的问题,就是不同的输入变量之间的数值范围可能会相差很多,比如上面表格中的例子:
x1 范围为(0-200 m2 ); x2 范围为(1-5)个卧室。
为了使梯度下降收敛得更快,对每个变量进行数据规范化操作:

x(i)j=x(i)jmax(xj)min(xj), for i=1,2,,m.

进一步还有 均值归一化/Mean normalization,用 xjμj 代替 xj 使得变量的平均值为0。结合Feature scaling,得到数据规范化的方法:
x(i)j=x(i)javg(xj)max(xj)min(xj), for i=1,2,,m.


多变量线性回归的Matlab/Octave编程实现

这里使用的示例数据是课程作业提供的数据,点击这里获取,提取码doh3

数据规范化Octave实现

这里的输入参数 X 代表训练集输入变量矩阵:

X=x(1)0x(2)0x(m)0x(1)1x(2)1x(m)1x(1)nx(2)nx(m)n

输出变量:
X_norm:规范化后的输入变量矩阵;
mu:原始输入变量的平均值列向量;
sigma:原始输入变量的标准差列向量。
这里进行数据规范化时采用的方法和上面略有不同,不过效果一样。

function [X_norm, mu, sigma] = featureNormalize(X)
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));

mu = mean(X_norm);
sigma = std(X_norm);
X_norm = (X - repmat(mu, size(X, 1), 1)) ./ repmat(sigma, size(X, 1), 1);
end

损失函数Octave实现

输入参数 X 代表训练集输入变量矩阵,y代表训练集输出变量列向量,theta代表 θ 列向量。

function J = computeCostMulti(X, y, theta)
J = sum((X * theta - y) .^ 2) / (2 * length(y));  % 一行代码搞定
end

梯度下降法Octave实现

计算前需要提前指定学习速率alpha和迭代次数num_iters

function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)

J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    theta = theta - alpha * (X' * (X * theta - y)) / length(y);  
    J_history(iter) = computeCostMulti(X, y, theta);
end

end

综合

调用上述各函数,使用链接中的示例数据,按照以下程序可进行多变量线性回归的练习。

clear ; close all; clc

% Load Data
data = load('ex1data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);

% Scale features and set them to zero mean
[X mu sigma] = featureNormalize(X);

% Add intercept term to X
X = [ones(m, 1) X];

% Choose some alpha value
alpha = 0.1;
num_iters = 50;

% Init Theta and Run Gradient Descent 
theta = zeros(3, 1);
[theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters);

% Plot the convergence graph
figure;
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);
xlabel('Number of iterations');
ylabel('Cost J');

% Display gradient descent's result
fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);
fprintf('\n');

% Estimate the price of a 1650 sq-ft, 3 br house
X_predit = [1, ([1650 3] - mu) ./ sigma];
price = X_predit * theta; 

正规方程Normal Equation

对于多变量线性回归,除了使用梯度下降法外,还可以使用正规方程进行直接求解。方程比较简单,直接给出:

θ=(XTX)1XTy

Gradient Dscent VS Normal Equation

Gradient DscentNormal Equation
需要选择 alpha 不必选择 alpha
需要很多次迭代不需要迭代
当输入变量数 n 很大时效果也很好 需要计算(XTX)1 n 很大时速度会很慢

如果训练集的输入变量n过多,此时计算 (XTX)1 比较慢,使用Gradient Descent比较好。对于 n 的取值,Andrew Ng老师给了一个参考:n=10,000

正规方程Octava实现

这个比较简单

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

使用正规方程计算上面给的例子,得到的 θ 和使用梯度下降法应该是一样的,不过根据迭代次数的不同也会略有差别。


Octave软件介绍

最近对GNU倡导的自由软件非常着迷。之前用LibreOffice和LibreCAD分别代替了MSoffice和AutoCAD后,这次又因为学习Andrew Ng老师的机器学习课程遇到了GNU Octave,真是高兴啊,终于找到可以替代Matlab的自由软件了。好吧,其实我更在乎的是Free Softwarefree的“免费”之义。可以看出来,被替代的这三款软件若是使用正版的话,花费可是相当大哦。作为一个不想接着用盗版软件的穷diao丝,这些免费自由软件简直就是解放之光啊!
说回Octave,目前最新的版本已经支持图形界面,和Matlab比较相像,使用起来感觉也差不多,兼容性很好,目前还没有遇到什么问题。先睹为快:

Octave软件界面


版权声明:署名-非商业性使用-相同方式共享 3.0 中国大陆 (CC BY-NC-SA 3.0 CN)
发表日期:2016年4月17日

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值