Linear Regression/线性回归与正则化(Andrew Ng 机器学习 一 )

线性回归

用一个线性函数对提供的已知数据进行拟合,最终得到一个线性函数,使这个函数满足我们的要求(如具有最小平方差,随后我们将定义一个代价函数,使这个目标量化),之后我们可以利用这个函数,对给定的输入进行预测(例如,给定房屋面积,我们预测这个房屋的价格)。
如图所示(得到了一条直线):这里写图片描述
假设我们最终要的得到的假设函数具有如下形式:这里写图片描述
其中,x是我们的输入,theta是我们要求得的参数。

我们的目标是使得此代价函数具有最小值。

为此,我们还需要求得代价函数关于参量theta的导数,即梯度,具有如下形式:这里写图片描述
有了这些信息之后,我们就可以用梯度下降算法来求得theta参数。过程如下:这里写图片描述这里写图片描述

关于正则化

线性回归同样可以采用正则化手段,其主要目的就是防止过拟合。因此解决过拟合问题的一种方法就是正则化。
当采用L1正则化时,则变成了LassoRegresion;当采用L2正则化时,则变成了Ridge Regression;线性回归未采用正则化手段。通常来说,在训练模型时是建议采用正则化手段的,特别是在训练数据的量特别少的时候,若不采用正则化手段,过拟合现象会非常严重。L2正则化相比L1而言会更容易收敛(迭代次数少),但L1可以解决训练数据量小于维度的问题(也就是n元一次方程只有不到n个表达式,这种情况下是多解或无穷解的)。
直接用矩阵的运算求出最佳的theta值。套现成公式,就能求得theta。这里写图片描述
X是矩阵,代表训练集,每一行是一个样本的各特征值。y是个向量,对应每个样本的结果值。

梯度下降与Normal Equation的对比:

Gradient DescentNormal Equation
自定义alpha不需要定义alpha
循环N次才能得到最佳theta值不需要任何循环操作
特征个数非常大时,也适用适用于特征个数小于100000时使用
需要feature scaling不需要feature scaling

这里提到Feature Scaling,feature scaling的方法可自定义,常用的有:
1) mean normalization (or standardization)
  (X - mean(X))/std(X)
2) rescaling
(X - min) / (max - min)

附录(编程答案)

斯坦福大学机器学习week2(Linear Regression)编程习题
* plotData.m

function plotData(x, y)
% ====================== YOUR CODE HERE ======================
figure; % open a new figure window
plot(x, y, '+', 'MarkerSize', 10);
xlabel('Population of City in 10,000s');
ylabel('Profit in $10,000s');
% ============================================================
end
  • computeCost.m
function J = computeCost(X, y, theta)
% Initialize some useful values
m = length(y); % number of training examples
% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost of a particular choice of theta
%               You should set J to the cost.
J = sum((X * theta - y) .^ 2) / (2 * m);
% ==========================================================
end
  • gradientDescent.m
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
% ====================== YOUR CODE HERE ======================
    theta = theta - alpha * (X' * (X * theta - y)) / m
% ============================================================
% Save the cost J in every iteration    
    J_history(iter) = computeCost(X, y, theta);
end
end
  • featureNormalize.m
function [X_norm, mu, sigma] = featureNormalize(X)
% You need to set these values correctly
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));
% ====================== YOUR CODE HERE ======================
len = length(X);
mu = mean(X);
sigma = std(X);
X_norm = (X - ones(len, 1) * mu) ./ (ones(len, 1) * sigma);
% ============================================================
end
  • normalEqn.m
function [theta] = normalEqn(X, y)
theta = zeros(size(X, 2), 1);
% ====================== YOUR CODE HERE ======================
% ---------------------- Sample Solution ----------------------
theta = pinv(X' * X) * X' * y
% ============================================================
end

备注:视频可以在Coursera机器学习课程上观看或下载:https://class.coursera.org/ml

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值