文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2019-10-25   2.8k

Machine_Learning-Week1

机器学习介绍

什么是机器学习?视频中给出了两种定义,从具体理解来看,我更倾向于Tom Mitchell的定义,原文是:

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.

用DeepMind下围棋来解释就是:

E:下很多场围棋的体验

T:某一局下棋的任务

P:DeepMind赢得比赛的可能性

总体来说,机器学习可以分为两大类:监督学习(supervised learning)无监督学习(unsupervised learning)

监督学习

在监督学习中,我们事先就有了一个数据集,并且已经知道正确的输出应该是什么样子,并认为输入和输出之间存在某种联系。

监督学习问题分为“回归(regression)”和“分类(classification)”问题。

在回归问题中,我们试图预测连续输出中的结果,这意味着我们试图将输入变量映射到某个连续函数。

在分类问题中,我们改为尝试预测离散输出中的结果。 换句话说,我们正在尝试将输入变量映射为离散类别。

举例来说:

给定数据,预测房屋的具体价格。判断是回归问题还是分类问题,价格作为规模的函数是一个连续的输出,因此这是一个回归问题。但是,如果我们把输出改变一下,我们可以通过输出关于房屋是否“以高于或低于要价的价格出售”的输出,从而将这个示例转变为分类问题。 在这里,我们根据价格将房屋分为两个离散类别。

所以我们判断一个机器学习的问题是分类问题还是回归问题,我们看的是它的输出类型,如果是离散数据那么就是一个分类问题,如果是连续数据,那么就是回归问题。

无监督学习

我们有一些问题,但是不知道答案,我们要做的无监督学习就是按照他们的性质把他们自动地分成很多组,每组的问题是具有类似性质的(比如数学问题会聚集在一组,英语问题会聚集在一组,物理…)。

所有数据只有特征向量没有标签,但是可以发现这些数据呈现出聚群的结构,本质是一个相似的类型的会聚集在一起。把这些没有标签的数据分成一个一个组合,就是聚类(Clustering)。比如Google新闻,每天会搜集大量的新闻,然后把它们全部聚类,就会自动分成几十个不同的组(比如娱乐,科技,政治…),每个组内新闻都具有相似的内容结构。

无监督学习还有一个典型的例子就是鸡尾酒会问题(声音的分离),在这个酒会上有两种声音,被两个不同的麦克风在不同的地方接收到,而可以利用无监督学习来分离这两种不同的声音。注意到这里是无监督学习的原因是,事先并不知道这些声音中有哪些种类(这里的种类就是标签的意思)。

单变量线性回归

什么是线性回归模型?回想一下在回归问题中,我们正在使用输入变量,并试图将输出拟合到连续的预期结果函数中。

那么,具有一个变量的线性回归称为“单变量线性回归”,即根据单个输入值x预测单个输出值y时,使用单变量线性回归。

假设函数(Hypothesis Function)

$$
\hat{y} = h_\theta(x) = \theta_0 + \theta_1 x
$$

线性回归模型的假设函数就是一个一元一次多项式,从几何角度来讲,这个函数在坐标轴上反映为一条直线,x是自变量,y是因变量。

举例来说:

input x output y
0 4
1 7
2 7
3 8

根据表格中给定的输入和输出,我们可以猜测假设函数为:hθ(x)=2+2x

但是我们x输入1的话,y输出是4,这与实际给定值偏差了3,所以我们需要寻找一组最合适的θ1和θ2来最佳拟合给定的数据。

代价函数(Cost Function)

我们使用代价函数来衡量上面给定的假设函数的精确性,这将假设的所有结果取平均值(实际上是平均值的简化版本),其中将x的输入与实际输出y的输入进行比较。
$$
J(\theta_0, \theta_1) = \dfrac {1}{2m} \displaystyle \sum {i=1}^m \left ( \hat{y}{i}- y_{i} \right)^2 = \dfrac {1}{2m} \displaystyle \sum {i=1}^m \left (h\theta (x_{i}) - y_{i} \right)^2
$$
用符号J来表示代价函数,把这个函数拆开来看一下:
$$
\sum {i=1}^m \left (h\theta (x_{i}) - y_{i} \right)^2
$$
i 为第 i 个数据,上式表示我通过拟合函数 hθ(x) 得到的第 i 个数据与真实的第 i 个数据的误差。总共有 m 个数据,那么我们就应该把 m 个数据的误差求和然后再求出平均误差,得到下面这个式子。
$$
\dfrac {1}{2m} \displaystyle \sum {i=1}^m \left (h\theta (x_{i}) - y_{i} \right)^2
$$

其实除以 m 或 2m 代价函数最优化的结果都是相同的,这里为了后续求导计算方便,因此用 2m处理。

只要我让这个值尽可能的小,那么我们所做的拟合函数就越准确,所以刚才求拟合函数的问题就转化成了通过 θ0 和 θ1 求 J(θ0, θ1) 的最小值,及最优化问题。

讲到这里,有必要对上面的知识点进行一些小的总结:

  • 首先给了一个假设函数:

    Hypothesis

