zoukankan      html  css  js  c++  java
  • 从原理到代码之线性模型

    转载请注明原文链接,谢谢啦!


    0. 前言

    凡谈机器学习,开山之作必是线性模型。何故?线性是数学表征中最为简单的一种,从而线性模型简单、高效,除了用于初步探索数据分布之外,更是建立机器学习模型中的首选,因为越是简单的模型,泛化性越高,大道至简,所言不虚。本文从数学原理到代码实现,希望能够尽可能的深扒线性模型。

    1. 背景引入

    机器学习模型中有用于回归的,有用于分类的,二者区别:回归预测的指标值为连续值,分类预测的类别值为离散值。可以用如下例子做一个形象解释:

    回归问题:根据父母双方的身高,预测孩子的身高(预测值Υ为连续值)

    样本编号      父亲身高(cm)(Χ1) 母亲身高(cm)(Χ2) 孩子身高(cm)(Υ)
    0 175.4 163.2 174.7
    1 168.2 170.8 182.8
    2 170.5 155.6 168.3

    分类问题:根据适龄男青年的条件(“是/有”用“1”表示,“否/无”用“0”表示),预测有无女朋友(预测值Υ为离散值)

    样本编号      身高(cm)(Χ1) 颜值(满分10分)(Χ2) 财富(万RMB)(Χ3) 是否从事IT行业(Χ4) 有无女朋友(Υ)
    0 174.5 8 40 1 0
    1 162.5 4 4000 0 1
    2 188.3 7 30 0 0
    3 176.8 6 80 1 1

    按照上述表格,每一行是一个样本,每一列是一维特征。线性模型既可以用于回归问题,又可以用于分类问题,其本质是找到与特征x1,x2等对应的权重参数Θ1,Θ2等,之后进行线性组合,即建立如下数学表达式(其中Θ0为偏置项),从而预测y值。权重参数表征每个特征在预测中的重要性。

    2. 概述

    给定样本,我们用列向量表示该样本

    样本有n种特征,我们用x(i)表示样本的第i个特征。线性模型的形式为:

    其中:

    称为权重向量,其中每个分量是每个特征对应的权重,直观地表达了各个特征在预测中的重要性。

    “线性”本质是一系列一次特征的线性组合,在二维空间中是一条直线,在三维空间中是一个平面,推广至n维空间,可以理解为广义线性模型,常见的包括岭回归、lasso回归、Elastic Net、逻辑回归、线性判别分析等。

    3. 原理

    3.1 普通线性回归

    给定数据集

    其中:

    我们需要学习的模型为:

    ( 模型具体计算过程说明:参数向量的转置与某个样本列向量相乘,或者用样本列项量的转置与参数向量相乘,之后在加上偏置b,得到预测值)

    即:根据已知的数据集T来计算参数 

    在很多讲解机器学习的教程中,这一步就直接给出用平方损失函数作为模型优化目标,如下所示:

    给定样本:

    其预测值为:

    在训练集T上,模型的损失函数为:

    我们的目标是损失函数最小化,即:

    然后就使用梯度下降法求解上述最优化问题的数值解。(有关梯度下降法,参见第4节)

    我们在这里就要深扒一下,为什么使用平方损失函数,在数学基础上找到使用平方损失函数的依据。

    对于每个样本有如下误差分析:

    参数向量的转置在上文“ 模型具体计算过程说明”中已介绍;此外,我们为了方便计算,我们可以把偏置当作一个特殊权重,且每一个样本在这一维上的特征值都为1,故上式可以简化为:

    其中,在概率统计学中,绝大多数的误差可以看作是独立并且具有相同分布,并且服从均值为0,方差σ2的高斯分布,则有:

    从而可以得到:

    这样,我们对于样本集中的所有样本,就可以得到似然函数,即:

    似然可以解释为:我们取什么样的参数与样本进行组合之后,得到的恰好是真实值。而上式就是这种情况在样本集上的概率函数。因为假设每个样本之间是不相关的,即独立同分布,所以我们需要把每个样本此情况下的概率函数累乘。

    根据我们的模型预期,我们当然希望这种情况的概率越大越好。也就是说,能使出现这种情况的概率最大的参数向量,就是我们所要求得的参数估计值。这在数学上叫作“最大似然估计”。在概率学中,似然本质上是条件概率。(这里需要理解透彻,后续章节会讲到GMM(混合高斯模型)中,涉及到参数先验、后验、以及似然之间的关系,会进一步详细解释。)

    因为计算机系统处理加法要比处理乘法容易得多,所以我们很有必要将似然通过对数乘法法则,转换为对数似然,即有:

    我们对上式的对数似然进行化简,可以得到:

    我们预期目标是似然函数越大越好,即对数似然也越大越好,因为对于一个模型来说,样本数、误差的标准差、圆周率都是常数,则对于上式的因子:

    应该越小越好。

    可以看到,在这里,我们在数学中找到了“用平方损失函数作为模型优化目标”依据,其数学本质上是参数估计方法中的“最大似然估计”。

    如果对于一个机器学习模型,我们知道了参数优化目标,似乎我们就可以利用梯度下降方法求解参数估计值了,但是我们在这里还是再深扒一步,因为对于线性模型的优化目标来说,较为简单,在数学中是可以直接用最小二乘法求解解析解,该问题称为多元线性回归。

    我们的目标是损失函数最小化,即:

    令:

    则有:

    令:

    则:

    令:

    求它的极小值(PS:其中涉及到机器学习领域中有关矩阵运算和求导法则,随后会上传一份资源,以便大家学习使用),对

    求导,并令导数为零,得到解析解:

    a. 当

    为满秩矩阵或者正定矩阵时,可得:

    于是学到的多元线性回归模型为:

    b. 当

    不是满秩矩阵时:比如N<n(样本数量小于特征种类的数量),根据

    的秩小于等于(N,n)中的最小值,即小于等于N(矩阵的秩一定小于等于矩阵的行数和列数);因为两矩阵相乘得到的矩阵,它的秩是小于等于两个因子矩阵的秩的最小值(即,若C=AB,则R(C)<=min(R(A),R(B)。)

    而矩阵

    是n*n大小的,它的秩一定小于等于N,因此它不是满秩矩阵。此时存在多个解析解。常见的做法是引入L1或L2正则项。以L2正则化为例:

    其中λ>0调整正则化项与均方误差的比例;||...||2为L2范数。

    根据上述原理,我们得到多元线性回归算法:

    输入:

    数据集T,正则化项系数λ>0

    输出:

    算法步骤:

    a. 令:

    计算:

    b. 求解:

    c. 最终学得模型:

    3.2 广义线性模型

    考虑单调可导函数h(),令:

    这样得到的模型称为广义线性模型。一个典型的例子就是对数线性回归,即当h(•)=ln(•)时的广义线性模型就是对数线性回归,即:

    它是通过

    拟合y的。它虽然称为广义线性回归,但实质上是非线性的。

    3.3 逻辑回归

    上述均是用线性模型进行回归学习,而线性模型也可用于分类,逻辑回归就是利用线性模型进行分类的一种算法。

    给定数据集T:

    其中:

    我们需要知道

    该条件概率是:在已知测试样本的特征向量后,预测其为相应类的条件概率值。

     考虑到

     

    取值是连续的,因此它不能拟合离散变量。但是可以考虑用它来拟合条件概率

    因为概率的取值也是连续的。要拟合概率,其取值范围为0~1,考虑采用广义线性模型,寻找到一个单调可导函数:对数概率函数(logistic function):

     由于

    则有:

    比值

    表示样本为正例的可能性比反例的可能性,称为概率(odds),反映了样本作为正例的相对可能性。概率的对数称为对数概率(log odds,也称为logit)。

    逻辑回归模型参数估计,估计原理是极大似然估计法估计模型参数:

    将参数b吸收,令:

    则似然函数为:

    对数似然函数为:

    又由于

    因此:

    求极大值,

    得到

    的估计值

    则逻辑回归模型为:

    通常用梯度下降法或者拟牛顿法(后续章节会讲到)来求解该最大值问题。

    以上讨论都是二类分类的逻辑回归模型,可将此推广到多类分类逻辑回归模型。设离散型随机变量 Y 的取值集合为:{1,2,...,K},则多分类逻辑回归模型为:

    其参数估计方法类似二类分类逻辑回归模型。

    3.4 线性判别分析

    似二类分

    4. 梯度下降 

    4.1 

    5. 代码实现

    6. sklearn代码实现

    7. 补充

  • 相关阅读:
    python处理字符串类型的公式并计算结果
    Python之sklearn学习
    查看python安装的包
    Qt配置Qwt
    Qt开启C++线程里并访问界面
    Matlab的nargin、nargout
    sql获取行数
    C++/QT打印当前行文件名和行数
    QString::number保留小数
    Qt:setGeometry: Unable to set geometry 2170x1017+0+23 on QWidgetWindow/'MainWindowWindow
  • 原文地址:https://www.cnblogs.com/CodeAsPoetry/p/8117179.html
Copyright © 2011-2022 走看看