• A-05 前向选择法和前向梯度法



    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    前向选择法和前向梯度法

    由于前向选择法和前向梯度法的实现原理涉及过多的矩阵运算,本文只给出两种算法的思路。两者实现都是把矩阵中的向量运算具体化成平面几何中的向量运算。

    一、前向选择法

    前向选择法是一种典型的贪心算法。

    通常用前向选择法解决线性模型的回归系数。对于一个有m个样本,每个样本有n个特征的训练集而言,假设可以拟合一个线性模型Y=ωTX,其中Ym1的向量,Xmn的矩阵,ωn1的向量。即可通过前向选择法求得最小化该模型的参数ω

    1.1 余弦相似度求投影

    首先把矩阵X看成nm1的向量Xi(i=1,2,,n),之后选择与向量Y余弦相似度最大,即与Y最为接近的一个变量Xi,然后用Xi逼近Y,即可得到

    Y^=Xiωi

    其中ωi=<Xi,Y>||Xi||2余弦相似度,其中<Xi,Y>=|Y|cosααXiY的夹角。

    上述公式因此可以认为Y^YXi上的投影。

    得到Y的接近值Y^后既可以得到残差值为Yerr=YY^,由于Y^是投影,则Y^Xi是正交的,因此可以以Yerr为新的变量,从剩下的Xi(i=1,2,i1,i+2,,n)中,选择一个新的最接近残差YerrXi重复上述投影和计算残差的流程,直至残差为0,停止算法。即可得到ω

    1.2 举例

    # 举例图例
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    %matplotlib inline
    font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
    

    # X1w1
    plt.annotate(xytext=(2, 5), xy=(8, 5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(6, 4.5, s='(X_1*omega_1)', color='g')
    # X2
    w2
    plt.annotate(xytext=(8, 5), xy=(9.3, 7.5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(9.3, 7, s='(X_2*omega_2)', color='g')
    # X1
    plt.annotate(xytext=(2, 5), xy=(4, 5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(2.5, 4.5, s='(X_1)', color='g')
    # X2
    plt.annotate(xytext=(2, 5), xy=(3, 7), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(2, 6, s='(X_2)', color='g')
    # X2
    plt.annotate(xytext=(8, 5), xy=(9, 7), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(8.2, 6.5, s='(X_2)', color='g')
    # Y
    plt.annotate(xytext=(2, 5), xy=(8, 8), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(5, 7.5, s='(Y)', color='g')
    #
    plt.annotate(xytext=(8, 5), xy=(8, 8), s='', color='r',
    arrowprops=dict(arrowstyle="-", color='gray'))
    plt.text(7.5, 6.5, s='(Y_1)', color='g')
    #
    plt.annotate(xytext=(8, 8), xy=(9.3, 7.5), s='',
    arrowprops=dict(arrowstyle="-", color='gray'))
    plt.text(8.5, 8, s='(Y_2)', color='g')

    plt.xlim(0, 11)
    plt.ylim(2, 10)
    plt.title('前向选择法举例', fontproperties=font, fontsize=20)
    plt.show()

    png

    上图假设X2维,首先可以看出,离Y最接近的是X1,因此画出YX1上的投影红线X1ω1,此时残差为灰线Y1。由于目前只剩下X2,所以接着用残差Y1X2上投影得到红线X2ω2,如果不只是X2,则选择最接近Y1Xi。此时的X1ω1+X2ω2则模拟了Y,即ω=[ω1,ω2]

    1.3 前向选择法优缺点

    1.3.1 优点

    1. 算法对每个Xi只做一次操作,速度快。

    1.3.2 缺点

    1. 由于变量Xi之间不是正交的,所以每次都必须做投影缩小残差,所以前向选择法最后只能给出一个局部近似解。(可以考虑下面的前向梯度法)

    二、前向梯度法

    前向梯度法类似于前向选择法,不同之处在于前向梯度法废除了前向选择法的投影逼近Y,取而代之的是在每次最接近Y的向量Xi的方向上移动一小步,并且向量Xi移动会不会被剔除,而是继续从Xi(i=1,2,i1,i,i+1,,n)中选择一个最接近残差Yerr(注:残差计算方式类似于前向选择法)的向量Xi,然后再走一小步,直至残差为0,停止算法,即可得到ω

    2.1 举例

    # 举例图例
    import matplotlib.pyplot as plt
    from matplotlib.font_manager import FontProperties
    %matplotlib inline
    font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
    

    # X1
    plt.annotate(xytext=(2, 5), xy=(3, 5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(2.4, 4.8, s='(epsilon{X_1})', color='g')
    # eX1
    plt.annotate(xytext=(2, 5), xy=(4, 5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(3.2, 4.8, s='(epsilon{X_1})', color='g')
    # eX1
    plt.annotate(xytext=(2, 5), xy=(5, 5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(4.2, 4.8, s='(epsilon{X_1})', color='g')
    # eX1
    plt.annotate(xytext=(2, 5), xy=(2.8, 5), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(1.9, 4.8, s='(X_1)', color='g')
    # eX1
    plt.annotate(xytext=(6.1, 6.2), xy=(7, 6.2), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(6.2, 6, s='(epsilon{X_1})', color='g')

    # ex2
    plt.annotate(xytext=(5, 5), xy=(6.2, 6.2), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='r'))
    plt.text(5.2, 5.8, s='(epsilon{X_2})', color='g')
    # X2
    plt.annotate(xytext=(2, 5), xy=(3, 6), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(2, 5.5, s='(X_2)', color='g')
    # X2
    plt.annotate(xytext=(5, 5), xy=(6, 6), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(5.6, 5.5, s='(X_2)', color='g')

    # Y
    plt.annotate(xytext=(2, 5), xy=(8, 7), s='', color='r',
    arrowprops=dict(arrowstyle="->", color='k'))
    plt.text(5, 6.2, s='(Y)', color='g')

    plt.annotate(xytext=(5, 5), xy=(8, 7), s='', color='r',
    arrowprops=dict(arrowstyle="-", color='gray'))

    plt.xlim(1, 9)
    plt.ylim(4, 8)
    plt.title('前向梯度法举例', fontproperties=font, fontsize=20)
    plt.show()

    png

    上图假设X2维,首先可以看出,离Y最接近的是X1,因此沿着向量Xi的方向走上一段距离,此处的ϵ是一个手动调整的超参数,走了一段距离后发现,离残差Yerr最近接的还是X1,因此继续接着走一段距离,直到走到离残差Yerr最近的为X2的时候,沿着向量X2的方向走上一段距离,发现此时残差YerrX1更近,则沿着X1走一段距离,直到走到最后残差为0,停止算法,即可得到ω

    2.2 前向梯度法优缺点

    2.2.1 优点

    1. 可以手动控制ϵ的大小,即可以控制算法的精准度,如果ϵ较小的时候算法精准度很高

    2.2.2 缺点

    1. ϵ小,算法精准度高,同时算法迭代次数增加;ϵ大,算法精准度降低。类似于梯度下降,这是前向梯度法较大的一个问题。(参考最小角回归法)
  • 相关阅读:
    xp+Eclipse+Android开发环境搭建
    ADT下载地址整理
    Iris Network Traffic Analyzer简易教程
    cadence实用技巧
    How to solve "drivers/ner/igbvf/igbvf.h:129:15: error: duplicate member ‘page’"
    Python–ToDay(01)python基本数据类型 二进制—>十六进制
    OpenStack认识
    新的一天,我只想静静
    linux学习第一阶段
    冒泡排序
  • 原文地址:https://www.cnblogs.com/abdm-989/p/14117965.html
Copyright © 2020-2023  润新知