$$
\hat{y} = h_\theta(x) = \theta_0 + \theta_1 x
$$

  • 代价函数中的θ0和θ1是任意的,那么我们就需要一个函数来判断这个假设函数与真实数据之间的拟合度如何,为了描述拟合度,我们又提出了代价函数:
    $$
    J(\theta_0, \theta_1) = \dfrac {1}{2m} \displaystyle \sum {i=1}^m \left ( \hat{y}{i}- y_{i} \right)^2 = \dfrac {1}{2m} \displaystyle \sum {i=1}^m \left (h\theta (x_{i}) - y_{i} \right)^2
    $$

  • 我们的目标当然是代价函数的值越小越好,即用数学公式表示为:
    $$
    \min_{\theta_1,\theta_2} J(\theta_1,\theta_2)
    $$

为了说明代价函数是如何进行工作的,现在我们来简化一下问题,让 θ0=0,这样我们要求的拟合函数就是一条过原点的直线,参数就剩下一个 θ1,θ1 代表直线的斜率。如下图所示,我想要拟合左图中的 3 个点,我就要取不同的参数 θ1 进行尝试,θ1 取值不同,直线的颜色不同。这里 θ1 分别取 0, 0.5, 1,直线的颜色分别为深蓝、紫色和浅蓝色。如何确定哪条直线拟合的最好呢,我们就要把 θ1 的不同取值带入到代价函数 J(θ1) 中(右图)。这里我们就发现,当 θ1=1 时,代价函数值最小为 0,那么我们就找到了拟合函数 hθ(x)= θ1x 的最佳参数 θ1=1。

如果有两个参数 θ0 和 θ1,那么他们的代价函数图像就是一个三维图像。

用轮廓图画出来的话就是这样(轮廓图类似于等高线图)

右边的轮廓图一圈就相当于左边的同一条直线。

我们可以发现,越往轮廓图的中心位置移动,假设函数与真实数据就更加拟合。

如果是每次要我们人工去寻找这个最低点,未免也太不“人工智能”了。 有没有一种算法可以自动地求出使得代价函数最小的点呢?有,那就是梯度下降。 (又到了最优化的问题了)

梯度下降(Gradient Descent)

**梯度下降(Gradient descent)**是一个用来求代价函数最小值的算法。梯度下降算法的思想就是首先先从一组参数值(θ0, θ1)开始,不断地去尝试各种(θ0, θ1),直到使得代价函数 J(θ0, θ1) 最小为止。以下图代价函数为例,从不同起始点开始,到达的局部最优位置不同,也就是局部最优解不同。

梯度下降算法用以下伪代码表示:

repeat until convergence:
$$
\theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1)
$$
具体应用到线性回归算法当中,算法表现为:(也就是把代价函数代入上式中)

在每一次迭代的过程中,必须同时更新θ0和θ1的值,即:

再稍微解释一下这个算法:

首先是一个循环结构,当不能再更新θ0, θ1时循环停止,:=是一个赋值号,α是学习速率,也就是下山每次迈出多大步子,后面紧跟着的是一个偏导数。 用几何图形来解释显得更为直观,不妨设θ0=0:

其中 α 后面的导数就代表着这一点的斜率,每次 θ1 更新都是减去一个 α与该点的斜率之积,当下降到局部最小处时,导数恰好为零,此时 θ1 不再更新,就得到了我们想要的结果 ,如下图所示:

对于α的取值还是比较讲究的,如果α太大, 会出现下图中的情况,直接跳过局部最优解,一直循环,而且离局部最优解会越来越远。如果α太小,寻找局部最优解的速率会特别特别慢。

线性回归的梯度下降算法

到现在,我们已经学过了线性回归模型代价函数梯度下降,这三个算法就可以组成我们今天要学到的第一个机器学习算法:线性回归的梯度下降算法 (Gradient Descent For Linear Regression)

左边是梯度下降算法,右边是线性回归模型和代价函数。

分别求出 j=0 和 j=1 时代价函数的偏导数:
$$
\frac{\partial}{\partial \theta_0} J(\theta_0, \theta_1)=\dfrac {1}{m} \displaystyle \sum {i=1}^m \left (h\theta (x^{(i)}) - y^{(i)} \right)
$$

$$
\frac{\partial}{\partial \theta_1} J(\theta_0, \theta_1)=\dfrac {1}{m} \displaystyle \sum {i=1}^m \left ((h\theta (x^{(i)}) - y^{(i)} \right)x^{(i)}
$$
那么,把一般性的梯度下降算法应用到线性回归模型的时候,就可以得出一个新的具体形式:
$$
\begin{align*} \text{repeat until convergence: } \lbrace & \newline \theta_0 := & \theta_0 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m}(h_\theta(x_{i}) - y_{i}) \newline \theta_1 := & \theta_1 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m}\left((h_\theta(x_{i}) - y_{i}) x_{i}\right) \newline \rbrace& \end{align*}
$$
这个算法也叫做批量梯度下降(Batch Gradient Descent ),他的特点就是每次进行梯度下降都要使用整个数据集。

Copyright © ca01h 2019-2020 | 本站总访问量