多项式拟合求解

目录

简介

基本原理

例1

例2

例3

参考资料


简介
 

多项式拟合可以用最小二乘求解,不管是一元高阶函数,还是多元多项式函数,还是二者的混合,都可以通过统一的方法求解。当然除了最小二乘法,还是其他方法可以求解,比如迭代的梯度下降法,这里重点介绍最小二乘法求解。

基本原理

多项式拟合,目标函数可以表示为

对目标函数求导,再令导数为0,即可求解。

例1

比如函数形式为:

y = a0 + a1*x + a2*x*x + a3*x*x*x

这里以3阶为例,通过N组数据(N>=4)拟合出系数a0,a1,a2,a3,则可以用最小二乘法求解

A = inv(M.T @ M) @ M @ Y

M矩阵是N x 4, 其中的4为[1, x, x*x, x*x*x]

Y是列N x 1,求得的A为4 x 1

如果是N阶的,只要把4替换成N+1即可。

例2

比如函数形式为

y = a0 + a1 * x1 * x2  这种形式,是两元函数,也可以用类似的方法求解。其中的M矩阵是N x 2的,其中的2为[1, x1*x2]。这些拟合其实也可以通过Python函数库curve_fit来求解,具体可以参考如下代码。代码里使用curve_fit求解了,使用最小二乘也求解了,得到的结果非常接近。

import os
import cv2
import random
import copy
import numpy as np
import math
from scipy.optimize import curve_fitdef func1(x, a, b):r = a + b * x[0] * x[1]return r.ravel()def LeastSquare(M, Y):# y = M @ x, 求解X,y:nx1  M:n * xs  x: xs * 1X = np.linalg.inv(M.T @ M) @ M.T @ Yreturn Xdef Test():# xx = np.indices([4, 2])xx = np.random.random([2, 4])y = 10 + 5 * xx[0, :] * xx[1, :]print(xx)print(y)z = func1(xx, 10, 5) + np.random.normal(size=4)/100# z = func1(xx, 10, 5)print(z)prot, tmp = curve_fit(func1, xx, z)print('curve_fit:', prot)print('误差:', tmp)matM = np.ones((4, 2), np.float32)for i in range(4):matM[i, 1] = xx[0, i] * xx[1, i]out = LeastSquare(matM, z.reshape(-1, 1))print('least square:', out)if __name__ == "__main__":Test()

运行的结果如下,可以看到二者的结果非常接近。 

[[0.16495595 0.75923904 0.83520597 0.64013137][0.04531869 0.68136656 0.54886631 0.18077084]]
[10.03737794 12.58660045 12.29208211 10.57858545]
[10.0294282  12.5906653  12.29289287 10.57768172]
curve_fit: [9.99406627 5.01797846]
误差: [[ 5.20691649e-06 -1.16488038e-05][-1.16488038e-05  4.24005611e-05]]
least square: [[9.99406455][5.01798235]]

例3

比如函数形式为

y = a0 + a1 * x1 * x2 + a2 * x2 * x3 + a3 * x1 * x3 + a4 * x1 * x2 * x3

求解中,M矩阵为N x 5,其中的5为[1, x1*x2, x2*x3, x1*x3, x1*x2*x3],类似例2中,使用相似的方法,构造出M矩阵,Y的数据,就可以求解出a0, a1, a2, a3, a4。

这里以这三个例子来说明,主要是最近做数据拟合时,会使用到这三种形式,之前都是通过调用curve_fit函数来实现,如果写成C代码,就可以使用最小二乘,不过中间有求逆运算,可能还是要调用第三方库函数来实现,这三种例子里涉及的求逆运算主要有4阶,2阶和5阶,如果形式固定,自己编写C代码实现求逆运算也是可以的。 

 

参考资料

线性模型(二)之多项式拟合_多项式拟合模型流程图-CSDN博客 

Python之curve_fit多元函数拟合_curve_fit函数_微小冷的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/208949.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot数据源配置

springboot数据源配置 数据层解决方案——持久化技术 内置持久化解决方案——jdbcTemplate 内置数据库 H2一般用于测试环境,配置profiels,只在开发阶段使用,让他在上线的时候不走这里就可以了 要使用内嵌的数据库H2,要先导入jar包

sCrypt 现已支持各类主流前端框架

sCrypt 现已支持各类主流前端框架,包括: ReactNext.jsAngularSvelteVue 3.x or 2.x bundled with Vite or Webpack 通过在这些支持的前端框架中集成sCrypt开发环境,你可以直接在前端项目里访问合约实例和调用合约,方便用户使用Se…

30、LCD1602

LCD1602介绍 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:162个字符,每个字符为5*7点阵 …

智能优化算法应用:基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于和声算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.和声算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

pybind11教程

