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 Descent

Normal 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习自然语言处理

机器学习之多层感知机理论与实践

阅读大概需要10分钟 作者 Lefteris 翻译 bluepomelo 编辑 zenRRan 有修改 原文链接 http://blog.refu.co/?p=...

3494
来自专栏wym

OpenCV-3计算机视觉(Canny边缘检测)

函数原型:edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2g...

594
来自专栏AI研习社

使用 GAN 网络生成名人照片

生成式对抗网络(GANs)是深度学习中最热门的话题之一。 生成式对抗网络是一类用于无监督学习算法的人工算法,由两个神经网络组成的系统实现:

331
来自专栏ATYUN订阅号

使用生成式对抗网络进行图像去模糊

AiTechYun 编辑:yuxiangyu 本文主要讨论使用生成式对抗网络实现图像去模糊。 代码:https://github.com/RaphaelMeu...

1K8
来自专栏求索之路

cs231n之SVM算法和SoftMax算法

1.环境搭建以及前置条件 1.前置环境: 1.mac 2.pycharm 3.python3 4.Anaconda 2.环境搭建: 1.官网下载并安装Ana...

2856
来自专栏AI研习社

手把手教你如何用 TensorFlow 实现基于 DNN 的文本分类

编者按:本文源自一位数据科学开发者的个人博客,主要面对初学者用户,AI 研习社编译。另外,关于 TensorFlow 和 DNN 的更多深度内容,欢迎大家在文末...

3259
来自专栏PaddlePaddle

转载|使用PaddleFluid和TensorFlow训练序列标注模型

上一篇通过转载|使用PaddleFluid和TensorFlow训练RNN语言模型大家了解了:

983
来自专栏CreateAMind

keras中文doc之三

前面介绍了keras文档一二 keras中文文档, keras中文-快速开始Sequential模型

692

从程序员的角度看神经网络的激活功能

这篇文章是系列文章的第二部分,讨论使用Java以简单易懂的方式编程神经网络的方法。

1907
来自专栏懒人开发

(2.9)James Stewart Calculus 5th Edition:The Derivative as a Function

这里a是一个固定值, 如果把a看成一个变量,就是一个函数了 对应的过程,可以理解成这个函数的导数 (也就是这个方程的导数)

604

扫码关注云+社区