欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)

程序员文章站 2023-11-29 11:23:40
以二元一次函数为例(a、b为未知数),当序列点数为1个点或2个点,即序列点数小于拟合函数未知数个数或大于等于拟合函数未知数个数时,用最小二乘法构造目标函数,求其驻点,得到最优的拟合函数系数:从上图中可以看到,当拟合函数有两个系数,而只有一个点可用于拟合时,虽然在求解最优系数时,仍有两个偏导数方程,但这两个方程线性相关,其实只有一个方程是有效的,因为只有一个点进行拟合,所以这时系数a、b无解或有无穷多解。当有两个点用于拟合时,这两个方程线性无关,系数矩阵行满秩,这时a、b有唯一解。下面以pyth....
  • 1.以二元一次函数为例(a、b为未知数),当序列点数为1个点或2个点,即序列点数小于拟合函数未知数个数或大于等于拟合函数未知数个数时,用最小二乘法构造目标函数,求其驻点,得到最优的拟合函数系数:

数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)
从以上推导可知:

  • 当拟合函数有两个系数,而只有一个点可用于拟合时,虽然在求解最优系数时,仍有两个偏导数方程,但这两个方程线性相关,其实只有一个方程是有效的,因为只有一个点进行拟合,相当于一个方程无法求解两个未知数,所以这时系数a、b有无穷多解;表现在几何上则是过一点有无穷多条最优直线,使真实值与拟合值的差值平方和最小。

  • 当有两个点用于拟合时,这两个方程线性无关,系数矩阵行满秩,相当于两个方程可以求解两个未知数,这时a、b有唯一解;表现在几何上则是过两点有唯一一条最优直线,使真实值与拟合值的差值平方和最小。

  • 当有多个点用于拟合时,这两个方程线性无关,系数矩阵行满秩,相当于两个方程可以求解两个未知数,这时a、b有唯一解;表现在几何上则是过多点有唯一一条最优直线,使真实值与拟合值的差值平方和最小。

  • 2.下面以python中多项式拟合为例,使拟合函数系数的个数分别小于或大于用于拟合的序列点数,查看各自的拟合图形和返回参数,并作出说明。

import matplotlib.pyplot as plt
import numpy as np


# 序列长度10个点,拟合次数为4和19时
x1 = list(range(10))
y1 = np.random.randn(len(x1))*10

c1 = np.polyfit(x1, y1, 4, full=True)
print('序列长度10个点,拟合次数为4,即目标函数未知数个数为5,即目标函数对自变量偏导数的方程个数为5:')
print('拟合函数的系数(次数由高到低):', '\n', c1[0])
print('拟合值与实际值的残差平方和:', c1[1])
print('目标函数对自变量偏导数方程组的系数矩阵的秩:', c1[2])
print('目标函数对自变量偏导数方程组的系数矩阵的奇异值:', '\n', c1[3])
print('拟合的相关条件数:', c1[4], '\n')
p1 = np.poly1d(c1[0])

c2 = np.polyfit(x1, y1, 19, full=True)
print('序列长度10个点,拟合次数为19,即目标函数未知数个数为20,即目标函数对自变量偏导数的方程个数为20:')
print('拟合函数的系数(次数由高到低):', '\n', c2[0])
print('拟合值与实际值的残差平方和:', c2[1])
print('目标函数对自变量偏导数方程组的系数矩阵的秩:', c2[2])
print('目标函数对自变量偏导数方程组的系数矩阵的奇异值:', '\n', c2[3])
print('拟合的相关条件数:', c2[4], '\n')
p2 = np.poly1d(c2[0])

plt.figure('序列长度10个点,拟合次数为4和19')
xp1 = np.linspace(0, len(x1)-1, 100)
_ = plt.plot(x1, y1, '.', xp1, p1(xp1), '-', xp1, p2(xp1), '--')
plt.ylim(-max(abs(y1))*5, max(abs(y1))*5)


# 序列长度20个点,拟合次数为9和39时
x2 = list(range(20))
y2 = np.random.randn(len(x2))*10

c1 = np.polyfit(x2, y2, 9, full=True)
print('序列长度20个点,拟合次数为9,即目标函数未知数个数为10,即目标函数对自变量偏导数的方程个数为10:')
print('拟合函数的系数(次数由高到低):', '\n', c1[0])
print('拟合值与实际值的残差平方和:', c1[1])
print('目标函数对自变量偏导数方程组的系数矩阵的秩:', c1[2])
print('目标函数对自变量偏导数方程组的系数矩阵的奇异值:', '\n', c1[3])
print('拟合的相关条件数:', c1[4], '\n')
p1 = np.poly1d(c1[0])