pybind11教程 文章目录 pybind11教程1. pybind11简介2. cmake使用pybind11教程3. pybind11的历史 1. pybind11简介 项目的GitHub地址为: pybind11 pybind11 是一个轻量级的头文件库,用于在 Python 和 C 之间进行互操作。它允许 C 代码被 Python 调用&am…

力扣每日一题day26[42. 接雨水]

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

Day12 qt QMianWindow,资源文件,对话框,布局方式,常用ui控件

QMianWindow 概述 QMainWindow 是一个为用户提供主窗口程序的类,包含一个菜单栏( menu bar )、多 个工具栏 (tool bars) 、多个铆接部件 (dock widgets) 、一个状态栏 (status bar) 及 一个中心部件 (central widget) 许多应用程序的基础…

算法设计与实现--贪心篇

贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法,以期望能够通过一系列局部最优的选择达到全局最优。贪心算法的关键是定义好局部最优的选择,并且不回退,即一旦做出了选择,就不能撤销。 一般来说&#xf…

Python图表神器:Matplotlib库绘制图表轻松有趣

更多资料获取 📚 个人网站:ipengtao.com Matplotlib是Python中用于绘制图表和数据可视化的重要库。它提供了丰富的功能和灵活性,可用于生成各种类型的图表,从简单的折线图到复杂的三维图表。 1. 基本图表绘制 折线图 Matplotl…

TCP连接为什么是三次握手,而不是两次和四次

答案 阻止重复的历史连接同步初始序列号避免资源浪费 原因 阻止重复的历史连接(首要原因) 考虑这样一种情况: 客户端现在要给服务端建立连接,向服务端发送了一个SYN报文段(第一次握手),以表示请…

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用时间处理工具

文章目录 1️⃣ 时间处理工具1.1 格式化时间1.2 把时间戳改成日期格式1.3 Day.js 工具类使用1.4 date-fns 工具类使用 优质资源分享 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134712978 ElectronTsVueVite桌面应用…

TCP三次握手与四次挥手

TCP三次握手与四次挥手 TCP三次握手与四次挥手解析 客户端连接服务器(三次握手)客户端关闭与服务器连接(四次挥手) 总结 TCP三次握手与四次挥手、流量控制(滑动窗口)、拥塞控制、半连接状态、2MSL TCP三次握手与四次挥手 TCP标…

深度学习-模型调试经验总结

1、 这句话的意思是:期望张量的后端处理是在cpu上,但是实际是在cuda上。排查代码发现,数据还在cpu上,但是模型已经转到cuda上,所以可以通过把数据转到cuda上解决。 解决代码: tensor.to("cuda")…

分享66个焦点幻灯JS特效,总有一款适合您

分享66个焦点幻灯JS特效,总有一款适合您 66个焦点幻灯JS特效下载链接:https://pan.baidu.com/s/10bqe09IAZt_hbsZlXaxkxw?pwd6666 提取码:6666 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,…

C++-内存管理

目录 一.C/C内存分布 二. C语言中动态内存管理方式:malloc/calloc/realloc/free 三. C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四.C语言中的动态开辟内存空间和C中的区别 1.对于开辟内置类型 2.…

office tool plus工具破解word、visio等软件步骤

第一步:下载工具 破解需要用到office tool plus软件 office tool plus软件下载地址:Office Tool Plus 官方网站 - 一键部署 Office 选择其中一个下载到本地(本人选择的是第一个的云图小镇下载方式) 第二步:启动工具 …

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合

群晖NAS:docker(Container Manager)、npm安装Verdaccio并常见命令集合 自建 npm 资源库,使用Verdaccio。如果觉得麻烦,直接可以在外网注册 https://www.npmjs.com/ 网站。大同小异,自己搭建搭建方便局域网…

内存函数​(memcpy、memmove、memset、memcmp)

目录 一、memcpy的使用和实现 使用: 模拟实现: 二、memmove 使用和模拟实现 模拟实现: 2.1难点: 覆盖拷贝所在的问题 memset的使用 memcmp的函数的使用​ 一、memcpy的使用和实现 memcpy 拷贝的就是不重叠的内存。 参数…

ChatGPT 的 18 种玩法,你还不会用吗?

你确定,你会使用 ChatGPT 了吗? 今天给大家整理了 18 种 ChatGPT 的用法,看看有哪些方法是你能得上的。 用之前我们可以打开R5Ai平台,可以免费使用目前所有的大模型 地址:R5Ai.com 语法更正 用途:文章…

ChatGPT 问世一周年之际,开源大模型能否迎头赶上?

就在11月30日,ChatGPT 迎来了它的问世一周年,这个来自 OpenAI 的强大AI在过去一年里取得了巨大的发展,迅速吸引各个领域的用户群体。 我们首先回忆一下 OpenAI和ChatGPT这一年的大事记(表格由ChatGPT辅助生成)&#x…