多项式函数类总结
多项式函数
多项式函数类就是由多项式所构成的函数。对于一元函数来说,用一元多项式逼近的常见表达式为:
f
(
x
)
=
a
0
+
a
1
(
x
−
x
0
)
+
a
2
(
x
−
x
0
)
2
+
a
3
(
x
−
x
0
)
3
+
⋯
+
a
n
(
x
−
x
0
)
n
+
⋯
f(x)=a_0+a_1(x-x_0)+a_2(x-x_0)^2+a_3(x-x_0)^3+\cdots+a_n(x-x_0)^n+\cdots
f(x)=a0+a1(x−x0)+a2(x−x0)2+a3(x−x0)3+⋯+an(x−x0)n+⋯
其中根据维尔斯特拉斯定理和泰勒定理,我们可以得到
a
n
a_n
an的表达式:
a
n
=
f
(
n
)
(
x
0
)
n
!
,
n
=
0
,
1
,
2
,
⋯
,
n
,
⋯
a_n=\frac{f^{(n)}(x_0)}{n!},n=0,1,2,\cdots,n,\cdots
an=n!f(n)(x0),n=0,1,2,⋯,n,⋯
然而实际情况中,我们并不一定能知道
f
(
x
)
f(x)
f(x)的函数形状,所以也就无法求出
f
(
x
)
f(x)
f(x)的导数。前面的估计也就无法实施。这时候就需要使用最小二乘估计去估计模型的参数。以多元多项式函数为例:
对于多元函数,多元函数多项式为:
f
(
x
∣
θ
)
=
a
0
+
a
1
x
1
+
a
2
x
2
+
⋯
+
a
n
x
n
+
a
11
x
1
2
+
a
12
x
1
x
2
+
⋯
+
a
n
n
x
n
2
f(x|\theta)=a_0+a_{1}x_1+a_{2}x_2+\cdots+a_nx_n+a_{11}x_1^2+a_{12}x_1x_2+\cdots+a_{nn}x_n^2
f(x∣θ)=a0+a1x1+a2x2+⋯+anxn+a11x12+a12x1x2+⋯+annxn2
其中函数参数包括
a
0
,
a
1
,
⋯
,
a
n
,
a
11
,
⋯
,
a
n
n
a_0,a_1,\cdots,a_n,a_{11},\cdots,a_{nn}
a0,a1,⋯,an,a11,⋯,ann。此时我们使用最小化估计误差的方法来求出上述参数。此时,函数
f
(
x
)
f(x)
f(x)的估计表达式用向量乘法可以表示为:
f
(
x
)
=
[
a
0
,
a
1
,
⋯
,
a
n
,
a
11
,
⋯
,
a
n
n
]
∗
[
1
,
x
1
,
⋯
,
x
n
,
x
1
x
1
,
⋯
,
x
n
x
n
]
T
f(x)=[a_0,a_1,\cdots,a_n,a_{11},\cdots,a_{nn}]*[1,x_1,\cdots,x_n,x_1x_1,\cdots,x_nx_n]^T
f(x)=[a0,a1,⋯,an,a11,⋯,ann]∗[1,x1,⋯,xn,x1x1,⋯,xnxn]T
记前面的参数行向量为
Θ
\Theta
Θ,后面的观测列向量为
ψ
(
x
)
\psi(x)
ψ(x)。那么就有:
f
(
x
)
=
Θ
∗
ψ
(
x
)
f(x)=\Theta*\psi(x)
f(x)=Θ∗ψ(x)
此时对于
m
m
m个样本的估计误差为,其中
X
i
X_i
Xi为第
i
i
i个样本所对应的
[
x
1
,
x
2
,
⋯
,
x
n
]
[x_1,x_2,\cdots,x_n]
[x1,x2,⋯,xn],
Y
i
Y_i
Yi为第
i
i
i个样本的实际值:
E
r
r
o
r
=
∑
i
=
1
m
[
Y
i
−
f
(
X
i
)
]
2
=
[
Y
−
Θ
∗
ψ
(
X
)
]
∗
[
Y
−
Θ
∗
ψ
(
X
)
]
T
Error=\sum_{i=1}^{m}{[Y_i-f(X_i)]}^2=[Y-\Theta*\psi(X)]*[Y-\Theta*\psi(X)]^T
Error=i=1∑m[Yi−f(Xi)]2=[Y−Θ∗ψ(X)]∗[Y−Θ∗ψ(X)]T
其中
Y
=
[
Y
1
,
Y
2
,
⋯
,
Y
m
]
Y=[Y_1,Y_2,\cdots,Y_m]
Y=[Y1,Y2,⋯,Ym],
ψ
(
X
)
=
[
ψ
(
X
1
)
,
ψ
(
X
2
)
,
⋯
,
ψ
(
X
m
)
]
\psi(X)=[\psi(X_1),\psi(X_2),\cdots,\psi(X_m)]
ψ(X)=[ψ(X1),ψ(X2),⋯,ψ(Xm)]。然后我们的目标是最小化估计误差也就是最小化
E
r
r
o
r
Error
Error,所以用
E
r
r
o
r
Error
Error对
Θ
\Theta
Θ求导。同时根据矩阵与向量之间的相合性。
∂
E
r
r
o
r
∂
Θ
=
[
Y
−
Θ
∗
ψ
(
X
)
]
∗
ψ
(
X
)
T
+
∂
[
Y
−
Θ
∗
ψ
(
X
)
]
∂
Θ
∗
[
Y
−
Θ
∗
ψ
(
X
)
]
T
\frac{\partial{Error}}{\partial\Theta}=[Y-\Theta*\psi(X)]*\psi(X)^T+\frac{\partial{[Y-\Theta*\psi(X)]}}{\partial\Theta}*[Y-\Theta*\psi(X)]^T
∂Θ∂Error=[Y−Θ∗ψ(X)]∗ψ(X)T+∂Θ∂[Y−Θ∗ψ(X)]∗[Y−Θ∗ψ(X)]T
∂ E r r o r ∂ Θ = 2 [ Y − Θ ∗ ψ ( X ) ] ∗ ψ ( X ) T \frac{\partial{Error}}{\partial\Theta}=2[Y-\Theta*\psi(X)]*\psi(X)^T ∂Θ∂Error=2[Y−Θ∗ψ(X)]∗ψ(X)T
令
∂
E
r
r
o
r
∂
Θ
=
0
\frac{\partial{Error}}{\partial\Theta}=0
∂Θ∂Error=0,可以得到:
Y
∗
ψ
(
X
)
T
−
Θ
∗
ψ
(
X
)
∗
ψ
(
X
)
T
=
0
Y*\psi(X)^T-\Theta*\psi(X)*\psi(X)^T=0
Y∗ψ(X)T−Θ∗ψ(X)∗ψ(X)T=0
化简可以得到:
Θ
=
Y
∗
ψ
(
X
)
T
∗
(
ψ
(
X
)
∗
ψ
(
X
)
T
)
−
1
\Theta=Y*\psi(X)^T*(\psi(X)*\psi(X)^T)^{-1}
Θ=Y∗ψ(X)T∗(ψ(X)∗ψ(X)T)−1
也就可以估计出多项式近似函数的系数。
接下来以已知函数表达式为例介绍多项式函数逼近效果,仿真函数区间为
[
−
10
,
10
]
[-10,10]
[−10,10],真实函数区间为:
[
−
5
,
5
]
[-5,5]
[−5,5],下方的代码表示以原函数的前
2
2
2阶导数构成的泰勒级数来逼近原函数,也就是原函数为:
f
(
x
)
=
sin
(
x
)
f(x)=\sin(x)
f(x)=sin(x)
近似函数采用了:
f
(
x
)
=
∑
n
=
0
2
f
n
(
x
0
)
n
!
(
x
−
x
0
)
n
f(x)=\sum_{n=0}^{2}\frac{f^{n}(x_0)}{n!}(x-x_0)^n
f(x)=n=0∑2n!fn(x0)(x−x0)n
其中为了方便,
x
0
=
0
x_0=0
x0=0,则近似函数为:
f
(
x
)
=
0
+
1
1
!
x
+
0
2
!
x
2
f(x)=0+\frac{1}{1!}x+\frac{0}{2!}x^2
f(x)=0+1!1x+2!0x2
代码如下所示:
import numpy as np
import matplotlib.pyplot as plt
if __name__=='__main__':
'''
利用多项式函数仿真sin(x)函数,由于sin函数具有特殊的导数特性
sin -> cos -> -sin -> -cos -> sin
0 -> 1 -> 0 -> -1 -> 0
'''
x=np.linspace(-10,10,1001)
sum=np.linspace(0,0,1001)
l=[0,1,0,-1]
temp=1
for k in range(3):
if k !=0:
temp=temp*k
sum=sum+l[k%4]/temp*(x**k)
ll=np.linspace(-5,5,501)
plt.plot(ll,np.sin(ll),label='orign')
plt.plot(x,sum,label='simul')
plt.legend()
plt.show()
近似结果为:
当使用前
5
5
5阶导数时:
f
(
x
)
=
0
+
1
1
!
x
+
0
2
!
x
2
+
−
1
3
!
x
3
+
0
4
!
x
4
+
1
5
!
x
5
f(x)=0+\frac{1}{1!}x+\frac{0}{2!}x^2+\frac{-1}{3!}x^3+\frac{0}{4!}x^4+\frac{1}{5!}x^5
f(x)=0+1!1x+2!0x2+3!−1x3+4!0x4+5!1x5
代码如下:
import numpy as np
import matplotlib.pyplot as plt
if __name__=='__main__':
'''
利用多项式函数仿真sin(x)函数,由于sin函数具有特殊的导数特性
sin -> cos -> -sin -> -cos -> sin
0 -> 1 -> 0 -> -1 -> 0
'''
x=np.linspace(-10,10,1001)
sum=np.linspace(0,0,1001)
l=[0,1,0,-1]
temp=1
for k in range(6):
if k !=0:
temp=temp*k
sum=sum+l[k%4]/temp*(x**k)
ll=np.linspace(-5,5,501)
plt.plot(ll,np.sin(ll),label='orign')
plt.plot(x,sum,label='simul')
plt.legend()
plt.show()
仿真结果为:
可以看出,距离越远,偏差越大;包含的导数项阶数越大,偏差越大。为了观察效果,将仿真范围局限在
[
−
5.1
,
5.1
]
[-5.1,5.1]
[−5.1,5.1],结果如下:
import numpy as np
import matplotlib.pyplot as plt
if __name__=='__main__':
'''
利用多项式函数仿真sin(x)函数,由于sin函数具有特殊的导数特性
sin -> cos -> -sin -> -cos -> sin
0 -> 1 -> 0 -> -1 -> 0
'''
x=np.linspace(-5.1,5.1,511)
sum=np.linspace(0,0,511)
l=[0,1,0,-1]
temp=1
for k in range(6):
if k !=0:
temp=temp*k
sum=sum+l[k%4]/temp*(x**k)
ll=np.linspace(-5,5,501)
plt.plot(ll,np.sin(ll),label='orign')
plt.plot(x,sum,label='simul')
plt.legend()
plt.show()
仿真结果为:
可以看出在
0
0
0点附近贴合的比较紧密,在偏离
0
0
0点较远位置,偏差也比较大。这与我们学习泰勒展开时所学习的也一致,泰勒级数是局部逼近,并非全局逼近。
用连续函数进行逼近与用阶跃函数进行逼近最大的区别就是:用连续函数逼近不用划分区间。因为用阶跃函数逼近函数时,是通过划分区间后的窗口函数进行逼近的,而连续函数逼近则是从定义上进行逼近的。比如多项式函数就是所有单项式加起来的函数去逼近一个函数。而三角函数就是所有的三角函数加起来去逼近一个函数,至于一元和多元的区别,接下来进行分析。
首先看一下一元函数的多项式函数:
f
(
x
)
=
a
0
+
a
1
(
x
−
x
0
)
+
⋯
+
a
n
(
x
−
x
0
)
n
+
⋯
f(x)=a_0+a_1(x-x_0)+\cdots+a_n(x-x_0)^n+\cdots
f(x)=a0+a1(x−x0)+⋯+an(x−x0)n+⋯
多元函数的多项式函数:
f
(
x
)
=
a
0
+
a
1
(
x
1
−
x
10
)
+
a
2
(
x
2
−
x
20
)
+
⋯
+
a
n
(
x
n
−
x
n
0
)
+
a
11
(
x
1
−
x
10
)
2
+
a
12
(
x
1
−
x
10
)
(
x
2
−
x
20
)
+
⋯
+
a
1
n
(
x
1
−
x
10
)
(
x
n
−
x
n
0
)
+
a
21
(
x
2
−
x
20
)
(
x
1
−
x
10
)
+
⋯
+
a
n
n
(
x
n
−
x
n
0
)
2
+
a
111
(
x
1
−
x
10
)
3
+
⋯
f(x)=a_0+a_{1}(x_1-x_{10})+a_{2}(x_2-x_{20})+\cdots+a_{n}(x_n-x_{n0})+a_{11}(x_1-x_{10})^2\\+a_{12}(x_1-x_{10})(x_2-x_{20})+\cdots+a_{1n}(x_1-x_{10})(x_n-x_{n0})+\\a_{21}(x_2-x_{20})(x_1-x_{10})+\cdots+a_{nn}(x_n-x_{n0})^2+a_{111}(x_1-x_{10})^3+\cdots
f(x)=a0+a1(x1−x10)+a2(x2−x20)+⋯+an(xn−xn0)+a11(x1−x10)2+a12(x1−x10)(x2−x20)+⋯+a1n(x1−x10)(xn−xn0)+a21(x2−x20)(x1−x10)+⋯+ann(xn−xn0)2+a111(x1−x10)3+⋯
多元单项式的样子为:
(
x
1
−
x
10
)
k
1
(
x
2
−
x
20
)
k
2
⋯
(
x
n
−
x
n
0
)
k
n
(x_1-x_{10})^{k_1}(x_2-x_{20})^{k_2}\cdots(x_n-x_{n0})^{k_n}
(x1−x10)k1(x2−x20)k2⋯(xn−xn0)kn
一元单项式的样子为:
a
n
(
x
1
−
x
10
)
n
,
n
=
Z
a_{n}(x_1-x_{10})^{n},n=Z
an(x1−x10)n,n=Z
一元多项式就是所有的一元单项式加起来:
∑
n
=
0
+
∞
a
n
(
x
1
−
x
10
)
n
\sum_{n=0}^{+\infty}a_{n}(x_1-x_{10})^{n}
n=0∑+∞an(x1−x10)n
二元多项式就是所有的二元单项式加起来构成的:
∑
n
1
=
0
+
∞
∑
n
2
=
0
+
∞
a
n
1
n
2
(
x
1
−
x
10
)
n
1
(
x
2
−
x
20
)
n
2
\sum_{n_1=0}^{+\infty}\sum_{n_2=0}^{+\infty}a_{n_1n_2}(x_1-x_{10})^{n_1}(x_2-x_{20})^{n_2}
n1=0∑+∞n2=0∑+∞an1n2(x1−x10)n1(x2−x20)n2
我们截取
n
1
+
n
2
≤
1
n_1+n_2\le1
n1+n2≤1的所有项作为近似,也就是:
a
00
+
a
10
(
x
1
−
x
10
)
+
a
01
(
x
2
−
x
20
)
a_{00}+a_{10}(x_1-x_{10})+a_{01}(x_2-x_{20})
a00+a10(x1−x10)+a01(x2−x20)
从中可以看出有三个未定参数
a
00
,
a
01
,
a
10
a_{00},a_{01},a_{10}
a00,a01,a10。可以用
ω
x
+
b
\omega{x}+b
ωx+b表示上述方程。
如果取:
n
1
+
n
2
≤
2
n_1+n_2\le2
n1+n2≤2那么就有:
a
00
+
a
10
(
x
1
−
x
10
)
+
a
01
(
x
2
−
x
20
)
+
a
11
(
x
1
−
x
10
)
(
x
2
−
x
20
)
a_{00}+a_{10}(x_1-x_{10})+a_{01}(x_2-x_{20})+a_{11}(x_1-x_{10})(x_2-x_{20})
a00+a10(x1−x10)+a01(x2−x20)+a11(x1−x10)(x2−x20)
有四个未知参数。