美文网首页
Machine Learning - Andrew Ng 笔记

Machine Learning - Andrew Ng 笔记

作者: nafoahnaw | 来源:发表于2019-08-11 18:56 被阅读0次

    机器学习的类型

    1.监督学习
    你需要给机器一个有明确答案的训练样本,让机器根据已经有的经验去对未知的情况进行预测,比如给定的训练样本是房间面积-房价的关系,对每一个训练样本中的面积,机器明确知道对应的房价.
    2.无监督学习
    对输出结果没有明确的界定,比如对基因分类,在结果出来之前谁也不知道会分为几类,类比监督学习的例子(面积-售价,明确知道输出是金额;判断肿瘤良性还是恶性,也是明确知道结果会被分成两类)
    其中一种被称为聚类算法,比如将新闻分类(被分类在一块的新闻都描述同一件事),又或者在一段音频中把不同音源的声音区分开来.
    3.Others:Reinforcement learning......

    监督学习

    1.解决连续值问题(回归问题)
    预测连续值输出, 比如房子面积-房价关系走势

    2.离散值问题(分类问题)
    预测离散值输出,比如判断肿瘤是良性还是恶性

    离散值和连续值的区别在于连续值属于区间,比如数字区间[20,30]不可穷举,离散值则可以穷举,比如硬币正反面.其实这么说也有点微妙,比如在房间面积-房价这个例子中,房价是钱,一般精确到分,理论上房价也是可以穷举的,但是还是考虑成连续值而非离散值.

    第一个监督学习算法 -- 线性回归

    房屋面积-房价.png

    上图中x轴是房屋面积,y轴是房价,图中的点就是训练样本,我们的目的是预测房间面积对应的房价.
    对于线性回归算法来说,就是要找一个线性方程,通过该方程和输入可以求出目标值,对于上图线性方程将会是:

    h(x) = θ0 + θ1 * x
    其中h表示hypothesis,h(x)是房价,x是房屋面积.

    我们不希望h(x)看起来太过夸张,换而言之就是线性方程和训练样本拟合度越高越好,直觉上来说就是线性方程需要"均匀的穿过训练样本".但是靠直觉选取线性方程肯定不行,我们需要找到一个可量化的值来表示线性方程的拟合程度,这里引出一个新的概念--代价函数(Cost Function).

    Cost Function
    我们的目标是选取合适的θ0,θ1使得代价函数最小,这样h(x)和数据集的拟合度就最高.
    Cost Function有很多种,在这里我们从平方差的角度来量化.上图中m表示训练数据集规模.

    简化问题

    我们先把问题简化然后看个实际的例子:

    假设θ0 := 0
    则h(x) = θ1 * x
    则代价函数可以简化成J(\theta_1) = \frac{1}{2m}\sum_{i=1}^m(\theta_1x^{(i)} - y^{(i)})^2

    假设训练样本如下图,包含(1,1),(2,2),(3,3).此外还包含3个线性方程,按照斜率从大到小分别是
    1.h(x) = 2x,即θ1 := 2
    2.h(x) = 1
    x,即θ1 := 1
    3.h(x) = 0.5*x,即θ1 := 0.5

    训练样本和线性方程
    之后求J(2),J(1),J(0.5)的值,得出对应的J(θ1)函数图如下:
    J(θ1)
    从J(θ1)图可以看到,当θ1取1的时候,代价函数最小(0,与之对应的就是数据集和线性方程中斜率为1的线性方程),所以对于这个特定的训练样本,要想拟合度最高,θ1应该取1.

    回到最初的问题

    通过简化问题我们已经知道对于θ0:=0的情况,J(θ1)类似于一个一元二次函数,如果把θ0也考虑进去的话,图形将会是这样,因为对于每一组θ0, θ1都有一个J(θ0, θ1)与之对应.

    J(θ0, θ1)
    Gradient Descent(梯度下降算法)

    为了找到min(J(θ0, θ1)),我们引入Gradient Descent算法,通常该算法适用于已知J(θ0, θ1.....θN-1, θN),要求min(J(θ0, θ1.....θN-1, θN))的情况.
    梯度下降算法根据初始值的不同可能会得到不同的最优解(局部最优解),但是对于J(θ0, θ1)来说(如上图)局部最优解正是全局最优解

    Gradient Descent数学定义

    注意更新的方式应该如下
    temp0 := θ0 - LearningRate * Derivate
    temp1 := θ1 - LearningRate * Derivate
    θ0 := temp0
    θ1 := temp1
    而不是
    θ0 := θ0 - LearningRate * Derivate
    θ1 := θ1 - LearningRate * Derivate

    关于α(学习速率,learning rate),和导数项的理解,首先先简化问题,假设θ0:=0

    J(θ1)及导数项
    导数项就是函数在某一点切线的斜率,当斜率为负数时,梯度下降算法在不断递归中θ1在不断增加,从图上看就是当θ1<0时,θ1增加,直到J(θ1)=0,函数值收敛了.如果当斜率为正数时,梯度下降算法在不断递归中θ1在不断减少,从图上看就是当θ1>0时,θ1减少,直到J(θ1)=0,函数值也收敛了,符合直觉.这样一来学习速率也好理解了,学习速率越大,θ1的变化也就越大,反之亦然.
    需要注意的一点是,在梯度下降算法不断递归中,如果学习速率设置的过大可能导致错过最优解(如上图想象θ1在一次计算中直接从负数->正数,并且递归后所在点的斜率比递归前的大),这样会导致函数无法收敛,不过如果一切运行正常,越接近最优解导数项越来越小(趋近于0),you won't miss it.
    理解了梯度下降算法在J(θ1)上的工作原理之后,至少可以在直觉上理解该算法在J(θ0, θ1)图形上的工作原理.

    多元线性回归

    不同于之前提到的房屋的价格只和面积(x1)有关,实际情况中hθ(x)会更复杂,如下表格所示,房屋的价格可能与很多因素有关

    面积 卧室数量 楼层高度 房屋年龄 价格
    100 3 3 20 200w
    200 6 3 20 450w
    140 3 19 5 360w

    上面表格中,面积(x1)/卧室数量x(2)/楼层高度(x3)/房屋年龄(x4)被称为特征量.
    一般使用n表示特征量的个数,这个例子中n=4
    x(i)表示第i个训练样本的特征值组,
    x^{(1)}=\left[ \begin{matrix} 100 \\ 3 \\ 3 \\ 20 \end{matrix} \right]
    xj(i)表示第i个训练样本的第j个特征值,x1(1) = 100
    对于这种有多个特征值的情况,hθ(x)和单特征值是不一样的
    单元:hθ(x) = θ0 + θ1x1
    多元:hθ(x) = θ0 + θ1
    x1 + θ2x2 + ... + θnxn

    对于多元hθ(x),我们可以用矩阵来简化表示,在上面的例子中首先稍微修改下方程得到hθ(x)=θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4*x4,并且令X0=1
    那么我们可以得到特征值矩阵
    F=\left[ \begin{matrix} x0 \\ x1 \\ x2 \\ x3 \\ x4 \end{matrix} \right]
    参数矩阵
    P=\left[ \begin{matrix} theta0 \\ theta1 \\ theta2 \\ theta3 \\ theta4 \end{matrix} \right]
    那么hθ(x)=PT * F

    多元梯度下降算法

    之前介绍的对于代价函数J(θ0, θ1)的梯度下降算法可以表示为
    repeat until convergence{
    (for j in 0,1)
    \theta_j := \theta_j - \alpha\frac{\partial}{\partial\theta_j}J(\theta_0,\theta1)
    }
    那么对于多元代价函数J(θ0, θ1...θn)我们将θ0, θ1...θn看成一个一维向量θ则算法将变成
    repeat until convergence{
    (for j in 0....n)
    \theta_j := \theta_j - \alpha\frac{\partial}{\partial\theta_j}J(\theta)
    }
    上面公式翻译过来就是对每一个特征量(j in 0...n)分别求该特征量θj在函数J(θ)的偏导数(切线的斜率),并使用该斜率*学习速率作为变化量去更新θj,直到θj收敛.
    接下来我们在将这个偏导数展开,并带入代价函数可以得到:
    repeat until convergence{
    (for j in 0....n)
    \theta_j := \theta_j - \alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}
    }

    特征缩放

    特征缩放可以加速梯度下降函数的收敛.特征缩放是尽可能的让所有特征值处在近似的区间内,但是又不丢失这些特征量的数据特征.常用的特征缩放方法有以下两种:
    1.Rescaling
    x_i := \frac{x_i - min(x)}{max(x) - min(x)}
    Rescaling可以使特征值落在[0,1],[-1,1]这个区间内
    2.Mean Normalization
    x_i := \frac{x_i - avg(x)}{max(x) - min(x)}
    3.Feature scaling
    x_i := \frac{x_i}{max(x)}

    根据Andrew Ng的说法,特征值落在[-1,1]和[-1/3,1/3]之间都ok,超过这个值的话就不太妙了.
    特征缩放为什么可以使梯度下降算法收敛的更快

    如何判断梯度下降算法是否正常工作

    描绘一个以梯度下降算法迭代执行次数为X轴,代价函数的值为Y轴的函数图,如果随着迭代执行次数的增加,代价函数的值在不断减少,则说明梯度下降算法在正常工作.


    正常工作
    学习速率设置的过大

    学习速率α

    1.如果α太小,则梯度下降算法收敛的慢
    2.如果α过大则并不会随着每次迭代代价函数的值越小,也因此可能导致代价函数无法收敛(如上图所示).

    创造新的特征值

    假设h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2为计算房屋价格的函数,x1为房屋纵深(depth),x2为房屋宽度(frontage),那么创造一个新的特征值:
    area(房屋面积) = depth * frontage,则原函数可以转换为:
    h_\theta(x) = \theta_0 + \theta_1area
    有时候这样会得到更好的模型.

    构造hθ(x)去更好的拟合数据(Polynomial Regression)

    h_\theta(x)并不一定非要是线性函数,也可以是二次函数,三次函数或者平方根函数等等.
    要视不同的数据样本选择不同形式的函数,比如计算房价的例子,就不能够使用二次函数去拟合,因为大多数情况下房价不会像二次函数一样有下坠趋势,此时我们可以选择使用三次函数或者平方根函数的形式去更好的拟合数据
    原函数:h_\theta(x) = \theta_0 + \theta_1x_1
    二次函数:h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_1^2
    三次函数:h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_1^2 + \theta_3x_1^3
    平方根函数:h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2\sqrt{x_1}

    Normal Equation

    之前求J(\theta)最小时对应的\theta值,我们使用的是Gradient Descent算法,Normal Equation则是另一种求\theta值的办法.公式如下:
    \theta := (X^TX)^{-1}X^Ty
    其中X被称为designer matrix, y则是训练样本,具体如下:

    Normal Equation
    上述公式从直觉上来讲就是使的偏导数=0推导出来的.
    对比Normal Equation 和 Gradient Descent算法的优劣如下
    Normal Equation VS Gradient Descent
    根据Andrew Ng的说法,当特征值种类<=10000时,使用Normal Equation是可以接受的,当特征值种类>10000时,最好使用Gradient Descent.

    Non-Invertibility

    \theta := (X^TX)^{-1}X^Ty
    假如X^TX不可逆该怎么办?事实上这种情况发生的概率很小, 但并不代表不会发生.导致这种情况出现的原因有两个:
    1.特征值之间存在依赖关系
    比如x_1表示房屋面积(平方米),x_2表示房屋面积(平方英尺),因为1m=3.28feet,所以始终存在x_1 = (3.28)^2x_2,像这种(线性依赖关系)很容易导致X^TX不可逆.这种情况需要将特征值之间的依赖处理掉.
    2.特征值太多
    比如当m<=n的情况.对于这种情况要么想办法减少特征值的种类,要么使用regularization.
    如果使用octave的话使用pinv(pesudo invert)而不是inv方法来求你矩阵,这样即使X^TX不可逆,依然可以求出\theta的值.

    To Be Continued.. Stay tuned

    相关文章

      网友评论

          本文标题:Machine Learning - Andrew Ng 笔记

          本文链接:https://www.haomeiwen.com/subject/jtgjjctx.html