• 1.以二元一次函数为例(a、b为未知数),当序列点数为1个点或2个点,即序列点数小于拟合函数未知数个数或大于等于拟合函数未知数个数时,用最小二乘法构造目标函数,求其驻点,得到最优的拟合函数系数:


从以上推导可知:

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

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

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

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

import matplotlib.pyplot as plt
import numpy as np
import copy
plt.style.use('seaborn-white')x = [np.linspace(0, 35, 36), np.linspace(0, 9, 10), np.linspace(0, 19, 20)]
# 使绘图时的x取值比多项式拟合时,自变量x的取值更密集,以观察到可能出现的振荡
x_plot = [np.linspace(0, 35, 36*5), np.linspace(0, 9, 10*5), np.linspace(0, 19, 20*5)]
y = [np.random.rand(len(x[0])), np.random.randn(len(x[1]))*10, np.random.randn(len(x[2]))*10]
y[0][int(len(x[0])/2-2):int(len(x[0])/2+2)] = 10
n = [[2, 3, 4], [4, 9, 19], [9, 19, 39]]
weights = [(max(y[i])*2-y[i])/sum(max(y[i])*2-y[i]) for i in range(len(x))]c = copy.deepcopy(n)  # c与n具有相同的结构;一定要用copy.deepcopy,不能用浅拷贝copy,否则后面对c的赋值也会改变n
p = copy.deepcopy(n)  # p与n具有相同的结构
for i in range(len(x)):for j in range(len(n[i])):c[i][j] = np.polyfit(x[i], y[i], n[i][j], full=True, w=weights[i])print('序列长度{0}个点,拟合次数为{1},即目标函数未知数个数为{2},即目标函数对自变量偏导数的方程个数为{2}:'.format(len(x[i]), n[i][j], n[i][j]+1))print('拟合函数的系数(次数由高到低):', '\n', c[i][j][0])print('拟合值与实际值的MAPE:', sum(abs((p[i][j](x[i])-y[i])/y[i]))/len(x[i]))print('目标函数对自变量偏导数方程组的系数矩阵的秩:', c[i][j][2])print('目标函数对自变量偏导数方程组的系数矩阵的奇异值:', '\n', c[i][j][3])print('拟合的相关条件数:', c[i][j][4], '\n')p[i][j] = np.poly1d(c[i][j][0])plt.figure(figsize=(10, 6))plt.scatter(x[i], y[i], facecolors='none', edgecolor='darkblue', label='original_data')plt.plot(x[i], y[i], color='darkblue')plt.plot(x_plot[i], p[i][0](x_plot[i]), '-', color='g', label='polynomial of degree {}'.format(n[i][0]))plt.plot(x_plot[i], p[i][1](x_plot[i]), '--', color='orange', label='polynomial of degree {}'.format(n[i][1]))plt.plot(x_plot[i], p[i][2](x_plot[i]), color='magenta', label='polynomial of degree {}'.format(n[i][2]))plt.ylim(min(y[i])-abs(min(y[i])/2), max(y[i])*1.5)  # 使y坐标的上下限关于y的最大最小值对称,且不受多项式拟合函数的振荡值影响plt.legend()plt.title('series length: {0}, degree of polyfit: {1}, {2}, {3}'.format(len(x[i]), n[i][0], n[i][1], n[i][2]))#########################################################################
def polynomial_all(data, n):  # data为df['amou_crct']"""param:data:理论销售金额,根据节日效应期长度,向左右各取2倍,共5倍长度,若遇节日则剔除补足,并在data全长内剔除周日效应n: 拟合次数return:fitts:经多项式拟合后的各点拟合值"""if len(data) <= 3:raise Exception('历史数据过少,不能计算有效的节日效应系数')else:Y = np.array(data)X = np.linspace(1, len(Y), len(Y))  # 等差数列weights = (max(Y) * 2 - Y) / sum(max(Y) * 2 - Y)C = np.polyfit(X, Y, n, full=True, w=weights)  # C:多项式拟合的系数,其对应的次数从高到低排列p = np.poly1d(C[0])fitts = p(X)return fittsx1 = list(range(1, 26))
y1 = np.random.rand(len(x1))
y1[int(len(x1)/2-2):int(len(x1)/2+1)] = 5
n = 3fitts = polynomial_all(y1, n)plt.figure('序列长度{0}个点,拟合次数为{1}'.format(len(x1), n))
plt.plot(x1, y1, '.', x1, fitts, '-')
plt.ylim(min(y1)-abs(min(y1)/10), max(y1)+max(y1)/10)
  • 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个未知数,在拟合时调用的局部优化的梯度下降算法通常能得到较合理的系数,拟合效果通常较好。

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

