美文网首页
线性回归

线性回归

作者: SUNFC | 来源:发表于2017-05-04 17:23 被阅读238次

    链接:
    1. 线性回归总结
    2. 正则化
    3. 逻辑回归
    4. Boosting
    5. Adaboost算法


    一. 模型介绍

    线性回归简而言之就是在平面中用一条直线去拟合一些点数据,在三维空间中就是用一个平面去拟合三维中的数据,而我们要做的就是寻找出一条最佳的线段或者平面去拟合数据,当然高维情况类似去寻找超平面。
    初中的时候我们就学习过一元一次方程,那就是一个简单的拟合过程,只不过那个是完全可以拟合在一条线上,现在要做的是在有误差或者数据非线性排列的情况下,我们只能去尽力找出一条最佳的拟合线路:

    import numpy as np
    import matplotlib.pyplot as plt
    x = np.arange(1,10,2).reshape(-1,1)
    y = a*2 
    plt.plot(x,y,'r-',linewidth=2, label=u"线性拟合")
    plt.plot(x,y, 'bo')
    plt.show()
    
    完全拟合,二元一次方程组求解;(数据线性情况下)
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression
    
    x = np.arange(1,10,2).reshape(-1,1)
    y = a*2 + np.random.randn(5)
    linear_model = LinearRegression()
    linear_model.fit(x.reshape(-1, 1),y)
    y_pre = linear_model.predict(x)
    plt.plot(x,y_pre,'r-',linewidth=2, label=u"线性拟合")
    plt.plot(x,y, 'bo')
    plt.show()
    
    线性回归;寻找最佳的拟合线段;(数据非线性情况下)

    定义一下一些符号表达,我们通常习惯用X=(x1,x2,...,xn)T∈ℝn×p表示数据矩阵,其中xi∈ℝp表示一个p维度长的数据样本;y=(y1,y2,...,yn)T∈ℝn表示数据的label,这里只考虑每个样本一类的情况。

    线性回归的模型是这样的,对于一个样本xi,它的输出值是其特征的线性组合:

    线性表达式

    其中,w0称为截距,或者bias,通过设置X中X0=1,向量表达,简化了形式,因此实际上xi有p+1维度。
    线性回归的目标是用预测结果尽可能地拟合目标label,

    二. 损失函数

    从下图来直观理解一下线性回归优化的目标——图中线段距离(平方)的平均值,也就是最小化到分割面的距离和。


    三维中拟合后的情况

    这里我们要做的是在随机放置权值W的情况下不断的优化程式,以达到效果最佳的情况,这里的优化指的是尽量让各个点拟合在所求超平面,如果不能拟合,也要使得其距离超平面最近为好,也就是可以定义损失函数

    损失函数

    三. 求解过程

    由于上述损失函数图形如下,我们这里选用两种方式去求解


    J(θ)平面

    1. 矩阵满秩:###

    这种形式下我们可以通过求解导数为零的方式求解算法,可以直接得到最后的W权值.


    矩阵形式转换
    求解过程

    1. 矩阵不满秩:###

    当矩阵不满秩,无法求得上述的矩阵逆解,这里采用梯度下降法进行求解,梯度下降法通常分为三种形式:整体批次梯度下降法,随机梯度下降法和批量梯度下降法.
      梯度下降算法是一种求局部最优解的方法,对于F(x),在a点的梯度是F(x)增长最快的方向,那么它的相反方向则是该点下降最快的方向,具体参考wikipedia
       原理:将函数比作一座山,我们站在某个山坡上,往四周看,从哪个方向向下走一小步,能够下降的最快;注意:当变量之间大小相差很大时,应该先将他们做处理,使得他们的值在同一个范围,这样比较准确。
    1)首先对θ赋值,这个值可以是随机的,也可以让θ是一个全零的向量。
    2)改变θ的值,使得J(θ)按梯度下降的方向进行减少。
     描述一下梯度减少的过程,对于我们的函数J(θ)求偏导J:


    下图表达出解得最终结果与初始值相关:
    梯度下降方式

    在这里我们需要进行的是:


    迭代公式

    在批量梯度下降中,每一次参数更新都会遍历全部的训练数据{x1, y1}, {x2, y2}, ... , {xm,ym}对于线性回归问题,这种方法可以得到一个全局最优解,但是当样本数据量很大的时候,会非常耗时。

    多项式回归

    我们可以通过设计高阶特征在线性回归的基础上实现多项式回归。对于线性回归的hypothesis,



    令$ x2=x1^2, x3=x1^3 $,实现了一个3次多项式的回归:



    这也是用线性模型实现非线性的常用方法。这种方式能够拟合出非线性的超平面,有时候表现出很好的特性
    import numpy as np
    from sklearn.linear_model import LinearRegression
    from sklearn.preprocessing import PolynomialFeatures
    X_train = [[6], [8], [10], [14], [18]]
    y_train = [[7], [9], [13], [17.5], [18]]
    X_test = [[6], [8], [11], [16]]
    y_test = [[8], [12], [15], [18]]
    
    quadratic_featurizer = PolynomialFeatures(degree=2)
    X_train_quadratic = quadratic_featurizer.fit_transform(X_train)
    X_test_quadratic = quadratic_featurizer.transform(X_test)
    xx = np.linspace(0, 26, 100)
    regressor_quadratic = LinearRegression()
    regressor_quadratic.fit(X_train_quadratic, y_train)
    xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
    plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-')
    plt.show()
    
    多项式回归与一般线性回归对比

    线性回归代码地址

    参考:
    机器学习方法:回归(一):线性回归Linear regression
    机器学习-----线性回归浅谈(Linear Regression)
    Stanford机器学习笔记-1.线性回归
    线性回归

    相关文章

      网友评论

          本文标题:线性回归

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