蒋振飞的博客 - 机器学习01:线性回归   
正在加载蒋振飞的博客...
V3.0
蒋振飞的博客

机器学习01:线性回归

发布时间: 2018年09月26日 发布人: 蒋振飞 热度: 365 ℃ 评论数: 0

一、机器学习是什么

1.机器学习的定义

    Arthur Samuel:在进行特定编程的情况下,给予计算机学习能力的领域。
    Tom Mitchell:一个程序被认为能从经验E中学习,解决任务T,达到性能度量值P,当且仅当,有了经验E后,经过P评判,程序在处理T时的性能有所提升。

2.机器学习的目的

    机器学习的目的是建模隐藏的数据结构,然后做识别、预测、分类等。因此,机器学习是方法,模式识别是目的。只要跟决策有关系的都能叫 AI(人工智能),所以说 PR(模式识别)、DM(数据挖掘)、IR(信息检索) 属于 AI 的具 体应用应该没有问题。

3.监督学习

    监督学习这个想法是指,我们将教计算机如何去完成任务。
    用吴恩达老师所举的几个例子来理解一下。

    1) 预测房价
    前阵子,一个学生从波特兰俄勒冈州的研究所收集了一些房价的数据。你把这些数据画出来,看起来是这个样子:横轴表示房子的面积,单位是平方英尺,纵轴表示房价,单位是千美元。那基于这组数据,假如你有一个朋友,他有一套750平方英尺房子,现在他希望把房子卖掉,他想知道这房子能卖多少钱。

2d99281dfc992452c9d32e022ce71161.png

    应用学习算法,可以在这组数据中画一条直线,或者换句话说,拟合一条直线,根据这条线可以推测出,这套房子可能卖$150,000。这不是唯一的算法,可能还有更好的,比如不用直线拟合这些数据,用二次方程去拟合可能效果会更好。根据二次方程的曲线,这套房子能卖接近$200,000。
    监督学习指的就是给学习算法一个数据集,这个数据集由“正确答案”组成,利用线性回归推测一个连续值。

    2) 通过查看病历来推测乳腺癌良性与否
    假如有人检测出乳腺肿瘤,恶性肿瘤有害并且十分危险,而良性的肿瘤危害就没那么大,所以人们显然会很在意这个问题。

    4f80108ebbb6707d39b7a6da4d2a7a4e.png

    这个数据集中,横轴表示肿瘤的大小,纵轴上,标出1和0表示是或者不是恶性肿瘤。良性的肿瘤用 O 表示,恶性的用 X 表示。来预测肿瘤的恶性与否。所以很容易可以看出,结果是一个离散型变量。

    总结:可以看出监督学习就是数据集中的每个样本都有相应的“正确答案”,再根据这些样本作出预测,和房子和肿瘤的例子中做的一样。

4.无监督学习

    不同于监督学习的数据的样子,即无监督学习中没有任何的标签或者是有相同的标签或者就是没标签。所以对于已知数据集,却不知如何处理,也未告知每个数据点是什么。别的都不知道,就是一个数据集。针对数据集,无监督学习就能判断出数据有两个不同的聚集簇,所以叫做聚类算法。
    聚类应用的一个例子就是在谷歌新闻中。在news.google.com这个网址中去。谷歌新闻每天都在收集非常多的网络的新闻内容。它再将这些新闻分组,组成有关联的新闻。所以谷歌新闻做的就是搜索非常多的新闻事件,自动地把它们聚类到一起。

二、单变量线性回归(Linear Regression with One Variable)

1.模型表示

    还是以之前住房价格的数据集来表示,它被称作监督学习是因为对于每个数据来说,最终被贴上了价格的标记。根据数据来说,房子实际的价格是多少,更具体来说,这是一个回归问题。同时,还有另一种最常见的监督学习方式,叫做分类问题。当要预测离散的输出值,例如,之前提过的确定肿瘤是良性的还是恶性。更进一步来说,在监督学习中的数据集,常被称训练集。
    用小写的 m 来表示训练样本的数目。
    以之前的房屋交易问题为例,假使我们回归问题的训练集(Training Set)如下表所示:

44c68412e65e62686a96ad16f278571f.png

    m 代表训练集中实例的数量
    x 代表特征/输入变量
    y 代表目标变量/输出变量
    (x, y) 代表训练集中的实例
    (x(i), y(i)) 代表第 i 个观察实例
    h 代表学习算法的解决方案或函数也称为假设(hypothesis)