拟合函数未知数个数与用于拟合的序列点数的关系相关推荐

  1. [数值计算-12]:什么是函数逼近:插值、拟合、回归

    作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article ...

  2. MATLAB拟合函数使用说明

    (由于不方便上传公式,有部分直接截图) 2. Polyval函数 对应多项式拟合,多项式求值函数也相当重要,可以通过设定向量,快速定义如下多项式 据此,可以大概猜测到polyval调用的形式了 y = ...

  3. matlab中多项式拟合如何给出r方,matlap拟合函数后r^2怎么求

    matlab拟合函数 求助 尝试用二次多项式拟合: clearall; x=2:2:20; y=[0.31.232.416.267.958.529.049.179.299.37]; scatter(x ...

  4. 基于粒子群算法与最小二乘拟合函数参数

    前言 今天更新较晚主要还是学业繁忙,学习素材也不是很好找,可能很多同学们都在做数学建模以及应用统计时都会涉及到函数参数拟合的问题,一般最常用的方法是最小二乘法,但是当函数参数很多时,往往去普通最小二乘 ...

  5. OpenCV fitline直线拟合函数学习

    下图是OpenCV官方文档中,对直线拟合函数的详细介绍: fitLine()函数用于,对二维或三维空间中的点集进行直线拟合.共有六个参数: param 1:输入的点集,可以是Mat或者vector&l ...

  6. polyfit多项式拟合函数的用法

    polyfit函数是matlab中用于进行曲线拟合的一个函数.其数学基础是最小二乘法曲线拟合原理.曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点 ...

  7. 神经网络拟合函数表达式,神经网络拟合效果不好

    神经网络,什么过拟合?,什么是欠拟合? 欠拟合是指模型不能在训练集上获得足够低的误差.而过拟合是指训练误差和测试误差之间的差距太大.考虑过多,超出自变量的一般含义维度,过多考虑噪声,会造成过拟合. 可 ...

  8. 分段二次插值函数表达式_数值分析(拟合、插值和逼近)之数据插值方法(线性插值、二次插值、Cubic插值、埃米尔特zz...

    插值.拟合和逼近的区别 据维基百科,科学和工程问题可以通过诸如采样.实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合,这过 ...

  9. matlab拟合曲线后求导,高手留步:MATLAB五阶拟合函数,求导后离散化,输出结果是星号...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 程序如下: T=1978:1:2012; t1=1978:1:2012; 五阶拟合函数是f5=0.0049664*T^5-49.4903*T^4+1972 ...

  10. matlab三参数拟合函数,数据拟合,有三个参数,提示拟合参数太多,谢谢您啦!...

    出现的问题:提示拟合参数太多.请您指导,谢谢您啦! 自定义拟合函数:y = k/(1-(x/v)^m); 自变量:x; 因变量:y; 需拟合求的参数:k, v, m; 初始值分别为:0.6, 400, ...

最新文章

  1. jquery mobile实例
  2. Script:Speed Up Large Index Create or Rebuild
  3. 谷歌联合创始人:AI发展速度让我吃惊,但未来难料
  4. FFmpeg 音视频同步
  5. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
  6. 【Python CheckiO 题解】Largest Rectangle in a Histogram
  7. 可以用img做参数的成功例子
  8. php+select为空,SELECT时候,如何处理某字段空值?
  9. jquery里判断数组内是否包含了指定的值或元素的方法
  10. Notepad2替换windows自带记事本
  11. Modelsim仿真教程
  12. vscode代码对比差异视图窗口切换方法(左右文件位置切换)
  13. html+默认ie11,IE11浏览器怎么设置默认浏览器
  14. 你们要的日文AI实时字幕来了,谷歌浏览器VS小白浏览器AI大比拼
  15. 统计学学习日记:L10-假设检验p值
  16. MYSQL长时间保持连接
  17. app store账号申请和证书申请发布app
  18. 打印机显示域服务器,操作打印机提示“active directory域服务当前不可用”怎么办?...
  19. 4g网络设置dns地址_网速变慢?你可能需要先设置好 DNS | 科普
  20. MAC PS用图片一个区域的颜色替换另一地方

热门文章

  1. Maxscript - 顶点法线修改脚本Normal Thief源码学习
  2. 解决Linux终端无法复制粘贴现象
  3. PTA——21级数据结构与算法实验3——栈和队列(参考答案)
  4. Android之ANR
  5. 供应链金融你了解多少?
  6. 代码质量检查规则中的 is provided externally to the method and not sanitized b.
  7. 在手机上Link of class 'Lcom/example/test/MainActivity;' failed
  8. 重装Windows 10系统
  9. c++ 求N个数的最大公约数和最小公倍数
  10. 如何屏蔽电脑微信自动更新