多项式函数Python的简单介绍

多项式拟合平方误差怎么求

线性模型(二)之多项式拟合

站在用户的角度思考问题,与客户深入沟通,找到拜城网站设计与拜城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、网站建设、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广、域名申请、网络空间、企业邮箱。业务覆盖拜城地区。

1. 多项式拟合问题

  多项式拟合(polynominal curve fitting)是一种线性模型,模型和拟合参数的关系是线性的。多项式拟合的输入是一维的,即x=xx=x,这是多项式拟合和线性回归问题的主要区别之一。

  多项式拟合的目标是构造输入xx的MM阶多项式函数,使得该多项式能够近似表示输入xx和输出yy的关系,虽然实际上xx和yy的关系并不一定是多项式,但使用足够多的阶数,总是可以逼近表示输入xx和输出yy的关系的。

  多项式拟合问题的输入可以表示如下:

D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R

D={(x1,y1),(x2,y2),...,(xi,yi),...,(xN,yN)}xi∈Ryi∈R

  目标输出是得到一个多项式函数:

f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b

f(x)=w1x1+w2x2+wixi+...+wMxM+b=(∑i=1Mwixi)+b

其中MM表示最高阶数为MM。

  可见在线性拟合的模型中,共包括了(M+1)(M+1)个参数,而该模型虽然不是输入xx的线性函数,但却是(M+1)(M+1)个拟合参数的线性函数,所以称多项式拟合为线性模型。对于多项式拟合问题,其实就是要确定这(M+1)(M+1)个参数,这里先假设阶数MM是固定的(MM是一个超参数,可以用验证集来确定MM最优的值,详细的关于MM值确定的问题,后面再讨论),重点就在于如何求出这(M+1)(M+1)个参数的值。

2.优化目标

  多项式拟合是利用多项式函数逼近输入xx和输出yy的函数关系,通过什么指标来衡量某个多项式函数的逼近程度呢?(其实这就是误差/损失函数)。拟合/回归问题常用的评价指标是均方误差(在机器学习中的模型评估与度量博客中,我进行了介绍)。多项式拟合问题也同样采用该评价指标,以均方误差作为误差/损失函数,误差函数越小,模型越好。

E(w,b)=1N∑i=1N[f(xi)−yi]2

E(w,b)=1N∑i=1N[f(xi)−yi]2

  系数1N1N是一常数,对优化结果无影响,可以去除,即将均方误差替换为平方误差:

E(w,b)=∑i=1N[f(xi)−yi]2

E(w,b)=∑i=1N[f(xi)−yi]2

   到这里,就成功把多项式拟合问题变成了最优化问题,优化问题可表示为:

argminw,bE(w,b)

arg⁡minw,b⁡E(w,b)

即需要求得参数{w1,...,wM,b}{w1,...,wM,b}的值,使得E(w,b)E(w,b)最小化。那么如何对该最优化问题求解呢?

3. 优化问题求解

3.1 求偏导,联立方程求解

   直观的想法是,直接对所有参数求偏导,令偏导为0,再联立这M+1M+1个方程求解(因为共有M+1M+1个参数,故求偏导后也是得到M+1M+1个方程)。

E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]2

E(w,b)=∑i=1N[f(xi)−yi]2=∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]2

利用E(w,b)E(w,b)对各个参数求偏导,如下:

∂E(w,b)∂wj∂E(w,b)∂b=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]xji=2∑i=1N[(w1x1i+w2x2i+wixji+...+wMxMi+b)−yi]

∂E(w,b)∂wj=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]xij∂E(w,b)∂b=2∑i=1N[(w1xi1+w2xi2+wixij+...+wMxiM+b)−yi]

求导之后,将各个点(xi,yi)(xi,yi)的值带入偏导公式,联立方程求解即可。

  针对该解法,可以举个例子详细说明,比如有两个点(2,3),(5,8)(2,3),(5,8),需要利用二阶多项式f(x)=w1x+w2x2+bf(x)=w1x+w2x2+b拟合。求解过程如下:

该二阶多项式对参数求偏导得到

∂E(w,b)∂wj∂E(w,b)∂b=2∑i=12[(w1x1i+w2x2i+b)−yi]xji=[(w1x1+w2x21+b)−y1]xj1+[(w1x2+w2x22+b)−y2]xj2=2∑i=12[(w1x1i+w2x2i+b)−yi]=[(w1x1+w2x21+b)−y1]+[(w1x2+w2x22+b)−y2]

