- 第9章 数学工具
- 9.1 逼近法
- 9.1.1 回归
- 9.1.2 插值
- 9.2 凸优化
- 9.2.1 全局优化
- 9.2.2 局部优化
- 9.2.3 有约束优化
- 9.3 积分
- 9.3.1 数值积分
- 9.3.2 通过模拟求取积分
- 9.4 符号计算
- 9.4.1 基本知识
- 9.4.2 方程式
- 9.4.3 积分
- 9.4.4 微分
- 9.1 逼近法
第9章 数学工具
9.1 逼近法
在给定区间内通过回归和差值求取该函数的近似值。 首先,我们生成该函数的图形,
更好地观察逼近法所实现的结果。我们感兴趣的区间是[-2π,2π]。下图显示了该函数在通过linspace函数定义的固定区间上的图像。np.linspace(start,
stop,num)返回从 star 开始 , stop 结束的 num 个点, 两个连续点之间的子区间均匀分布:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return np.sin(x) + 0.5 * x
x = np.linspace(-2 * np.pi, 2 * np.pi, 50)
plt.plot(x,f(x),'b')
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
[/code]
![示例函数图形](https://img-
blog.csdn.net/20180702145851925?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxODI1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
### 9.1.1 回归
回归是相当高敬的函数近似值计算工具。 它不仅合求取一维函数的近似值, 在更高维度上也很有效。 得出回归结果所需要的数值化方法很容易实现. 执行也很快速。
本质上, 回归的任务是在给定一组所谓 “基函数” b d ,d∈{1,…,D} 的情况下,根据下面的公式找出最优参数 a ∗ 1 . . .
a ∗ D a 1 ∗ . . . a D ∗ ,其中对于i∈{1,…I}观察点,yi ≡ f(xi)。xi 可以视为自变量观测值,yi
可以视为因变量观测值。
最小化回归问题公式:
min a 1 , . . . a D 1 I ∑ i = 1 I ( y i − ∑ d = 1 D a
d ⋅ b d ( x i ) ) 2 min a 1 , . . . a D 1 I ∑ i = 1 I ( y i − ∑ d =
1 D a d · b d ( x i ) ) 2
**1. 作为基函数的单项式**
最简单的情况是以单项式作为基函数——也就是说 b 1 = 1 , b 2 = x , b 3 = x 2 , b 4
= x 3 . . . b 1 = 1 , b 2 = x , b 3 = x 2 , b 4 = x 3 . . .
在这种情况下,NumPy有确定最优参数(polyfit)和以一组输入值求取近似值(polyval ) 的内建函数。
polyfit函数参数
参数 | 描述
---|---
x | x坐标(自变量值)
y | y坐标(因变量值)
deg | 多项式拟合度
full | 如果为真返回额外的诊断信息
w | 应用到y坐标的权重
cov | 如果为真返回协方差矩阵
```code
# 典型向量化风格的polyfit和polyval线性回归(deg=1)
# 使用 1 次单项式作为基函数
reg = np.polyfit(x, f(x), deg=1)
ry = np.polyval(reg, x)
plt.plot(x, f(x), 'b', label='f(x)')
plt.plot(x, ry, 'r.', label='regression')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
[/code]
![deg=1](https://img-
blog.csdn.net/20180702165637436?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxODI1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
```code
# 使用 5 次单项式作为基函数
reg = np.polyfit(x, f(x), deg=5)
ry = np.polyval(reg, x)
plt.plot(x, f(x), 'b', label='f(x)')
plt.plot(x, ry, 'r.', label='regression')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
[/code]
![deg=5](https://img-
blog.csdn.net/20180702165805194?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxODI1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
```code
# 使用 7 次单项式作为基函数
reg = np.polyfit(x, f(x), deg=7)
ry = np.polyval(reg, x)
plt.plot(x, f(x), 'b', label='f(x)')
plt.plot(x, ry, 'r.', label='regression')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
[/code]
![deg=7](https://img-
blog.csdn.net/20180702165826592?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxODI1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
```code
np.allclose(f(x), ry)
# False
np.sum((f(x) - ry) ** 2) / len(x)
# 0.0017769134759517721
[/code]
简单的检查表明结果并不完美,但是, 均方差(MSE)不是太大——至少在较窄的 x 值区间内。
**2. 单独的基函数**
一般来说, 当选择更好的基函数组时, 可以得到更好的回归结果,
例如利用对函数的认识进行近似值计算。在这种情下,单独的基函数必须通过一个矩阵方法定义(也就是使用NumPy ndarray对象)。
```code
matrix = np.zeros((3 + 1, len(x)))
matrix[3, :] = x ** 3
matrix[2, :] = x ** 2
matrix[1, :] = x
matrix[0, :] = 1
reg = np.linalg.lstsq(matrix.T, f(x))[0]
reg
# array([ 1.52685368e-14, 5.62777448e-01, -1.11022302e-15,
# -5.43553615e-03])
ry = np.dot(reg, matrix)
plt.plot(x, f(x), 'b', label='f(x)')
plt.plot(x, ry, 'r.', label='regression')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
[/code]
![通过最小二乘函数的回归](https://img-
blog.csdn.net/20180702172734640?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjAxODI1OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
图中的结果并不真的如预期那么好。使用更通用的方法,可以利用对示例函数的认识。我们知道函数中有一个 sin 部分。因此,在基函数中包含一个正弦函数是有意义的。
为了简单起见. 我们替换最高次的单项式:
```code
matrix[3, :] = np.sin(x)
reg = np.linalg.lstsq(matrix.T, f(x))[0]
ry = np.dot(reg, matrix)
plt.plot(x, f(x), 'b', label='f(x)')
plt.plot(x, ry, 'r.', label='regression')
plt.legend(loc=0)
plt.grid(True)
plt.xlabel('x')
plt.ylabel('f(x)')
[/code]
![使用单独函数的回归](https://img-
blog.csdn.net/2018070217312928?watermark/2/text/aHR0cHM6L