计算方法——数据拟合

1、引入:单变量数据拟合

原先的插值要求给出的数据点要在拟合的函数上,但数据拟合,只需整体“近似”,不强求所有的数据点一致

假设给出数据:

那么 偏差 的定义为:

        \delta_i = f(x_i)-F(x_i)

但是偏差“大小”,最好是用绝对值表示,因此,运算时将拟合函数和被拟合函数之间的偏差表示为:

                        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \sum_{i=0}^{n}(f(x_i)-F(x_i))^2

对于单变量数据:上述x_i是一个标量

设拟合函数为:F(x) = a+bx

那么偏差值 = \sum_{i=1}^{8}(y_i-a-bx_i)^2

要使偏差值最小,求解目标是a和b,则用偏差值(函数)对a和b求偏导

设偏差值函数为 \varphi(a,b) = \sum_{i=1}^{8}(y_i-a-bx_i)^2

\frac{ \partial \varphi(a,b)}{\partial a} = -2\sum_{i=1}^{8}(y_i-a-bx_i)

\frac{ \partial \varphi(a,b)}{\partial b} = -2\sum_{i=1}^{8}(y_i-a-bx_i)x_i

令偏导等于0,那么就能得到两个方程,足以解两个未知数

2、多变量数据拟合

基本的求解思路:求偏差函数——求偏导——解方程 已经通过上述内容展示过了,对于多变量数据我们考虑的情况是:

x_i 不是一个标量而是一个向量,也就是说对于被拟合的原函数,它有若干个自变量

可以设拟合函数为 F(x_1,x_2,..,x_n) 【注意:这里的x_1,x_2,..,x_n 不是一个一个的数据点,而是一个数据x向量的x1坐标,x2坐标,...,xn坐标】

给定数据表格:

我们假设表中数据呈线性关系[这里指的是y和x],则可以设

        ​​​​​​​        F(x_1,x_2,..,x_k) = a_0+a_1x_1+a_2x_2+...+a_kx_k

依旧求偏差:

然后求偏导,具体偏导求解不再展开,因为下文要介绍更为简单、便于【计算机】计算的矩阵形式

2、矩阵形式

1)知识准备

参考:矩阵的四大基础子空间 - 知乎 (zhihu.com)

a) 矩阵四个基本子空间

对于一个矩阵A:

列空间(C(A)): 假设存在x,使得Ax = b,那么b属于A的列空间

零空间 :所有满足Ax = 0的向量x的集合就称之为矩阵A的零空间

行空间(R(A)):假设存在x,使得A^{T}x = b ,那么b属于R(A)

左零空间 :所有满足yA^T = 0的向量y的集合,称为矩阵A的左零空间,记为N(A^T)

b) 四空间的正交关系

正交的定义:两个向量的点积为零,那么这两个向量是正交的

空间正交的定义:如果两个空间中的任意的两个向量是正交的,则这两个空间的正交的

四空间的正交关系

  •        列空间与左零空间正交
  •        行空间与零空间正交

2)数据拟合的矩阵形式

对 F(x_0,x_1,..,x_k) = a_0+a_1x_1+...+a_kx_k

可以改写为矩阵:

A = \begin{bmatrix} 1, x_{11} ,x_{12},...,x_{1k}\\ 1, x_{21} ,x_{22},...,x_{2k}\\ ...,,...,...,...,...\\ 1, x_{n1} ,x_{n2},...,x_{nk} \end{bmatrix}

x = \begin{bmatrix} a_0\\ a_1\\ ... \\ a_k \end{bmatrix}

b = \begin{bmatrix} y_1\\ y_2\\ ..\\ y_k \end{bmatrix}

原函数为 Ax = b :

代入真实的数据点(以表3-2的数据为例子),那么各个矩阵结果为:

A = \begin{bmatrix} 1&-1 \\ 1&0 \\ 1& 1\\ 1& 2\\ 1& 3\\ 1& 4\\ 1& 5\\ 1&6 \end{bmatrix} x = \begin{bmatrix} a_0\\ a_1 \end{bmatrix} b = \begin{bmatrix} 10\\ 9\\ 7\\ 5\\ 4\\ 3\\ 0\\ -1 \end{bmatrix}

对于Ax = b

若有解,那么偏差应该是0,所有的数据点都被拟合到了

若无解,那么要考虑使得偏差最小的向量x

偏差的表达式 = Ax-b

使得偏差的模长最小,即\min ||Ax-b||_2^2,求导:

\frac{\partial f(x)}{\partial x} = \frac{\partial ||Ax-b||_2^2}{\partial x} = 2A^T(Ax-b)

则要使偏差模长最小,就要令 A^T(Ax-b) = 0

2)编程测一下

例题:

import numpy as np

def createA_b(X,Y):
  n = len(X)
  dim = len(X[0])+1
  A = np.ones(shape=(n,dim))
  b = np.zeros(shape=(n,1))
  for row in range(n):
    b[row][0] = Y[row]
    for i in range(1,dim):
      A[row][i] = X[row][i-1]
  
  return A,b

# A^Ttmp = 0 算tmp
def cal_Right(A):
  s = A.shape[0]
  Zero = np.zeros(shape=(s,1))
  x,_,_,_ = np.linalg.lstsq(A,Zero,rcond=None)
  return x

X = [[1,1],[1,2],[2,1],[2,2],[2,3]]
Y = [7,9,10,11,12]
A,b = createA_b(X,Y)

# 使用最小二乘法求解 Ax = b(不要求方阵)
Ax_b = cal_Right(A.T)
x,residuals,_,_ = np.linalg.lstsq(A,b+Ax_b,rcond=None)

print("解向量 x:\n", x)
print("残差平方和:", residuals)

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值