∂E(w,b)∂wj=2∑i=12[(w1xi1+w2xi2+b)−yi]xij=[(w1x1+w2x12+b)−y1]x1j+[(w1x2+w2x22+b)−y2]x2j∂E(w,b)∂b=2∑i=12[(w1xi1+w2xi2+b)−yi]=[(w1x1+w2x12+b)−y1]+[(w1x2+w2x22+b)−y2]

将点(2,3),(5,8)(2,3),(5,8)带入方程,可以得到3个方程,

2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212

2b+7w1+29w2=117b+29w1+133w2=4629b+133w1+641w2=212

联立这三个方程求解,发现有无穷多的解,只能得到3w1+21w2=53w1+21w2=5,这三个方程是线性相关的,故没有唯一解。

  该方法通过求偏导,再联立方程求解,比较复杂,看着也很不美观。那么有没有更加方便的方法呢?

3.2 最小二乘法

   其实求解该最优化问题(平方和的最小值)一般会采用最小二乘法(其实最小二乘法和求偏导再联立方程求解的方法无本质区别,求偏导也是最小二乘法,只是这里介绍最小二乘的矩阵形式而已)。最小二乘法(least squares),从英文名非常容易想到,该方法就是求解平方和的最小值的方法。

  可以将误差函数以矩阵的表示(NN个点,最高MM阶)为:

∥Xw−y∥2

‖Xw−y‖2

其中,把偏置bb融合到了参数ww中,

w={b,w1,w2,...,wM}

w={b,w1,w2,...,wM}

XX则表示输入矩阵,

⎡⎣⎢⎢⎢⎢11...1x1x2...xNx21x22...x2N............xM1xM2...xMN⎤⎦⎥⎥⎥⎥

[1x1x12...x1M1x2x22...x2M...............1xNxN2...xNM]

yy则表示标注向量,

y={y1,y2,...,yN}T

y={y1,y2,...,yN}T

因此,最优化问题可以重新表示为

minw∥Xw−y∥2

minw‖Xw−y‖2

对其求导,

∂∥Xw−y∥2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w

∂‖Xw−y‖2∂w=∂(Xw−y)T(Xw−y)∂w=∂(wTXT−yT)(Xw−y)∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w

在继续对其求导之前,需要先补充一些矩阵求导的先验知识(常见的一些矩阵求导公式可以参见转载的博客),如下:

∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx

∂xTa∂x=a∂ax∂x=aT∂xTA∂x=Ax+ATx

根据上面的矩阵求导规则,继续进行损失函数的求导

∂∥Xw−y∥2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy

∂‖Xw−y‖2∂w=∂(wTXTXw−yTXw−wTXTy+yTy)∂w=XTXw+(XTX)Tw−(yTX)T−XTy=2XTXw−2XTy

其中XTXw=(XTX)TwXTXw=(XTX)Tw.令求导结果等于0,即可以求导问题的最小值。

2XTXw−2XTy=0w=(XTX)−1XTy

2XTXw−2XTy=0w=(XTX)−1XTy

  再利用最小二乘法的矩阵形式对前面的例子进行求解,用二阶多项式拟合即两个点(2,3),(5,8)(2,3),(5,8)。

表示输入矩阵 XX和标签向量yy

X=[1125425]y=[38]T

X=[1241525]y=[38]T

计算XTXXTX

XTX=⎡⎣⎢272972913329133641⎤⎦⎥

XTX=[272972913329133641]

矩阵求逆,再做矩阵乘法运算

