Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 1——简单的线性回归模型和梯度下降

本文主要是介绍Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 1——简单的线性回归模型和梯度下降,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此系列为 Coursera 网站机器学习课程个人学习笔记(仅供参考)
课程网址:https://www.coursera.org/learn/machine-learning
参考资料:http://blog.csdn.net/scut_arucee/article/details/49453033


1 Introduction

1.1 机器学习的定义

Arthur Samuel 将其描述为:the field of study that gives computers the ability to learn without being explicitly programme.
另一种更为现代化的定义是:A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.

所有的机器学习问题都可以划分为两大类:监督学习(Supervised learning)和无监督学习(Unsupervised learning)。
其他分类还有增强学习(Reinforcement learning)、推荐系统(Recommender system)。


1.2 监督学习(Supervised Learning)

监督学习与无监督学习的区别就是:“right answers” given,即用于训练的数据已经提供了一组“标准答案”。
监督学习问题又可以分为 1.回归问题(Regression)和 2.分类问题(Classification)。

回归问题:predict continuous valued output,即需要预测的变量是连续的。

例如:已知一组数据,包含房屋的面积(x)和对应的价格(y),预测当房屋面积为特定值时(x=x0)对应的价格为多少。

分类问题:discrete valued output,即需要预测的变量的离散的(0 or 1)。

例如:已知一组数据,包含肿瘤的大小(size)和对应的性质(良性/恶性)(0/1),当给出肿瘤的大小时,判断其为良性还是恶性。


1.3 无监督学习(Unsupervised Learning)

无监督学习与监督学习的区别是:no right answer,即没有给定标准答案,预测的答案不会给出任何反馈,根据数据的结构和关系将它们进行聚类。

clustering:网页将每天发生的各类新闻分类,相似的新闻会归到一类。
non-clustering: The “Cocktail Party Algorithm”,将人说话的声音与背景音乐分离。


2 Model Representation

首先我们定义几个符号:

x 输入变量(feature)
X 输入空间
y 输出变量
Y 输出空间
(x,y) 一个训练数据
(xi,yi) i 个训练数据
m 训练数据的个数

2.1 假设函数(hypothesis)

对于监督学习,我们的目标是,给定一个数据集,通过学习算法得到一个函数 h:XY ,使得可以从 h(x) 中很好的预测出与 x 相对应的y值。函数 h 被称之为假设函数(hypothesis)。
以房价预测为例,房屋面积为x,预计房价值为 y ,对于单变量线性回归,我们可以设假设函数(hypothesis function)为:hθ(x)=θ0+θ1x hθ(x) 可以简写为 h(x) 。整个过程可以用下图表示:


2.2 代价函数(cost function)

有了 hθ(x) (hypothesis function)我们如何得到 θ0 θ1 的值呢?我们的优化目标是选择 θ0 θ1 使得 hθ(x) 在训练数据集上尽可能地靠近 y 。我们可以使用均方差来衡量hθ(x) y 之间的相似度。要使两者相似度尽可能大,就要满足它们之间的均方差最小。即:

minimizeθ0,θ112mmi=1(hθ(x(i))y(i))2

为了后面求导的方便,我们在前面乘了一个 12 ,并不会影响后面的结果。
这时,我们可以定义我们的代价函数(cost function):

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

这个函数也称为均方差函数(squared error function),是回归问题中最常见的代价函数。后续还会讲到其他类型的代价函数(cost function)。


3 代价函数(Cost Function)

代价函数(cost function)也称为损失函数(loss function)

下面我们会举几个例子来看一看代价函数是怎么工作的以及它的作用。
为了简化,我们设 θ0=0 ,此时, hθ(x)=θ1x J(θ1)=12mmi=1(θ1x(i)y(i))2
首先我们区分一下 hθ(x) J(θ1)

    hθ(x) θ1 固定,是关于 x 的函数;
J(θ1):是关于 θ1 的函数;

