Python金融大数据分析——第9章 数学工具 笔记第9章 数学工具

  • 第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章 数学工具

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值