zoukankan      html  css  js  c++  java
  • 第四周-线性回归

        凡事皆有因果关系,回归其实就是由因回溯果的过程,最终得到的因与果的关系,称之为回归。回归分析是在一系列的已知或能通过获取的自变量与因变量之间的相关关系的基础上,建立变量之间的回归方程,把回归方程作为算法模型,通过其来实现对新自变量得出因变量。、,因此回归分析是实用的预测模型或分类模型。回归模型分为单变量的简单回归与多变量的复杂回归,同时又因自变量因变量关系曲线的表现形式不同,各自区分线性回归及非线性回归。回归模型及算法的相关内容如下图,以下主要介绍线性模型部分。

    一. 线性回归概念

        回归与分类的不同就在于目标变量是连续型,用于连续型分布预测,针对的是数值型的样本。使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。回归的目的就是建立一个回归方程用来预测目标值,模型的求解就是求这个回归方程的回归系数,预测的方法很容易理解,回归系数乘以输入值再全部相加就得到了预测值。给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归。

    二.线性回归类别

    1.一元&多元线性回归

        假定预测值与样本特征间的函数关系是线性的,回归分析的任务,就在于根据样本X和Y的观察值,去估计函数h(x),寻求变量之间近似的函数关系。定义:

    其中,n = 特征数目;xj = 每个训练样本第j个特征的值,可以认为是特征向量中的第j个值。为了方便,记x0= 1,则多变量线性回归可以记为:

     (θ、x都表示(n+1,1)维列向量)

       多元和多次是两个不同的概念,“多元”指方程有多个参数,“多次”指的是方程中参数的最高次幂。多元线性方程是假设预测值y与样本所有特征值符合一个多元一次线性方程。当n即特征向量的个数为取值为一时,则为一元线性方程。

    2.广义线性回归

        广义的线性模型对应函数如下:

        

        wj是系数,w就是这个系数组成的向量,它影响着不同维度的Φj(x)在回归函数中的影响度,Φ(x)是可以换成不同的函数,这样的模型我们认为是广义线性模型,Φ(x)=x时就是多元线性回归模型。

    三.线性回归求解

        假设有连续型值标签的样本,有X={x1,x2,...,xn}个特征,回归就是求解回归系数θ=θ0, θ1,…,θn。目前有一些X和对应的Y,怎样才能找到θ呢?在回归方程里,求得特征对应的最佳回归系数的方法是最小化误差的平方和。这里的误差是指预测y值和真实y值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,所以采用平方误差即最小二乘法。平方误差可以表示如下:


       求解过程就转化为求一组θ值使求上式取到最小值,那么求解方法有梯度下降法、Normal Equation等等。梯度下降有如下特点:需要预先选定步长a、需要多次迭代、特征值需要Scaling(统一到同一个尺度范围)。因此比较复杂,还有一种不需要迭代的求解方式--Normal Equation,简单、方便、不需要Feature Scaling。Normal Equation方法中需要计算X的转置与逆矩阵,计算量很大,因此特征个数多时计算会很慢,只适用于特征个数小于100000时使用;当特征数量大于100000时使用梯度法。另外,当X不可逆时就可以考虑岭回归算法了。下面是常用的几种求解算法。

    1.梯度下降法(Gradient Descent)

       根据平方误差,定义该线性回归模型的损失函数为:

       

        线性回归的损失函数的值与回归系数θ的关系是碗状的,只有一个最小点。线性回归的求解过程如同Logistic回归,区别在于学习模型函数hθ(x)不同,梯度法的具体理论及推导会在下篇文章详细介绍。

    2,Normal Equation(也叫普通最小二乘法)

        Normal Equation算法基普通最小二乘法,给定输人矩阵X,如果XTX的逆存在并可以求得的话,就可以直接采用该方法求解。其求解理论也十分好理解,既然是是求最小误差平方和,另其导数为0即可得出回归系数。

     矩阵X为(m,n+1)矩阵,m表示样本数、n表示一个样本的特征数,y为(m,1)列向量。上述表达式中包含XTX, 也就是需要对矩阵求逆,因此这个方程只在逆矩阵存在的时候适用。然而,矩阵的逆可能并不存在,后面“岭回归”会讨论处理方法。

    3,局部加权线性回归

        线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果,所以有些方法允许在估计中存在一些偏差,从而降低预测的均方误差。局部加权线性回归(LocallyWeightedLinearRegression, LWLR )就是其中一种处理方式,在该算法中,我们给待预测点附近的每个点赋予一定的权重.于是公式变为:

    其中W是(m,m)矩阵,m表示样本数。LWLR使用“核”来对附近的点赋予更高的权重。核的类型可以自由选择,最常用的核就是高斯核,高斯核对应的权重如下:

    ,k需要优化选择,局部加权线性回归也存在一个问题,即增加了计算量,因为它对每个点做预测时都其中必须使用整个数据集,而不是计算出回归系数得到回归方程后代入计算即可。因此该算法不被推荐。

    4.岭回归(ridge regression)和缩减方法

        当数据的样本数比特征数还少时候,矩阵XTX的逆不能直接计算。即便当样本数比特征数多时,XTX 的逆仍有可能无法直接计算,这是因为特征有可能高度相关。这时可以考虑使用岭回归,因为当XTX 的逆不能计算时,它仍保证能求得回归参数。简单说来,岭回归就是对矩阵XTX进行适当的修正,变为(I是单位矩阵)从而使得矩阵非奇异,进而能对式子求逆。在这种情况下,回归系数的计算公式将变成:

     

        为了使用岭回归和缩减技术,首先需要对特征做标准化处理,使各特征值的取值尺度范围相同,从而保证各特征值的影响力是相同的。如何设置 λ 的值呢?通过选取不同的λ来重复上述测试过程,最终得到一个使预测误差最小的λ。可通过交叉验证获取最优值-,在测试数据上使误差平方和最小。岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加人偏差,从而得到更好的估计。事实上,上述公式是在最小平方误差和公式里引入了每个特征的惩罚因子得到,目的是是防止过度拟合,在损失函数里增加一个每个特征的惩罚因子,这就是线性回归的正则化。


    其中θ0是一个常数,x0=1是固定的,那么θ0不需要惩罚因子,岭回归公式中的I的第一个元素要为0。这里通过引入λ来限制了所有误差平方和,通过引人该惩罚项,能够减少不重要的参数,这个技术在统计学中也叫做缩减。缩减方法可以去掉不重要的参数,因此能更好地理解数据。此外,与简单的线性回归相比,缩减法能取得更好的预测效果,缩减法还可以看做是对一个数据模型的拟合采取了偏差、方差折中方案,增加偏差的同时减少方差。偏差方差折中是一个重要的概念,可以帮助我们理解现有模型并做出改进,从而得到更好的模型。岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。另一种很好的缩减法是lasso。lasso难以求解,但可以使用计算简便的逐步线性回归方法来求得近似结果。还有一些其他缩减方法,如lasso、LAR、PCA回归以及子集选择等。与岭回归一样,这些方法不仅可以提高预测精确率,而且可以解释回归系数。

     四.线性回归的Python实现

     1.简单线性回归

      直线拟合的模型方程为y=ax+b,其中a是直线斜率,b是直线截距。下面的数据,它们是从斜率为2、截距为-5 的直线中抽取的散点。

    %matplotlib inline
    import matplotlib.pyplot as plt
    import seaborn as sns;sns.set
    import numpy as np
    rng = np.random.RandomState(1)
    x = 10 * rng.rand(50)
    y = 2 * x - 5 + rng.randn(50)
    plt.scatter(x, y)
    

      

       用Scikit-Learn 的LinearRegression 评估器来拟合数据,并获得最佳拟合直线;

    from sklearn.linear_model import LinearRegression
    model = LinearRegression(fit_intercept=True)
    model.fit(x[:, np.newaxis], y)
    xfit = np.linspace(0, 10, 1000)
    yfit = model.predict(xfit[:, np.newaxis])
    plt.scatter(x, y)
    plt.plot(xfit, yfit);

      数据的斜率和截距都在模型的拟合参数中,Scikit-Learn 通常会在参数后面加一条下划线,即coef_ 和intercept_。

    print("Model slope:    ", model.coef_[0])
    print("Model intercept:", model.intercept_)
    #显示结果:Model slope:     2.02720881036    Model intercept: -4.99857708555

       可以看到,拟合结果与真实值非常接近。

       LinearRegression 评估器能做的可远不止这些——除了简单的直线拟合,它还可以处理多维度的线性回归模型:

       y=a0+a1x1+a2x2+⋯

       表达式中有多个x 变量,从几何学的角度看,这个模型是拟合三维空间中的一个平面,或者是为更高维度的数据点拟合一个超平面。   

    rng = np.random.RandomState(1)
    X = 10 * rng.rand(100, 3)
    y = 0.5 + np.dot(X, [1.5, -2., 1.])
    model.fit(X, y)
    print(model.intercept_)
    print(model.coef_)
    
    #显示结果0.5   [ 1.5 -2.   1. ]

    其中y 变量是由3个随机的x变量线性组合而成,线性回归模型还原了方程的系数。通过这种方式,就可以用一个LinearRegression 评估器拟合数据的回归直线、平面和超平面了。

    2.复杂线性回归

        通过基函数对原始数据进行变换,从而将变量间的线性回归模型转换为非线性回归模型。这个方法的多维模型是:y=a0+a1x1+a2x2+a3x3+⋯,其中一维的输入变量x转换成了三维变量x₁,x₂,x₃。让xn=fn(x),这里的fn(x)是转换数据的函数。假如fn(x)=xn,那么模型就会变成多项式回归:y=a0+a1x+a2x2+a3x3+⋯,需要注意的是,这个模型仍然是一个线性模型,也就是说系数an彼此不会相乘或相除。

       多项式投影非常有用,因此Scikit-Learn 内置了PolynomialFeatures 转换器实现这个功能。

    from sklearn.preprocessing import PolynomialFeatures
    x = np.array([2, 3, 4])
    poly = PolynomialFeatures(3, include_bias=False)
    poly.fit_transform(x[:, None])
    #显示结果array([[  2.,   4.,   8.],
                   [  3.,   9.,  27.],
                   [  4.,  16.,  64.]])

    转换器通过指数函数,将一维数组转换成了三维数组。这个新的高维数组之后可以放在多项式回归模型中。我们创建一个7 次多项式回归模型:

    from sklearn.pipeline import make_pipeline
    poly_model = make_pipeline(PolynomialFeatures(7),LinearRegression())
    rng = np.random.RandomState(1)
    x = 10 * rng.rand(50)
    y = np.sin(x) + 0.1 * rng.randn(50)
    poly_model.fit(x[:, np.newaxis], y)
    yfit = poly_model.predict(xfit[:, np.newaxis])
    plt.scatter(x, y)
    plt.plot(xfit, yfit);

        数据经过转换之后,我们就可以用线性模型来拟合x和y之间更复杂的关系了。通过运用7 次多项式基函数,这个线性模型可以对非线性数据拟合出极好的效果。

        以上是第四周的学习内容,留作之后回顾。 

  • 相关阅读:
    /etc/sysctl.conf 控制内核相关配置文件
    python 并发编程 非阻塞IO模型
    python 并发编程 多路复用IO模型
    python 并发编程 异步IO模型
    python 并发编程 阻塞IO模型
    python 并发编程 基于gevent模块 协程池 实现并发的套接字通信
    python 并发编程 基于gevent模块实现并发的套接字通信
    python 并发编程 io模型 目录
    python 并发编程 socket 服务端 客户端 阻塞io行为
    python 并发编程 IO模型介绍
  • 原文地址:https://www.cnblogs.com/mindy-snail/p/12555135.html
Copyright © 2011-2022 走看看