但 XTXXTX不可逆,故无唯一解。

  关于矩阵的逆是否存在,可以通过判断矩阵的行列式是否为0(det(A)=?0det(A)=?0 来判断,也可以通过初等行变换,观察矩阵的行向量是否线性相关,在这个例子下,矩阵不可逆,故有无穷多解。但如果新增一个点(4,7)(4,7),则就可以解了。

  其实这和数据集的点数和选择的阶数有关,如果点数小于阶数则会出现无穷解的情况,如果点数等于阶数,那么刚好有解可以完全拟合所有数据点,如果点数大于阶数,则会求的近似解。

  那么对于点数小于阶数的情况,如何求解?在python的多项式拟合函数中是可以拟合的,而且效果不错,具体算法不是很了解,可以想办法参考python的ployfit()函数的实现。

4. 拟合阶数的选择

   在前面的推导中,多项式的阶数被固定了,那么实际场景下应该如何选择合适的阶数MM呢?

一般会选择阶数MM小于点数NN

把训练数据分为训练集合验证集,在训练集上,同时用不同的MM值训练多个模型,然后选择在验证集误差最小的阶数script type="math/tex" id="MathJax-Element-5573"M/script

Python 中的函数拟合

很多业务场景中,我们希望通过一个特定的函数来拟合业务数据,以此来预测未来数据的变化趋势。(比如用户的留存变化、付费变化等)

本文主要介绍在 Python 中常用的两种曲线拟合方法:多项式拟合 和 自定义函数拟合。

通过多项式拟合,我们只需要指定想要拟合的多项式的最高项次是多少即可。

运行结果:

对于自定义函数拟合,不仅可以用于直线、二次曲线、三次曲线的拟合,它可以适用于任意形式的曲线的拟合,只要定义好合适的曲线方程即可。

运行结果:

python 拉格朗日插值 不能超过多少个值

拉格朗日插值Python代码实现

1. 数学原理

对某个多项式函数有已知的k+1个点,假设任意两个不同的都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:

其中每个lj(x)为拉格朗日基本多项式(或称插值基函数),其表达式为:

2. 轻量级实现

利用

直接编写程序,可以直接插值,并且得到对应的函数值。但是不能得到系数,也不能对其进行各项运算。

123456789101112

def h(x,y,a):    ans=0.0    for i in range(len(y)):        t=y[i]        for j in range(len(y)):            if i !=j:                t*=(a-x[j])/(x[i]-x[j])        ans +=t    return ansx=[1,0]y=[0,2]print(h(x,y,2))

上述代码中,h(x,y,a)就是插值函数,直接调用就行。参数说明如下:

x,y分别是对应点的x值和y值。具体详解下解释。

a为想要取得的函数的值。

事实上,最简单的拉格朗日插值就是两点式得到的一条直线。

例如:

p点(1,0)q点(0,2)

这两个点决定了一条直线,所以当x=2的时候,y应该是-2

该代码就是利用这两个点插值,然后a作为x=2调用函数验证的。

3. 引用库

3.1 库的安装

主要依赖与 scipy。官方网站见:

安装的方法很简单,就是使用pip install scipy 如果失败,则将whl文件下载到本地再利用命令进行安装。

可能如果没有安装numpy

3.2 库的使用

from scipy.interplotate import lagrange

直接调用lagrange(x,y)这个函数即可,返回 一个对象。

参数x,y分别是对应各个点的x值和y值。

例如:(1,2) (3,5) (5,9)这三个点,作为函数输入应该这么写:

x=[1,3,5]

y =[2, 5, 9]

a=lagrange(x,y)

直接输出该对象,就能看到插值的函数。

利用该对象,能得到很多特性。具体参见:

a.order得到阶

a[]得到系数

a()得到对应函数值

此外可以对其进行加减乘除运算

3.3 代码实现

1234567   from scipy.interpolate import lagrangex=[1,2,3,4,7]y=[5,7,10,3,9]a=lagrange(x,y)print(a)print(a(1),a(2),a(3))print(a[0],a[2],a[3])   

结果是:

class 'numpy.lib.polynomial.poly1d' 4

4            3              2

0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13

5.0 7.0 10.0

28.1333333333 30.6527777778 -7.30555555556

解释:

class 'numpy.lib.polynomial.poly1d' 4

这一行是输出a的类型,以及最高次幂。

4            3              2

0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13

第二行和第三行就是插值的结果,显示出的函数。

第二行的数字是对应下午的x的幂,如果对应不齐,则是排版问题。

5.0 7.0 10.0

第四行是代入的x值,得到的结果。

也就是说,用小括号f(x)的这种形式,可以直接得到计算结果。

28.1333333333 30.6527777778 -7.30555555556

python中有没有求legendre多项式的解的函数

他们以后被命名 Adrien-Marie Legendre. 这 常微分方程 频繁地运用到 物理 并且其他技术领域。 特别是当在球状坐标解决 Laplace的等式 (和关连 偏微分方程) 时.

Legendre微分方程也许使用标准解决 电源串联 方法。 等式有 规则单一点 在 x= ± 1如此,级数解关于起源只将一般来说,聚合为 |x| 1. 当 n是整数,解答Pn是规则的(x) x=1也是正规兵在 x=-1和系列为这种解答终止(即。 是多项式)。

网站题目:多项式函数Python的简单介绍
文章路径:https://www.cdcxhl.com/article48/hdidhp.html

成都网站建设公司_创新互联,为您提供域名注册微信小程序服务器托管手机网站建设网站维护外贸网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

微信小程序开发