例如,给定的三组训练数据,我们可以在 (x,y) 坐标系中做出不同 θ1 对应的 hθ(x) 的图像,如下 hθ(x) 分别取 1 0.5 0 ,红色叉点为训练数据。

分别计算代价函数 J(θ1) J(1)=123(02+02+02)=0 J(0.5)0.58 J(0)2.3 ,可大致画出 J(θ1) 关于 θ1 的图像。

可以看出当 θ1=1 时, J(θ1) 最小。 J(θ1) 图像中,不同的 θ1 对应 hθ(x) 图像中不同的(过原点的)直线。

接下来我们通过轮廓图(contour plots)更加深入地了解代价函数(cost function)的作用。上面 J(θ) 函数只有一个参数 θ1 ,可以看出 J(θ) 的图像像一个弓形,而当 J(θ) 含有两个参数 θ1 θ0 ,那么 J(θ0,θ1) 的图像呈三维曲面,如下图所示:

下面为了方便讲解,我们不使用这样的三维曲面,而是用轮廓图(contour plots)来代替。如下图所示:

右图 J(θ0,θ1) 的轮廓图,每一个圆圈代表 J(θ0,θ1) 值相同的所有点的集合。最小值是中心点。
图中红色的交叉点代表某个 (θ0,θ1) 数值组的集合, θ0=800 θ1=0.15 ,同时,也对应与左边的一条直线。可以看出,它并不能很好地拟合左图的训练数据。而越接近中心的点 (θ0,θ1) 越能很好地拟合训练数据。

这里只有两个参数,而通常我们会遇到更多参数,更加复杂的代价函数,并不能将其可视化,但是我们要做的工作都是一样的,即找出使代价函数最小的参数值 θ0θ1


4 梯度下降(Gradient Descent)

现在,我们有了假设函数(hypothesis)以及衡量其是否拟合数据的方法——代价函数(cost function),现在我们需要做的就是估计出假设函数(hypothesis)中的参数,即找出使代价函数最小化的参数 (θ0,θ1) ,梯度下降(gradient descent)是一种常用的方法。

除了最小化单变量线性回归的代价函数,梯度下降还可用于最小化更一般的代价函数:

minimizeθ0,θ1,,θnJ(θ0,θ1,,θn)

4.1 梯度下降算法(gradient descent algorithm)

为了简化过程,我们以单变量线性回归为例(设参数只有) θ0,θ1 ,梯度下降的大致过称为:

①给 θ0,θ1 赋初始值,可以都是0
②不断更新 θ0,θ1 J(θ0,θ1) 减小到期望的最小值。

假设 J(θ0,θ1) 如下图三维平面,我们想象自己站在小山坡上的某点,要尽快下山,问题就变为每一步应该朝哪个方向走,才能尽快到达山底。

一般情况下,我们会从出发点开始环顾四周,找到最快的方向,每走一步,就环顾四周判断一次,再走下一步,直到达到局部最小值。而这种方法的特点是从不同的出发点出发,我们最终到达的可能是不同的局部最优解,如图。关于这个问题,我们之后再进行讨论。

用更加数学化的方式总结梯度下降的算法,即,重复直到收敛:

θj:=θjαθjJ(θ0,θ1) (for j=0 and j=1 )

A:=B 表示把B赋值给A, α 称为学习率(learning rate),可以理解为我们每一次更新的步长,决定了每次更新的幅度。后面我们会讲如何设置 α


4.2 同时更新(simultaneously update)

在上面给出的更新式子中,我们需要每次更新的参数是 θ0,θ1 ,但需要注意的是两个参数需要同时更新(simultaneously update)。看下图,左图为正确的更新步骤,右图为错误的更新步骤。

简而言之,就是不能将此次已经更新过的 θ0 的值用于此次 θ1 的更新。


4.3 梯度下降如何实现最小化代价函数

