`
weishiym
  • 浏览: 33413 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

机器学习基础 第二章 预测算法

 
阅读更多

1 一元线性回归

1.1 为什么用回归

 

 

 

这里写图片描述
图1.1.1 Google的票房与搜索量的关系

图1.1显示的是Google发布的电影的搜索量与票房的关系。如何用历史的信息预测票房就是(线性)回归问题。

1.2 一元线性回归模型

1 数学描述

1.1.1{xi,yi}图1.1.1中的横、纵轴分别用用{xi,yi}表示,1iN1.1使线1≤i≤N。假设图1.1中使用的一元线性模型的形式为:

 

 
t=ω0+ω1x1.21t=ω0+ω1x−−−−−(1.2−1)

 

ω0,ω1线ω0,ω1显然只要求出ω0,ω1线性模型就可以确定了。为了求解系数ω0,ω1需要构造一个目标函数(损失函数),如下

 

 
E(ω0,ω1)=12i=1N(tiyi)2=12i=1N(ω0+ω1xiyi)21.22E(ω0,ω1)=12∑i=1N(ti−yi)2=12∑i=1N(ω0+ω1xi−yi)2−−−−−(1.2−2)

 

只要最小化式(1.2-2),就可以求出系数a,ba,b。这种做法非常直观,就是要使预测的结果和真值之间的差最小。

 


这里写图片描述 
1.2.1E(ω0,ω1)图1.2.1E(ω0,ω1)函数的几何解释

 

E(ω0,ω1)E(ω0,ω1)是一个非负值,最小值为0,它的几何解释如图1.2.1,就是要使yn,tnyn,tn的距离平方和最小,回归函数要穿过真实数据ynyn

2 矩阵表示

对于N各数据点,式(1.2-1)有N个等式,并用线性代数表示为

 

 
t1tN=ω0+ω1x1ω0+ω1xN=Xω1.23[t1⋮tN]=[ω0+ω1x1⋮ω0+ω1xN]=Xω−−−−−(1.2−3)

 

其中X=[XT1  XTN ]X=[X1T ⋮ XNT ]Xi=[1,xi]TXi=[1,xi]Tω=[ω0,ω1]Tω=[ω0,ω1]T

此时

 

 
t1y1tNyN=ω0+ω1x1y1ω0+ω1xNy1=XωY1.24[t1−y1⋮tN−yN]=[ω0+ω1x1−y1⋮ω0+ω1xN−y1]=Xω−Y−−−−−−(1.2−4)

 

其中Y=y1yNY=[y1⋮yN]

所以式(1.2.2)又可以表示为

 

 
E(ω0,ω1)=12 (XωY)T(XωY)=ωTXTXωωTXTYYTXω+YTY1.25E(ω0,ω1)=12 (Xω−Y)T(Xω−Y)=ωTXTXω−ωTXTY−YTXω+YTY−−−−−(1.2−5)

 

zϵRnzTz=iz2i【因为,对于zϵRn,zTz=∑izi2】

3 目标函数最小化

在高等数学中,使函数一阶导数为0,且二阶导数要大于0的点为函数的最小值点。式(1.2-5)所表示的是二次函数且开口向上,只要求一阶导数为0即可

 

 
E(ω0,ω1)ω=XTXωXTY=01.26∂E(ω0,ω1)∂ω=XTXω−XTY=0−−−−−−(1.2−6)

 

【矩阵求导: (XTAX)X=AX+ATX ∂(XTAX)∂X=AX+ATX(XTA)X=A∂(XTA)∂X=A(AX)X=AT∂(AX)∂X=ATE(ω0,ω1)ω=(ωTXTXω)ω(ωTXTY)ω(YTXω)ω∂E(ω0,ω1)∂ω=∂(ωTXTXω)∂ω−∂(ωTXTY)∂ω−∂(YTXω)∂ω,设第一项中XTX=AXTX=A,第二项中XTY=BXTY=B,第三项中YTX=CYTX=C,所以E(ω0,ω1)ω=[XTXω+(XTX)Tω]XTY(YTX)T∂E(ω0,ω1)∂ω=[XTXω+(XTX)Tω]−XTY−(YTX)T,所以,E(ω0,ω1)ω=2XTXω2XTY∂E(ω0,ω1)∂ω=2XTXω−2XTY

1 详细推导

 
(XTAX)X∂(XTAX)∂X

 

 

 
XTAX=i=1Nj=1NAijXiXjXTAX=∑i=1N∑j=1NAijXiXj

 

 
(XTAX)Xk=Xki=1Nj=1NAijXiXj=i=1NAikXi+j=1NAkjXj=ATX+AX∂(XTAX)∂Xk=∂∂Xk∑i=1N∑j=1NAijXiXj=∑i=1NAikXi+∑j=1NAkjXj=ATX+AX

 

2 详细推导 (AX)X∂(AX)∂X

AXAXn×1n×1维的,第ii个元素为

 

 
[AX]i=j=1NAijXj[AX]i=∑j=1NAijXj

 

 

 
AX=[j=1NA1jXj,j=1NA2jXj,,j=1NAnjXj]AX=[∑j=1NA1jXj,∑j=1NA2jXj,⋯,∑j=1NAnjXj]

 

 

 
(AX)X=[Nj=1A1jXjX,Nj=1A2jXjX,,Nj=1AnjXjX]∂(AX)∂X=[∂∑j=1NA1jXj∂X,∂∑j=1NA2jXj∂X,⋯,∂∑j=1NAnjXj∂X]

 

 

 
Nj=1AkjXjX=Ak1Ak2AkN∂∑j=1NAkjXj∂X=[Ak1Ak2⋮AkN]

 

所以线性模型所对应的最优参数ωω表示如下,也称为正则解或者闭形式解

 

 
ω=(XTX)1XTY1.27ω=(XTX)−1XTY−−−−−(1.2−7)

 

一个简单的例子,代码见文件夹1_regression。 
第一步:用synthic_data.py中的linearSamples方法生成数据

import numpy as np
import random
def linearSamples(n = 20):
    a = 0.5
    b = 1.0
    r = [i + 2.0*random.random() for i in xrange(n)]
    return [range(0, len(r)), r]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

第二步:用linear_regression.py中的lR方法,完成式(1.2-7),最终的结果为ωω的值

def lR(x, y):
    x = np.matrix(x)
    if x.shape[0] == 1:
        x = x.transpose()
    y = np.matrix(y)
    if y.shape[0] == 1:
        y = y.transpose()
    one = np.ones((x.shape[0], 1))
    x = np.hstack([one, x])
    w = inv((x.transpose()).dot(x)).dot(np.transpose(x)).dot(y)
    return w
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

第三步:将第二步中计算的ωω和第一步中生成的数据,传递给plotLM方法,画出的数据点和回归直线如图1.2.2

def plotLM(w, x,y):
    xx = [i for i in np.arange(0.0,20.0,0.5)]
    yy = [w[0,0] + w[1,0] * i for i in xx]
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(x,y, '.')
    ax.plot(xx,yy)
    s = 'y = %s + %s * x' %(str(w[0,0])[0:7], str(w[1, 0])[0:7])
    ax.annotate(s, xy=(12.5, 13.3),  xycoords='data',
                xytext=(-180, 30), textcoords='offset points',
                bbox=dict(boxstyle="round", fc="0.8"),
                arrowprops=dict(arrowstyle="->",                             connectionstyle="angle,angleA=0,angleB=90,rad=10"))
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend(('training sampes','regression line'))
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

 


这里写图片描述 
图1.2.2 线性回归的例子

 

在图1.2.2中散点代表的是训练数据,训练数据是由程序随机生成,没有实际意义,直线是回归直线,并标出了直线方程,在运行程序时直线结果可能与图中的结果稍有不同,因为训练数据是随机生成的缘故。

2 最优化方法-梯度下降法

在第一节的第3部分介绍了,将损失函数表示成矩阵形式,然后求导方法,求出最优的ww,这种方法对线性问题可以求出最优解,称为闭形式解或者解析解。本节介绍的梯度下降法是数值最优化方法,普适性更强,对于非线性问题依然可以求解。

梯度下降法是最常用、也是最容易理解的最优化方法。学会了梯度下降法,其它基于梯度的改进方法:共轭梯度法、牛顿法、拟牛顿法等,就比较容易理解。

1 盲人是如何下山的

第一步:左踩一脚,右踩一脚,如果发现这两脚在在高度上没有差别,此时他所面对的应该是山顶或者山脚,反之盲人面对的应该是山脊。(计算偏导数)

第二步:上踩一脚,下踩一脚,脚低的那个方向就对着山脚。(计算偏导数)

第三步:四个脚中,高度最低的那个方向就是山脚,从当前位置向下夸一小步,向着山脚进发。(确定步长,学习率)

重复第一、二、三步,直到山脚。

2 梯度下降法

梯度法就和盲人下山类似,就两个步骤:首先确定下山方,然后再确定的方向上按照一定的步长下山

下面介绍最优化问题。

单目标、无约束、多维最优化问题的数学描述:

 

 
minxf(x)minxf(x)

 

其中,xRNx∈RN

梯度下降法算法流程如下:

1)给定初值x(0)x(0),精度ε>ε>0,并令k=1k=1

2)v(k)=f(x(k))f(x(k))f(x)x(k)计算梯度下降方向(搜索方向)v(k)=−∇f(x(k)),∇f(x(k))表示f(x)在x(k)处的梯度

f(x(k))∇f(x(k))所表示的是数值梯度,求法如下:

 

 
f(x(k))=g1gN∇f(x(k))=[g1⋮gN]

 

 

 
gi=f(x(k)1,,x(k)i+,,x(k)N)f(x(k)1,,x(k)i,,x(k)N)(x(k)i+)x(k)igi=f(x1(k),⋯,xi(k)+,⋯,xN(k))−f(x1(k),⋯,xi(k),⋯,xN(k))(xi(k)+)−xi(k)

 

其中,=0.000001=0.000001

3)若v(k)ε|v(k)|≤ε,则停止计算,否则从x(k)x(k)出发,沿着v(k)v(k)一维搜索,即求λkλk,使的f(x(k)+λkv(k))=minλ>0f(x(k)+λkv)f(x(k)+λkv(k))=minλ>0f(x(k)+λkv),此处的一维搜索可以用黄金分割法或者二次差值法等。

4)令x(k+1)=x(k)+λkv(k)x(k+1)=x(k)+λkv(k)k=k+1k=k+1,转2)。

3 基于梯度下降法的线性回归

下面用用梯度下降法,优化目标函数:式(1.2.2),并给出相应的代码解释

第一步:依然使用linearSamples生成数据,代码见前文 
第二步:完成目标函数的定义,即式(1.2-2)

def obj(x, y, w):
    t = x.dot(w) - y
    t = np.multiply(t, t)
    sum_ = 0.5 * np.sum(t)
    return sum_
  • 1
  • 2
  • 3
  • 4
  • 5

第三步:完成数值梯度的定义,按照梯度下降法中的第2)点介绍,完成代码编写

def gradient(fun, x, y, w, delta = 1e-6, *args):
    l = len(w)
    g = []
    for i in range(0, l):
        delta_w = deepcopy(w)
        delta_w[i] = delta_w[i] + delta
        g.append(-(obj(x, y, delta_w) - obj(x, y, w))/delta)
    return g
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

第四步:gdLR方法将实现,梯度下降法中介绍的流程1),2),4),忽略了第三步,其中的学习率由手动调整。计算结束后返回最优的ωω

def gdLR(fun, x, y, step = 0.0007,tol = 1e-6):
    #preprocess the data
    x = np.matrix(x)
    if x.shape[0] == 1:
        x = x.transpose()
    y = np.matrix(y)
    if y.shape[0] == 1:
        y = y.transpose()
    one = np.ones((x.shape[0], 1))
    x = np.hstack([one, x])
    w = [0.0, 0.0]
    w = np.matrix(w)
    if w.shape[0] == 1:
        w = w.transpose()
    l = len(w)
    k = 1
    while(True):
        step1 = step / k
        #1)compute negative gradient
        g = gradient(fun, x, y, w)
        err = linalg.norm(g)
        print err
        if err < tol or k > 200:
            break
        #2)updata the parameters
        w = [w[i,0] + step * g[i] for i in range(0, l)]
        w = np.matrix(w).transpose()
        k = k + 1
    return w
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

第五步:将闭形式的ωω和梯度下降法的ωω,以及数据x,y传递给方法plotGdLM画出对比图,见图2.1。

def plotGdLM(cf_w,gd_w, x,y):
    xx = [i for i in np.arange(0.0,20.0,0.5)]
    cf_yy = [cf_w[0,0] + cf_w[1,0] * i for i in xx]
    gd_yy = [gd_w[0,0] + gd_w[1,0] * i for i in xx]

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(x,y, '.')
    ax.plot(xx,cf_yy,color = 'g', linewidth=3)
    s = 'y = %s + %s * x' %(str(cf_w[0,0])[0:7], str(cf_w[1, 0])[0:7])
    ax.annotate(s, xy=(12.5, 13.3),  xycoords='data',
                xytext=(-180, 30), textcoords='offset points',
                bbox=dict(boxstyle="round", fc='g', ec='g'),
                arrowprops=dict(arrowstyle="->",fc='g', ec='g',
                                connectionstyle="angle,angleA=0,angleB=90,rad=10"))
    ax.plot(xx,gd_yy, color = 'r', linewidth=3)
    s = 'y = %s + %s * x' %(str(gd_w[0,0])[0:7], str(gd_w[1, 0])[0:7])
    ax.annotate(s, xy=(8.5, 9.3),  xycoords='data',
                xytext=(-180, 30), textcoords='offset points',
                bbox=dict(boxstyle="round",  fc='r', ec='r'),
                arrowprops=dict(arrowstyle="->", fc='r', ec='r',
                                connectionstyle="angle,angleA=0,angleB=90,rad=10"))
    plt.xlabel('x')
    plt.ylabel('y')
    plt.legend(('training sampes', 'closed-form regression','gradient descent regression'),loc='upper center')
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

 


这里写图片描述 
图2.1 解析解与梯度下降法解的对比图

 

3 基函数

3.1 多项式回归

如果有如图2.1的数据,依然采用式(1.2-1)的模型,则回归模型如图2.2。从图2.2中可以看出,用式(1.2-1)所表示的模型无法拟合这种带多个峰的数据。一个很直观的想法是增加式(1.2-1)中的项数,用多项式拟合这种多个峰的数据

 

 
t=ω0+ω1x+ω2x2+ω3x3+3.11t=ω0+ω1x+ω2x2+ω3x3+⋯−−−−−(3.1−1)


式(3.1)写成矩阵形式为

 

 

 
t=[ω0,ω1,,ωK]1xxK3.12t=[ω0,ω1,⋯,ωK][1x⋮xK]−−−−−(3.1−2)

 

按照1.2节中的方法,也可以得到

 
ω=[ω0,ω1,,ωK]ω=[ω0,ω1,⋯,ωK]

的解,这里就不做详细推导,直接给出结论:

 

 

 
ω=(X¯TX¯)1X¯TY3.13ω=(X¯TX¯)−1X¯TY−−−−−(3.1−3)

 

为了与式(1.2-7)加以区别,用X¯代替了式(1.2-7)中的XX,这里的X¯表示为如下形式

 

 
X¯=111x1x2xNx21xK1x22xK2x2NxKN3.14X¯=[1x1x12⋯x1K1x2x22⋯x2K⋮1⋮xN⋮⋯⋮xN2⋯xNK]−−−−−(3.1−4)

 

其中,KK为多项式中自变量的最高次数。

 


这里写图片描述 
图3.1.1 x+0.3sin(2pix)x+0.3∗sin(2∗pi∗x)加上随机噪声的数据

 

 


这里写图片描述 
图3.1.2 按照式(3.1-3),分别用3、5、10、12阶多项式拟合数据,结果如图2.3。图(d)中的拟合曲线的末端上翘与数据不吻合了。这是过拟合导致的。过拟合问题将会在下一节中介绍。

 

实现图3.1.3的代码如下:

第一步:生成x+0.3sin(2pix)x+0.3∗sin(2∗pi∗x)样本的代码

def nlSamples(n = 100):
    t = np.arange(0, 1.0, 1.0 / n)
    y = [ti + 0.3 * math.sin(2 * math.pi * ti)+random.random()*0.01  for ti in t]
    t = list(t)
    return [t, y]
  • 1
  • 2
  • 3
  • 4
  • 5

第二步:按照式(3.1-3)计算模型的参数ωω

def bFLR(x, y, rank = 2):
    x = np.matrix(x)
    if x.shape[0] == 1:
        x = x.transpose()
    y = np.matrix(y)
    if y.shape[0] == 1:
        y = y.transpose()
    one = np.ones((x.shape[0], 1))
    tmp = np.zeros((x.shape[0], rank))
    for i in xrange(rank):
        tmp[:,i] = np.power(x.A, i + 1).transpose()
    xx = np.hstack([one, tmp])
    w = inv((xx.transpose()).dot(xx)).dot(np.transpose(xx)).dot(y)
    return w
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

第三步:用第三步中的参数ωω画出拟合的

def plotBFLR(w, x, y, rank = 2):
    xx = [i for i in np.arange(0.0,1.0,1.0/20)]
    w = w.A.transpose()
    yy = [w.dot(xlist(i, rank))[0,0] for i in xx]
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(x,y, 'ro')
    ax.plot(xx,yy)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title(str(rank) + ' order regression')
    plt.legend(('training sampes','regression line'))
plt.show()
def xlist(i, rank):
    l = [np.power(i ,ii) for ii in xrange(rank+1)]
    l = np.array([l]).transpose()
    return l
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

 


这里写图片描述 
图3.1.3 多项式拟合结果

 

3.2 回归模型中的基函数

式(3.1-1)更一般化的表示为 

 
t=ω0+j=1K1ωjϕj(x)3.21t=ω0+∑j=1K−1ωjϕj(x)−−−−−(3.2−1)

 

其中的 ϕj(x)ϕj(x) 称为基函数,引入基函数是为了对数据进行非线性变换,以解决非线性问题。

多项式回归中的 x,x2,,xKx,x2,⋯,xK 都可看成是基函数。

其它形式的常用基函数有:高斯基函数,逻辑蒂斯基函数,它们的表达式分别如下

高斯基函数: 

 
ϕj(x)=exp((xμj)22s2)3.22ϕj(x)=exp⁡(−(x−μj)22s2)−−−−(3.2−2)

 

其中,μjμj 控制着基函数的位置,ss控制着基函数的形状。

 

 
ϕj(x)=σ(xμjs)3.22ϕj(x)=σ(x−μjs)−−−−−(3.2−2)

 

其中 σ(a)=11+exp(a)σ(a)=11+exp(−a)

4 欠拟合与过拟合

4.1 欠拟合

忽略严格的数学定义,从一般的直观理解欠拟合,概念如下。

欠拟合:模型过于简单,无法捕获数据中所存在的规律,图3.1.2所示的情况就是欠拟合,因为采用的模型为t=ω0+ω1xt=ω0+ω1x形式,这种形式的模型只能拟合x和y成线性关系的数据,对于非线性的数据,应该采用更高阶的回归模型。

欠拟合的解决办法:增加模型的复杂度,如将一次多项式模型,增加到3阶或者更高阶。对比图3.1.2和图3.1.3即可发现其变化过程。

4.2 过拟合

同样也可以给出过拟合的概念如下。

过拟合:和欠拟合相对指模型过于复杂,模型在训练数据上的训练误差很小,而在测试数据的测试误差很大,即泛化能力很差。图3.1.3中的(d)就是过拟合现象,12阶的多项式模型对于(d)中的数据复杂度太高了,其实用3阶多项式模型就能取得不错的效果。

过拟合的解决办法

1)不改变模型,增加数据

当过拟合时,不改变模型,增加数据可以改善过拟合问题,图3.1.3中的(d)只有20个数据点,现在将数据点增加到2000个,依然用12阶的多现实拟合,结果下图

 


这里写图片描述 
图4.2.1 增加数据点后的12阶回归模型

 

2)改变模型:正则化

依然对图3.1.3中的(d)的问题,如果没有足够的数据点,则可以减少模型中的特征,即将12阶模型降低为更低阶的模型,有一种方法称之为正则化,正则化方法通过在损失函数E(ω)E(ω) 上加上罚项,对高阶项进行处罚,达到降低高阶项前面的系数 ωiωiωiωi 变小,说明模型中 ωiωi 所对应的那项对模型的影响程度就会较低,达到简化模型的目的,常用的正则化后的损失函数为

 

 
E(ω)=12n=1N{tnωϕ(xn)}2+α2ωTω4.21E(ω)=12∑n=1N{tn−ωϕ(xn)}2+α2ωTω−−−−−(4.2−1)


按照前文介绍的方法,依然可以得到,正则化后的模型参数如下 

 
ω=(αI+X¯TX¯)1X¯TY4.22ω=(αI+X¯TX¯)−1X¯TY−−−−−(4.2−2)

 

其中,αα 为罚参数,II 为单位阵。αα 越大惩罚越强,如果 αα 非常大,则 ωω 会趋向于0。

按照式(4.2-2),实现的代码如下

def rTLR(x, y, lamda = 0.5,rank = 2):
    x = np.matrix(x)
    if x.shape[0] == 1:
        x = x.transpose()
    y = np.matrix(y)
    if y.shape[0] == 1:
        y = y.transpose()
    one = np.ones((x.shape[0], 1))
    tmp = np.zeros((x.shape[0], rank))
    for i in xrange(rank):
        tmp[:,i] = np.power(x.A, i + 1).transpose()
    xx = np.hstack([one, tmp])
    dim = xx.shape[1]
    I = lamda * np.diag(np.ones(dim))
    w = inv(I + (xx.transpose()).dot(xx)).dot(np.transpose(xx)).dot(y)
    return w
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

图4.2.2是不同正则化参数下的回归曲线,从中可以看出 λλ 越大,惩罚越强,α=0.1α=0.1 时,多项式回归模型已经欠拟合了,对应于多项式中的高次项的系数接近于0了。随着 λλ 变小,惩罚程度减弱,高次项的系数基本上没有变小,见(d)。

 


这里写图片描述 
图4.2.2 不同罚参数αα下的拟合曲线

 

5 多元线性回归

以上介绍的是一元回归,如果自变量的个数不止一个,就会要求使用多元回归,多元线性回归最简单的形式如下

 

 
t=ω0+j=1Dωjxj51t=ω0+∑j=1Dωjxj−−−−−(5−1)

 

其中DD为自变量的个数。但是这种形式的多元回归模型有很多限制。

所以和一元回归类似,也可以引入基函数的概念,引入基函数后的表达如下

 

 
t=ω0+j=1K1ωjϕj(x)52t=ω0+∑j=1K−1ωjϕj(x)−−−−−(5−2)

 

其中,x=(x1,,xM)Tx=(x1,⋯,xM)TKK为基函数的个数

同理可以得到模型的参数ωω

 

 
ω=(ΦTΦ)1ΦTY53ω=(ΦTΦ)−1ΦTY−−−−−(5−3)

 

其中

 

 
Φ=ϕ0(x1)ϕ0(x2)ϕ0(xN)ϕ1(x1)ϕ1(x2)ϕ1(xN)ϕK1(x1)ϕK1(x2)ϕK1(xN)Φ=[ϕ0(x1)ϕ1(x1)⋯ϕK−1(x1)ϕ0(x2)ϕ1(x2)⋯ϕK−1(x2)⋮ϕ0(xN)⋮ϕ1(xN)⋱⋯⋮ϕK−1(xN)]

 

 

 
ϕ0(x)=1ϕ0(x)=1

 

下面看一个二元回归的例子。

有如图5.1所示的曲面,建立一个回归模型拟合这个曲面,由于这个曲面是个二次曲面,所以在选择基函数时可以选择到二次或者更高次,比如选择ϕ1=xϕ1=xϕ2=x2ϕ2=x2,此时

 

 
Φ=111x1x2xNx21x22x2N=111x11x12x21x22xN1xN2x211x212x221x222x2N1x2N25.4Φ=[1x1x121x2x22⋮1⋮xN⋮xN2]=[1x11x12x112x1221x21x22x212x222⋮1⋮xN1xN2⋮xN12xN22]−−−−−(5.4)

 

按照式(5.4)代入式(5.3)可以求得模型参数ωω

 


这里写图片描述 
图5.1 二维曲面

 

下面看看用以上思路能否拟合出图5.1的曲面。

第一步:生成图5.1所示的数据,在xy方向分别等距离采集数据点40个,Python代码如下: 
第二步:用生成的数据点,按照式(5-3)求出参数ωω 
第三步:用第二步中计算的参数ωω,并且用第一步中的方法生成测试数据,在xy方向上分别采样20个点,用这20个点作为测试数据,输入到模型中,看模型预测的值和真实的值之间的误差。图5.2中,将真实值和预测点按照对应的一行一行的展开,分别做成两个一维向量,这样便于比对。从图中看出,预测的结果还是精确的。

 


这里写图片描述 
图5.2 真实值和预测值得对比图

 

实际上线性回归模型的非线性拟合能力较差,对于图5.3的多峰值函数就无能为力,本来这里给出的例子想用图5.3,结果,解释采用20阶以上的多项式也拟合不出图5.3的样子,无奈采用图5.1,相对简单一些,不过神经网络可以对高度非线性数据进行拟合,详细的Python代码和参考文献可以见

http://blog.csdn.net/zc02051126/article/details/9337319

 


这里写图片描述 
图5.3 Matlab中的peaks函数产生的曲面
分享到:
评论

相关推荐

    第二章_机器学习基础.pdf

    机器学习起源于上世纪50年代,...本章我们主要介绍下机器学习的基本概念、监督学习、分类算法、逻辑回归、代价函数、损失函数、LDA、PCA、决策树、支持向量机、EM算法、聚类和降维以及模型评估有哪些方法、指标等等。

    交易机器学习:算法交易机器学习的代码和资源,第二版

    ML交易-第二版 旨在展示ML如何以实用而全面的方式为算法交易策略增加价值。 它涵盖了从线性回归到深度强化学习的广泛的机器学习技术,并演示了如何建立,回测和评估由模型预测驱动的交易策略。 本书分为四个部分,...

    常用数据挖掘算法总结及Python实现 文字版+code

    第二章 探索性数据分析(EDA) .11 第二部分 机器学习概述14 第三章 机器学习概述14 第三部分 监督学习---分类与回归16 第四章 KNN(k 最邻近分类算法) 16 第五章 决策树19 第六章 朴素贝叶斯分类29 第七章 ...

    常用数据挖掘算法总结及Python实现

    第二章 探索性数据分析(EDA).11 第二部分 机器学习概述14 第三章 机器学习概述14 第三部分 监督学习---分类与回归16 第四章 KNN(k 最邻近分类算法) 16 第五章 决策树19 第六章 朴素贝叶斯分类29 第七章 Logistic...

    Tutorial_HYLee_Deep.pdf 深度学习讲座

    第二章 探索性数据分析( EDA 11 第二部分 机器学习概述 14 第三章 机器学习概述 14 第三部分 监督学习 ---分类与回归 16 第四章 KNN k最邻近分类算法) 16 第五章 决策树 19 第六章 朴素贝叶斯分类 29 第七章 ...

    西瓜书《机器学习》-第二章 模型评估与选择代码实现.zip

    1、选取某UCI分类数据集,划分数据集,用10折交叉验证,选用两个现成的分类算法(或者一个算法、参数不同),得到分类模型A和B,给出交叉验证预测结果。 2、对两模型的交叉验证预测结果,分别给出混淆矩阵、P、R和F1...

    《数据挖掘实用机器学习技术》(原书第2版) [高清ebook,非扫描, ]

    第二部分 Weka机器学习平台 第9章 weka简介 第10章 Explorer界面 第11章 Knowledge Flow界面 第12章 Experimenter界面 第13章 命令行界面 第14章 嵌入式机器学习 第15章 编写新学习方案 参考文献 索引 Editorial ...

    基于机器学习算法的驾驶状态识别研究(随机森林;Bagging;UAH-DriveSet数据;PCA;t-SNE)

    文章共5个章节,第一章为绪论,详述了研究背景及意义,总结分析关于驾驶状态识别的国内外研究现状,第二章紧接着对UAH-DriveSet数据集进行介绍,并对该数据集进行预处理,第三章,对该数据集进行可视化分析,得出...

    Machine-Learning-for-Algorithmic-Trading-Second-Edition_Original:机器学习用于算法交易,第二版-Packt出版

    ML交易-第二版旨在说明ML如何以实用而全面的方式为算法交易策略增加价值。 它涵盖了从线性回归到深度强化学习的各种机器学习技术,并演示了如何建立,回测和评估由模型预测驱动的交易策略。 本书分为四个部分,共23...

    Introduction to Machine Learning 机器学习导论

    第二章:介绍线性模型,包括线性预测模型,线性分类模型和线性高斯概率模型; 第三章:介绍神经网络的基础知识、基础结构和训练方法; 第四章:介绍深度神经网络的基础方法和最新进展; 第五章:介绍核方法,特别是...

    《数据算法Hadoop Spark大数据处理技巧》PDF 带目录!!

    目录 第1章二次排序:简介 19 第2章二次排序:详细示例 42 第3章 Top 10 列表 54 第4章左外连接 96 第5章反转排序 127 第6章移动平均 137 第7章购物篮分析 155 第8章共同好友 182 第9章使用MapReduce实现推荐引擎 ...

    ML-Predictions:机器学习引擎使用回归功能在给定任何数据集的情况下生成预测

    机器学习-预测Travic CI构建状态:目录第0章-关于机器学习引擎使用回归在给定任何数据集的情况下生成预测。 技术:预测算法熊猫数据框相似度度量matplotlib根均值平方误差度量多元模型scipy scikit-learn超参数优化...

    第4章 回归与聚类算法 2 4.1. 线性回归 2 4.1.1. 线性回归的原理 2 4.1.2. 线性回归的损失和优化原理(理

    第4章 回归与聚类算法 2 4.1. 线性回归 2 4.1.1. 线性回归的原理 2 4.1.2. 线性回归的损失和优化原理(理解记忆) 5 4.1.3. 线性回归API 9 4.1.4. 波士顿房价预测 10 4.1.5. 拓展-关于优化方法GD、SGD、SAG 14 4.1.6...

    统计学习方法_李航

    第1章统计学习方法概论 1.1统计学习 1.2监督学习 1.2.1基本概念 1.2.2问题的形式化 1.3统计学习三要素 1.3.1模型 1.3.2策略 1.3.3算法 1.4模型评估与模型选择 1.4.1训练误差与测试误差 1.4.2过拟合与模型选择 1.5i~...

    集体智慧编程.[美]西格兰(带详细书签) PDF 下载

    《集体智慧编程》由美国计算机专家西格兰编著,以机器学习与计算统计为主题背景,专门讲述如何挖掘和分析Web上的数据和资源,如何分析用户体验、市场营销、个人品味等诸多信息,并得出有用的结论,通过复杂的算法来...

    集体智慧编程中文版

    前言 第1章 集体智慧导言 什么是集体智慧 什么是机器学习 机器学习的局限 真实生活中的例子 学习型算法的其他用途 第2章 提供推荐 协作型过滤 搜集偏好 寻找相近的用户 推荐物品 匹配商品 构建一个基于del.icio.us...

    python数据分析随书代码

    第 10章 预测性分析与机器学习 225 10.1 scikit-learn概貌 226 10.2 预处理 228 10.3 基于逻辑回归的分类 230 10.4 基于支持向量机的分类 232 10.5 基于ElasticNetCV的回归分析 235 10.6 支持向量回归 237 ...

    数据驱动的判断预测。 法律的新存在方式?-研究论文

    在第一部分中,我将研究基于机器学习的数学假设的法律决策的前景,在基础研究设计层面打开算法“洞察力”的黑匣子。 在第二部分中,我将通过强调法律效力的执行性质以及这与法律效力的关系来研究现代实在法作为文本...

    代码优化:有效使用内存.part3

    1.6.2第二步:将strlen函数体移出循环 1.6.3第三步:对齐数据 1.6.4第四步:删除strlen函数 1.6.5第五步:删除除法操作 1.6.6第六步:删除性能监测代码 1.6.7第七步:函数组合 1.6.8第八步:减少内存访问操作的次数 ...

Global site tag (gtag.js) - Google Analytics