c2 = np.polyfit(x2, y2, 39, full=True)
print('序列长度20个点,拟合次数为39,即目标函数未知数个数为40,即目标函数对自变量偏导数的方程个数为40:')
print('拟合函数的系数(次数由高到低):', '\n', c2[0])
print('拟合值与实际值的残差平方和:', c2[1])
print('目标函数对自变量偏导数方程组的系数矩阵的秩:', c2[2])
print('目标函数对自变量偏导数方程组的系数矩阵的奇异值:', '\n', c2[3])
print('拟合的相关条件数:', c2[4], '\n')
p2 = np.poly1d(c2[0])

plt.figure('序列长度20个点,拟合次数为9和39')
xp2 = np.linspace(0, len(x2)-1, 100)
_ = plt.plot(x2, y2, '.', xp2, p1(xp2), '-', xp2, p2(xp2), '--')
plt.ylim(-max(abs(y2))*5, max(abs(y2))*5)

  • 3.序列长度10个点,拟合次数为4,即目标函数未知数个数为5,即目标函数对自变量偏导数的方程个数为5:
    数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)
    数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)

  • 当序列点数为10,拟合次数为4时,有5个系数,目标函数对自变量偏导数的方程有5个,目标函数对自变量偏导数方程组的系数矩阵的秩为5,系数矩阵行满秩,有5个奇异值;由于行满秩,此时若调用求解方法通常可得到系数的唯一实数解;np.polyfit内部调用的局部优化的梯度下降算法也能得到较合理的系数,从而得到较好的拟合结果。

  • 当序列点数为10,拟合次数为19时,有20个系数,目标函数对自变量偏导数的方程有20个,目标函数对自变量偏导数方程组的系数矩阵的秩为10,系数矩阵行不满秩,有10个奇异值;由于行不满秩,此时若调用求解方法无法解出系数,方程组无解或有无穷多解;np.polyfit内部调用的局部优化的梯度下降算法也不能得到合理的系数,从而使拟合区间内部出现剧烈震荡。

  • 4.序列长度20个点,拟合次数为9,即目标函数未知数个数为10,即目标函数对自变量偏导数的方程个数为10:
    数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)数据算法(拟合函数未知数个数与用于拟合的序列点数的关系)

  • 当序列点数为20,拟合次数为9时,有10个系数,目标函数对自变量偏导数的方程有10个,目标函数对自变量偏导数方程组的系数矩阵的秩为10,系数矩阵行满秩,有10个奇异值;由于行满秩,此时若调用求解方法可得到系数的唯一解;np.polyfit内部调用的局部优化的梯度下降算法也能得到较合理的系数,从而得到较好的拟合结果。

  • 当序列点数为20,拟合次数为39时,有40个系数,目标函数对自变量偏导数的方程有40个,目标函数对自变量偏导数方程组的系数矩阵的秩为20,系数矩阵行不满秩,有20个奇异值;由于行不满秩,此时若调用求解方法无法解出系数,方程组无解或有无穷多解;np.polyfit内部调用的局部优化的梯度下降算法也不能得到合理的系数,从而使拟合区间内部出现剧烈震荡。

  • 5.总结

  • 当未知数个数<<序列点数时,目标函数对自变量偏导数方程组的系数矩阵行满秩,调用求解方法通常能求出方程组的实数解,相当于用n个方程解n个未知数,在拟合时调用的局部优化的梯度下降算法也能得到较好的系数,从而得到较好的拟合效果。

  • 当未知数个数>序列点数时,目标函数对自变量偏导数方程组的系数矩阵行不满秩,调用求解方法不能求出方程组的解,相当于用n个方程不能解出大于n个的未知数,在拟合时调用的局部优化的梯度下降算法也不能得到合理的系数,在拟合区间内部就会出现剧烈震荡。

  • 当未知数个数=序列点数,且未知数个数较少时,目标函数对自变量偏导数方程组的系数矩阵行满秩,调用求解方法通常能求出方程组的实数解,相当于用少数n个方程求解少数n个未知数,在拟合时调用的局部优化的梯度下降算法通常能得到较合理的系数,拟合效果通常较好。

  • 当未知数个数=序列点数,且未知数个数较多时,目标函数对自变量偏导数方程组的系数矩阵行满秩,由于未知数较多,调用求解方法通常不能求出方程组的实数解,在拟合时调用的局部优化的梯度下降算法通常不能得到较合理的系数,拟合效果通常不好,在拟合区间内部易出现剧烈震荡。

本文地址:https://blog.csdn.net/qq_22828175/article/details/107080227