那么为什么梯度下降可以用于最小化代价函数呢?即,梯度下降如何实现一步步更新后, J(θ) 越来越靠近最小值(山底)?
为了方便说明,我们仍假设 θ0=0 ,则:

θ1:=θ1αddθ1J(θ1)

其中, ddθ1J(θ1) 即为点 (θ1,J(θ1)) 出的切线斜率。考虑以下三种情况:

1、若 θ1 在局部最优解的右边:

ddθ1J(θ1 永远大于等于0,且 α 永远为正,所以 θ1 将减小,向坐标轴左侧移动,即向代价函数 J(θ1) 更小的方向更新。

2、若 θ1 在局部最优解的左边:

ddθ1J(θ1 永远小于等于0,且 α 永远为正,所以 θ1 将增大,向坐标轴右侧移动,即向代价函数 J(θ1) 更小的方向更新。

3、若 θ1 已经处于局部最优位置:
由于该点切线的斜率 =ddθ1J(θ1)=0 ,故 θ1 将保持不变,此时即使还存在其他 θ1 的值使代价函数更小,也只能收敛于该局部最小值,而无法收敛于全局最小值。


4.4 学习率(learning rate)

我们再来看学习率 α :

1、 如果 α 太小,则因为每次更新 θ1 的幅度太小导致梯度下降收敛很慢,如下图:

2、如果 α 太大,则梯度下降可能会跨过最小值不能收敛,甚至离收敛点越来越远,如下图:

有趣的是,我们并不需要改变 α 的值,即使 α 值固定,梯度下降也能收敛到一个局部最小值。原因是代价函数在接近局部最小值的过程中,切线的斜率越来越小,即 ddθ1J(θ1 越来越小,即使 α 固定,梯度下降的步距也会越来越小,最终也能收敛到局部最小值。


4.5 梯度下降与线性回归

前面我们说过,线性回归常用的代价函数就是方差代价函数。现在,我们就将梯度下降用于最小化方差代价函数,

J(θ0,θ1)=12mmi=1(hθ(x(i)y(i))2
hθ(x(i))=θ0+θ1x(i)

梯度下降算法的表达式:

θj:=θjαθjJ(θ0,θ1) (for j=0 and j=1 )

根据上面两的公式,我们把等式转化为:(下图中 xi 表示 x(i) yi 表示 y(i)

同理这里 θ0 θ1 也是同时更新,其中 hθ(xi)=θ0+θ1x) 是造成对 θ1 求偏导多出了 x(i) 这一项的原因。

下面我们看只一个训练数据求偏导:

如果我们从初始值开始不断重复梯度下降的过程,我们的假设函数(hypothesis)会变得越来越准确。


4.6 批量梯度下降(batch gradient descent)

上述方法在每一步都会用到所有的训练数据( ),所以被称为批量梯度下降(batch gradient descent)。在我们用的这个特殊例子(单变量线性回归)中, J(θ0,θ1) 除了全局最优解(global optima)没有局部最优解(local optima)。将梯度下降用于这种线性回归,总会收敛到全局最优。


4.7 随机梯度下降( stochastic gradient descent)

上面的梯度下降算法每次计算梯度都需要遍历所有的样本点,这是因为梯度是 J(θ) 的导数,而 J(θ) 是需要考虑所有样本的误差和 ,这个方法问题就是,扩展性问题,当样本点很大的时候,基本就没法算了。所以接下来又提出了随机梯度下降算法(stochastic gradient descent )。随机梯度下降算法,每次迭代只是考虑让该样本点的 J(θ) 趋向最小,而不管其他的样本点,这样算法会很快,但是收敛的过程会比较曲折,整体效果上,大多数时候它只能接近局部最优解,而无法真正达到局部最优解。所以适合用于较大训练集的情况。


附:课后测试题答案

答案:D

这篇关于Coursera 机器学习(by Andrew Ng)课程学习笔记 Week 1——简单的线性回归模型和梯度下降的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/664305

相关文章

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo