多项式拟合求解

目录

简介

基本原理

例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_fit


def 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 * 1
    X = np.linalg.inv(M.T @ M) @ M.T @ Y
    return X


def 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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos7.9搭建zabbix6.4.0过程及报错注意点

搭建参考此链接即可:https://blog.csdn.net/PerDrix/article/details/129624091 报错整理: 一、zabbix6.0以上版本默认必须安装mysql 8.0.30以上版本数据库,否则服务起不来 二、编译安装zabbix时,必须执行如下操作,…

【STM32】STM32学习笔记-课程简介(1)

00. 目录 文章目录 00. 目录01. 课程简介02. 硬件设备03. 软件工具04. 硬件套件4.1 面包板和跳线/飞线4.2 杜邦线和STM32最小系统板4.3 STLINK和OLED显示屏4.4 LED和按键4.5 电位器和蜂鸣器4.6 传感器和旋转编码器4.7 USB转串口和MPU60504.8 Flash闪存和电机模块4.9 SG90舵机 0…

人工智能中的模型评估

1 概述 1.1 定义 人工智能(AI)模型评估是一个关键的过程,用于确定模型在特定任务上的性能和有效性。这个过程涉及使用各种技术和指标来衡量模型的准确度、可靠性、泛化能力以及其他重要特性。在不同的应用场景中,模型评估的具体…

深入解析JVM内存结构:Metaspace、堆与垃圾收集器

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

Overflow Aware Quantization

Overflow Aware Quantization Framework N o _o o​是 amount of arithmetic overflow 辅助信息 作者未提供代码

前端开发环境与真实环境的接口联通的那些最佳实践

1. 背景 前端开发的产物通常是 app.js 、app.css ,然后将这些资源放在真实环境域名下进行工作的。 但前端的开发环境通常是本地的 http://localhost:xxx,业务域名可能是 https://xxx.abc.com,两者不在一个域名下在调用接口或者调试时会非常不…

NacosSync 用户手册

手册目标 理解 NacosSync 组件启动 NacosSync 服务通过一个简单的例子,演示如何将注册到 Zookeeper 的 Dubbo 客户端迁移到 Nacos。 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范…

变量和引用

变量和引用 2.1.深入认识变量 2.1.1.什么是变量 变量是在程序中保存用户数据的一段内存存储空间,变量名是内存空间的首地址 变量三要素:名称、类型、值 2.1.2.变量的名称 组成: 字母、数字、下划线组成,不能以数字开头 变量名称的长…

PyLMKit(4):基于本地知识库的检索增强生成RAG

基于本地知识库的检索增强生成RAG 0.项目信息 日期: 2023-12-2作者:小知课题: RAG(Retrieval-Augmented Generation,检索增强生成)是一种利用知识库检索的方法,提供与用户查询相关的内容,从而…

代码随想录day3 203.移除列表元素 707.设计链表 206.反转链表

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。 双链表 单链表中的指针域只能指向节点的下一个节点。 双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。 双链表 既可以向前查询也可以…

vcomp140.dll是什么意思?vcomp140.dll缺失怎么修复的五个方法

在电脑使用过程中,我们常常会遇到一些错误提示,其中之一就是“由于找不到vcomp140.dll无法继续执行代码”。这个错误提示通常出现在运行某些程序时,给使用者带来了很大的困扰。那么,为什么会出现这个错误呢?又该如何解…

借助ChatGPT帮助程序员解决系统线上问题

对不同的业务以及不同的中间件提问题的方式不同 首先我们在每一种类型的提问前都需要对AI进行定义也就是让AI明白你提问的问题是那个行业的那个技术 定义身份话术 常见的 #接下来的对话你将以一名java高级开发工程师的身份和我聊天 接下来的对话你将以一名XXXX的身份和我聊天提…

关于Typora如何插入自己的云端视频的方法

关于Typora如何插入自己的云端视频的方法 文章目录 关于Typora如何插入自己的云端视频的方法前言:实现步骤:小结 前言: 我本来使用gitee来作为typora的图床,但我现在想要把我自己的视频上传到云端,然后通过超链接在ty…

Programming Contest 2023(AtCoder Beginner Contest 331)D题 Tile Pattern --- 题解

目录 D - Tile Pattern 题目大意: 思路: 代码: D - Tile Pattern D - Tile Pattern (atcoder.jp) 题目大意: 给你一个n和q,n为局部棋盘大小(n*n) 并且给出局部棋盘中黑白子位置的放置情况,q为查询次数…

java的四种内部类,从0讲清楚

什么是内部类? 为什么要学习内部类? 可以发现,发动机虽然跟汽车相关,但发动机不像车龄或颜色一样,只用一个变量就可以描述,而是要有发动机品牌,发动机年限,多个变量描述发动机。那么…

从“芯”到云,看亚马逊云科技如何让未来“平等”发生

文章目录 业界最全面算力选择,有效解决多样性需求多年自研芯片积累,带来性能与性价比双重优势全球基础设施与独特的业务模式,让创新不受限 “科幻作家威廉吉布森说‘未来已至,只是还没有均匀分布’。”2023年6月底,当亚…

【开源存储】minio对象存储部署实践

文章目录 一、前言1、介绍说明2、部署方式3、冗余模式4、约束限制4.1、规格参数4.2、API支持a、minio不支持的Amazon S3 Bucket APIb、minio不支持的Amazon S3 Object API 二、部署说明1、软件安装2、minio单机部署3、minio分布式部署3.1、前置条件3.2、开始运行3.3、操作说明 …

Linux 进程(三)

Linux进程状态的查看: 这是Linux内核源代码对于进程状态的定义: R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。 S睡眠状态(sleeping): 意味着进程在…

ipvlan介绍

最近使用docker,涉及到需要跨多台物理机部署系统,查了好多资料,最后查到了ipvlan。那什么是vlan,什么又是ipvlan。 交换机层面的vlan,是按802.1Q规范,在链路层中加了4字节的标识vlan的数据,交换…

如何在WordPress中批量替换图片路径?

很多站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题。总结一下WordPress图片路径批量替换的过程,方便有此类需求的站长们学习。 什么情况下批量替换图片路径 1、更换了网站域名 有许多网站建设初期…