matlab多项式曲线拟合原理,matlab拟合双曲线
多项式曲线拟合标签:监督学习
@作者:duanxxnj@163.com
@时间:2016-06-19
原始链接
多项式特征生成在机器学习算法中,基于数据的非线性函数的线性模型非常常见。这种方法可以像线性模型一样有效地运行,同时使模型适用于更广泛的数据。多项式拟合是这些算法中最简单的。
关于多项式回归的应用,这里有一个非常简单的例子:一般线性回归,模型既是参数W的线性函数,又是输入变量x的线性函数,对于一个二维数据,模型的数学表达式如下:
y~(x,w)=w0 w1x1 w2x2
如果要拟合抛物面而不是平面,那么需要计算输入变量x的二次项的线性组合,模型更新为如下形式:
y~(x,w)=w0 w1x1 w2x2 w4x21 w5x22
这里应该注意的是,尽管更新的模型是输入变量X的二次函数,但是它仍然是线性模型,因为它仍然是参数w的线性函数。为了说明这个问题,可以假设有新的变量z=[x1,x2,x1x2,x21,x22],那么上述模型可以重写为以下形式:
y~(x,w)=w0 w1z1 w2z2 w3z3 w4z4 w5z5
用向量Z代替向量X的过程相当于一个特征变换或特征生成的过程,增加了输入特征的维数,但模型仍然是线性模型。下面的代码片段可以实现特征维度提升的过程,特征转换的规则是:从[x1,x2]到[x1,x2,x1x2,x21,x22]。
#!/usr/眯眼月光/python# -*-编码:utf-8 -* - 作者:duanxxnj @ 163.com时间:2016-06-04 _ 14-00多项式特征生成 来自sklearn .预处理导入多项式特征simple numpy作为NP #第一老师进入3x2原始特征矩阵#即样本数为3,特征数为2x=NP,阿兰格(6)。Reshape (3,2) print 原始数据: print X#特殊变换/特征生成#将原始一阶数据升级为二阶数据的方式#是:[x_1,x_2]变成[1,x_1,x] X _ 2 2] polyfeat=多边形特征(度数=2)X _ transformed=poly feat . fit _ transform(X)print 特征变换后的数据: print X_transformed运行结果为:
原始数据:[[0 1] [2 3] [4 5]]特征变换后的数据:[[1 . 0 . 1 . 0 . 0 . 1][1 . 2 . 3 . 4 . 6 . 9][1 . 4 . 5 . 16 . 20 . 25]。
y(x,w)=j=0Mjxj
其中m是多项式的最高次,xj表示X的j次幂,wj是xj的系数。
样本数为n,对于每个样本xn,对应的输出为tn。使用误差的平方和作为损失函数,损失函数可以表示为:
E(w)=12n=1N{y(xn,w)TN } 2
这里在损失函数前面加一个12只是为了方便后面的推导,并不影响最终的结果。
经过以上分析,我们可以知道多项式拟合实际上是两个过程:
1.对原始特征向量x进行多项式特征生成,得到新的特征z
2.对新特征z进行线性回归。
#!/usr/眯眼月光/Python #-*-编码:UTF-8-*- 作者:duanxxnj @ 163.com时间:2016-06-04 _ 16-38本例展示了多项式曲线拟合的特点。多项式曲线拟合分为两步:1 .根据多项式的最高次,对输入特征向量进行特征生成。对于每个原始特征向量,可以生成范德蒙矩阵。范德蒙矩阵的大小为[n_samples,n_degree 1]其形式为[[1,x _ 1,x _ 1 * * 2,x _ 1 * * 3,].X_2 ** 2,x_2 ** 3,],]2.基于第一步生成的范德蒙矩阵,可以直接利用现有的线性回归模型实现多项式回归。这个例子展示了如何基于线性回归模块做非线性回归,这其实就是核函数的基本思想。 print(_ _ doc _ _)import numpy as NP import matplotlib . py plot as PLT from sk learn . linear _ model import linear regression from sk learn . preprocessing import PolynomialFeaturesf from rom learn . pipeline import make _ pipeline #多项式回归函数def f(x): return x * np.sin(x)#为绘图生成原始数据点#此处生成的点的范围比实际拟合使用的点的范围要宽#其目的是为了说明当多项式拟合的次数过高时, 过拟合现象#过拟合模型在训练数据范围内有非常好的拟合效果#在训练数据范围外,模型的拟合效果有特殊误差x_plot=np.linspace(-1,13,140)#训练数据范围x=np.linspace(0,10,00) #在训练数据中随机选取10个点作为拟合点RNG=NP . random . random state(0)RNG . shuffle(x)x=NP . sort(x[:10]) Newaxis] x _ plot=x _ plot [:NP。Newaxis] #次数从1到17变化,模型的次数以3为步长递增#下面会画出不同时间对应的图像#需要注意的是,这六个图形的坐标系Y轴的数据范围差别很大#模型的次数越高,在训练数据之外的测试点上, Y数据与原始数据的差异越大#即过拟合现象越明显# #同时,模型对应的参数向量w#也在下面不同时间输出。 可以看出,模型次数越大,模型#对应的参数向量的模 w 就越大也就是说,过拟合现象越明显,模型#对应的参数向量的模 w 就越大#加上模型 #对应的参数向量的模,那么,在最小化损失函数的同时, 也限制了参数向量的模 #这就是正则化可以防止过拟合的原因# #但是在实际测试中发现,如果随机取训练数据,选取20个点#那么参数向量的模w不随模型复杂度的增加而增加#这是因为当训练样本足够大时, 它能有效地描述原始数据的分布#那么这一套过拟合理论就不是特别适用#所以,方法的选择应该基于对数据分布的充分理解#for degree in range(9): #生成基于不同次数的多项式模型model=make _ pipeline(多项式特征(次数),线性回归())model.fit (x,Y) #在不同次数下,当参数print model degree of polynomial model is:,degree 时,模型的参数向量的模为: printnp . dot(NP . array(model . steps[1 coef _),NP的参数。数组(模型.步骤[1] [3])。coef _)打印模型是:打印模型.步骤[1] [4]。coef _ y _ plot=model . predict(x _ plot)PLT . subplot( 52 str(PLT . grid()PLT . plot(x _ plot,f(x_plot),label= ground truth )PLT . scatter(x,y,label= training points )PLT . plot(x _ plot,y _ plot,label= degree % d % degree )PLT . legend(loc=左下角)plt.show()
对上述代码的运行结果进行过度拟合,结果如下:
当模型阶数为:0时,模型的参数向量的模为:0.0,模型的参数为:【0。]当模型阶数为:1时,模型的参数向量的模为:0.067247305597,模型的参数为:【0。0.25927732],而当模型阶数为:2时,模型的参数向量的模:0.00485169982253模型的参数为:[0.0670261 0.01896495]模型阶数为:3,模型的参数向量的模:21.6855657558模型的参数为:[0 .-4.50881058 1.16216004-0.07467912]模型次数为:4: 00,模型的参数向量的模为:193.44229814。模型的参数为:[0 . 11 . 8668248-7.1312616 1.28487-0.06970187]当模型阶数为:5时,模型的参数向量的模为:100.775416362。模型的参数为:[0.00000000 e00 8.81727284 e00-4.7572615 e00 6.32370347 e-01 3.8181 e-03-2.2961555 e-03]。模型的参数向量的模为412.685941253,模型的参数为:[0.000000000 e00-1.12195467 e01 1-7.20052.00000000044模型编号为:7: 00,模型的参数向量的模为584.784763013,模型的参数为:[0.0000000模型的参数为:[0.0000000000 E00 8.34477828 E00-1.2270425 e01 9.49806252 E00-3.873 e-01-9.578408584-03-1.25987578 e-04]可以清楚地看到,模型的次数越高,参数向量的模越大,其次数越高
注意:
在实际测试中发现,如果随机选取20个点进行训练数据,参数向量的模w w 不会随着模型复杂度的增加而增加。这是因为当训练样本大到足以有效描述原始数据的分布时,过拟合理论就不是特别适用了。因此,方法的选择应该基于对数据分布的充分了解。模型的概率解释线性模型可以用它的概率意义来解释。我个人最相信这个解释。即,通过输入xn向模型y(x,w)添加噪声来生成真实值tn,并且其数学表达式如下:
而我们一般可以将噪声定义为美丽绿茶分布N(0,2),那么很容易得到T是y(x,w)的平均值的美丽绿茶分布:
p(tx,w,2)=N(ty(x,w),2)
然后,对于训练数据{X,t},可以使用最大似然估计来计算参数w和2:
p(tX,w,2)=n=1NN(tny(xn,w),2)
进行对数似然估计:
lnp(tX,w,2)=122n=1N { y(xn,w)TN } 2 n2ln 2nln
先估计参数W,那么所有与W无关的项都可以省略。最后剩下下面这个公式:
n=1N{y(xn,w)TN } 2
这是一开始用的误差平方和,也解释了为什么用误差平方和作为损失函数。线性回归一节已经解释了W的解。
在wML被估计之后,参数2被估计。这里, 1= 2,则对数似然估计变为:
lnp(tX,w,)=-2n=1N { y(xn,w)TN } 2 n2ln 2n2ln
通过对求导,你可以得到:
12n=1N{y(xn,w)TN } 2 N2=0
所以你可以得到:
2ML=1ML=1Nn=1N{y(xn,wML)TN } 2 }
既然已经估计了参数wML和2ML,那么我们就有了t关于x的概率分布模型:
p(tx,wML,2ML)=N(ty(x,wML),2ML)
有了这个模型,很容易得到输入x的t及其概率。
正则项的贝叶斯先验解释在已经得到正义概率模型的前提下,这里进一步介绍贝叶斯规则。可以假设参数w具有绿茶的美丽先验分布:
p(w)=N(w0,1I)=(2)(m1)/2 exp {-2w tw }
这里M 1是模型的复杂度,即多项式回归的次数。然后,根据贝叶斯法则:
p(wX,t,,)=p(tX,w,)p(w,)
这被称为MAP最大后验概率。用这个公式做对数似然,去掉无关项后,你可以很容易地得到以下结果:
2n=1N{y(xn,w)TN } 22w tw
这里可以看出,先验概率对应的是正则项,其正则化参数为=/。
可以假设复杂的模型具有较小的先验概率,而相对简单的模型具有较大的先验概率。