ad0718d6e5218be6e6fce9dc775a38e6.png

    这就是一个监督学习算法的工作方式,把训练集里房屋价格喂给学习算法,学习算法输出一个函数,通常表示为小写 h 表示。因此 h 根据输入的 x 值来得出 y 值,y 值对应房子的价格。因此,h 是一个从 x 到 y 的函数映射。一种可能的表达方式为因为只含有一个特征/输入变量,因此这样的问题叫作单变量线性回归问题。

2.代价函数

    在线性回归中有一个这样的训练集,m 代表了训练样本的数量,比如 m = 47 。而假设函数,是这样的线性函数形式现在要做的便是为模型选择合适的参数(parameters 和 在房价问题这个例子中便是直线的斜率和在 y 轴上的截距。选择的参数决定了得到的直线相对于训练集的准确程度,模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是建模误差(modeling error)
    现在的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。 即使得代价函数 最小,也就是训练集的残差平方和。

3.代价函数的直观理解

    代价函数的样子,等高线图,则可以看出在三维空间中存在一个使最小的点。

 0b789788fc15889fe33fb44818c40852.png

4.梯度下降

    梯度下降是一个用来求函数最小值的算法,使用梯度下降算法来求出代价函 的最小值。
    梯度下降背后的思想是:开始时随机选择一个参数的组计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合。持续这么做直到到到一个局部最小值(local minimum),因为并没有尝试完所有的参数组合,所以不能确定得到的局部最小值是否便是全局最小值(global minimum),选择不同的初始参数组合,可能会找到不同的局部最小值。    

db48c81304317847870d486ba5bb2015.jpg

    批量梯度下降(batch gradient descent)算法的公式为:

7da5a5f635b1eb552618556f1b4aac1a.png

    其中 a 是学习率(learning rate),它决定了让代价函数下降程度最大的方向向下迈出的步子有多大,在批量梯度下降中,每次都同时让所有的参数减去学习速率乘以代价函数的导数。
    在梯度下降算法中,还有一个更微妙的问题,梯度下降中,要更新
 ,当 j = 0 和 j = 1 时,会产生更新,所以这时将更新。实现梯度下降算法的微妙之处是,在这个表达式中,如果要更新这个等式,需要同时更新,也就是:  :=  ,并更新:= 

13176da01bb25128c91aca5476c9d464.png

    实现方法是:应该计算公式右边的部分,通过那一部分计算出的值,然后同时更新

5.梯度下降的直观理解

    如果 a 太小了,即学习速率太小,结果就是只能这样像小宝宝一样一点点地挪动,去努力接近最低点,这样就需要很多步才能到达最低点,所以如果 a 太小的话,可能会很慢,因为它会一点点挪动,它会需要很多步才能到达全局最低点。
    如果 a 太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来越远,所以,如果 a 太大,它会导致无法收敛,甚至发散。

6.梯度下降的线性回归

    梯度下降是很常用的算法,它不仅被用在线性回归上和线性回归模型、平方误差代价函数,还能将其应用于具体的拟合直线的线性回归算法里。    
    梯度下降算法和线性回归算法比较如图:

5eb364cc5732428c695e2aa90138b01b.png

    对之前的线性回归问题运用梯度下降法,关键在于求出代价函数的导数,即:

20184867.png

    则算法改写成:

479444.png

    “批量梯度下降”,指的是在梯度下降的每一步中,都用到了所有的训练样本。在梯度下降中,在计算微分求导项时,需要进行求和运算,所以,在每一个单独的梯度下降中,最终都要计算这样一个东西,这个项需要对所有 m 个训练样本求和。

三、多变量线性回归(Linear Regression with Multiple Variables)

1.多维特征

    探讨了单变量/特征的回归模型,现在对模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征

591785837c95bca369021efa14a8bb1c.png

    n 代表特征的数量,x(i) 代表第 i 个训练实例,是特征矩阵中的第行,是一个向量(vector)
    比如:

代表特征矩阵中第  行的第  个特征,也就是第  个训练实例的第  个特征。

    如上图的,如上图的,支持多变量的假设  表示为:

    这个公式中有个参数和个变量,为了使得公式能够简化一些,引入,则公式转化为:

    此时模型中的参数是一个维的向量,任何一个训练实例也都是维的向量,特征矩阵X的维度是 。 因此公式可以简化为:,其中上标代表矩阵转置。

2.多变量梯度下降

    与单变量线性回归类似,在多变量线性回归中,多变量也可以构建一个代价函数,则这个代价函数是所有建模误差的平方和,即: ,其中: ,

    目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。 多变量线性回归的批量梯度下降算法为:

41797ceb7293b838a3125ba945624cf6.png

    求导数后得到:

dd33179ceccbd8b0b59a5ae698847049.png

    当时, 

    我们开始随机选择一系列的参数值,计算所有的预测结果后,再给所有的参数一个新的值,如此循环直到收敛。
    代码示例:计算代价函数  其中:

    Python 代码:

def computeCost(X, y, theta):        
    inner = np.power(((X * theta.T) - y), 2)        
    return np.sum(inner) / (2 * len(X))

3.梯度下降法实践1-特征缩放

    在面对多维特征问题的时候,要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。
    以房价问题为例,假设使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。

966e5a9b00687678374b8221fdd33475.jpg

    解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间。

b8167ff0926046e112acf789dba98057.png

    最简单的方法是令:,其中 是平均值,是标准差。

4.梯度下降法实践2-学习率

    梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,不能提前预知,可以绘制迭代次数和代价函数的图表来观测算法在何时趋于收敛。

cd4e3df45c34f6a8e2bb7cd3a2849e6c.jpg

    

    也可以通过自动测试来判断是否收敛,例如将代价函数的变化值与某个阀值(例如0.001)进行比较但通常看上面这样的图表更好。
    梯度下降算法的每次迭代受到学习率的影响,如果学习率过小,则达到收敛所需的迭代次数会非常高;如果学习率过大,每次迭代可能不会减小代价函数,可能会越过局部最小值导致无法收敛。通常可以考虑尝试 a = 0.01,0.03,0.1,0.3,1,3,10

5.特征和多项式回归

    其实线性回归并不适用于所有数据,有时也可能需要曲线来适应的数据,比如一个二次方模型: 或者三次方模型,甚至更高。

3a47e15258012b06b34d4e05fb3af2cf_20180928123123_565.jpg

    通常先观察数据然后决定准备尝试怎样的模型。 另外,我们可以令:

,从而将模型转化为线性回归模型。根据函数图形特性,还可以使:

    或者:

    注:如果采用多项式回归模型,在运行梯度下降算法前,特征缩放非常有必要。

6.正规方程

    对于某些线性回归问题,正规方程方法是更好的解决方案,比如:

a47ec797d8a9c331e02ed90bca48a24b.png

    正规方程是通过求解下面的方程来找出使得代价函数最小的参数的: 。 假设训练集特征矩阵为 (包含了 )并且训练集结果为向量 ,则利用正规方程解出向量  。 上标T代表矩阵转置,上标-1 代表矩阵的逆。设矩阵,则: ,以下表示数据为例:

261a11d6bce6690121f26ee369b9e9d1.png

    运用正规方程方法求解参数

b62d24a1f709496a6d7c65f87464e911.jpg

    注:对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺为单位的尺寸和米为单位的尺寸两个特征,也有可能是特征数量大于训练集的数量),正规方程方法是不能用的。
    梯度下降与正规方程的比较

梯度下降正规方程
需要选择学习率不需要
需要多次迭代一次运算得出
当特征数量大时也能较好适用需要计算 如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为,通常来说当小于10000 时还是可以接受的
适用于各种类型的模型只适用于线性模型,不适合逻辑回归模型等其他模型

    只要特征变量的数目并不大,标准方程是一个很好的计算参数的替代方法。具体地说,只要特征变量数量小于一万,通常使用标准方程法,而不使用梯度下降法。
    正规方程的python实现:

 import numpy as np     
 
 def normalEqn(X, y):       
     theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等价于X.T.dot(X)       
     return theta

    最后,使用jupyter notebook工具实现线性回归实践案例:屋售价的线性回归预测

打赏 蒋振飞

取消

感谢您的支持,我会继续努力的!

扫码支持
一分也是爱     一块不嫌多

点击 支付宝 或 微信 打赏蒋振飞

打开支付宝扫一扫,即可进行扫码打赏哦

评论列表