最小二乘法(least squares)的曲线拟合(curve fitting)

第三十八篇 最小二乘法的曲线拟合

如果我们想得到一个通过大量由实验或者计算机程序获得的数据点的函数,它实际是在寻找一个“最适合”数据的函数,而不是一个完全经过所有点。可以采用各种策略来最小化各个数据点之间的误差和逼近函数。其中最著名的是最小二乘法,它让用户能够自由选择在曲线拟合中使用的函数类型。这种方法也被称为具有两个或两个以上的自变量的“线性回归”或“多元线性回归”,。

最小二乘法

考虑np数据点(x1, y1),(x2, y2),…,(np, ynp),其中,x表示自变量[x1, x2,…],xnv]T, y为因变量。自变量的数目nv可以取任何期望的值,虽然在传统的线性回归中它被设为1。所需的“最好匹配”的函数可以写成这样的形式
在这里插入图片描述
其中fj(x), j = 1,2,…,k为选函数的属于x, Cj, j = 1,2,…,k是常数,通过最小二乘法过程得到的最优解。线性回归中的“线性”一词仅指上面方程中模型对Cj常数的依赖性。fj(属于x)函数由用户来控制,如果需要可以是非线性的。
目标是使F(x)尽可能接近y,因此,考虑以下每个np数据点上这些量之间的差的平方和
在这里插入图片描述
上面方程给出的误差项可以通过E对每个常数Cj的偏导来最小化,并使结果等于零,从而
在这里插入图片描述
这样的k个线性联立方程的对称形式可以写成矩阵形式
在这里插入图片描述
在这里插入图片描述
使用线性求解中的方法求出C1, C2,…。最后,将优化后的Cj常数代回曲线拟合方程1,根据需要进行进一步插值。

计算实例:

使用最小二乘法去推导最好的拟合直线,对于np个数据点(x1, y1),(x2, y2),…,(xnp , ynp )。
这个例子只有一个自变量x,因此nv=1。而且,如果一个线性方程能拟合数据,下面的方程牵扯到两个未知常量(k=2)
在这里插入图片描述
其中f1(x)=1,f2(x)=x
从方程1可以得到
在这里插入图片描述
它能够求解得到
在这里插入图片描述
把c1和c2代入到方程F(x)中,经典线性回归方程能获得。
数据的相关联系数可以得到,
在这里插入图片描述
决定系数由r2得到,是数据线性依赖程度的度量。

数据的线性化

为了使用最小二乘法,所提出的曲线拟合函数必须是方程(5.39)的“线性”标准形式。在工程分析中经常遇到的一些有用的曲线拟合函数最初并不是这种形式,但是可以通过简单的变量变换转化为标准形式。
例如,考虑尝试采取“幂数定律”形式的函数
在这里插入图片描述
上面的函数不是一个标准的形式,因为常量B作为幂数,不是简单乘法的系数。通过取两边的对数得到
在这里插入图片描述
现在如果做一个替换,X=lnx和Y=lny得到
在这里插入图片描述
或者一个标准形式为
在这里插入图片描述
其中C1=lnA和C2=B,变量的改变得到了标准形式下lnx和lny的线性关系。最小二乘法将得到最合适的系数C1和C2,代入到原来的方程中得到A=e**c1和B=C2
这个进程可以命名叫做‘线性化’过程,能被用在大量初始不为标准形式的函数中。一些例子中,直转化一个变量就能实现线性化。一些方程的线性化展示在下表中。
在这里插入图片描述

计算实例

一个阻尼振子有一个固有频率w=91.7/s。在自由振动中,测量出随着时间振幅衰减的数据为
在这里插入图片描述
拟合的目标曲线为:
在这里插入图片描述
使用最小二乘法去发现这个函数,然后计算临界阻尼ζ.
这个指数衰减曲线拟合函数并不是标准形式,所以需要转化。初始方程为,
在这里插入图片描述
参考之前的转化表能得到线性形式
在这里插入图片描述
因此
在这里插入图片描述
其中Y = lny X = t,C1 = lny0,C2 = - 91.7ζ。根据最开始的最小二乘法拟合函数,建立联立方程的函数为f1(X)=1, f2(X) = X。
对于手算时,推荐采用表格表示,得到
在这里插入图片描述
从方程1得到,
在这里插入图片描述
得到解为
在这里插入图片描述
因为C2 =−18.210,那么就得出ζ =−18.210/−91.7 = 0.20。

程序如下

分为一个主程序,和两个子程序,分别为天际线存储向量的乔列斯基分解子程序sparin,和逆向迭代求解的子程序spabac。详情可见以天际线存储矩阵系数的乔列斯基分解

#最小二乘法的曲线拟合
import numpy as np
import math
import B
npt=5;nv=1;nc=2
kdiag=np.zeros((nc),dtype=np.int64)
kv=np.zeros(nc*(nc+1)//2)
f=np.zeros((nc))
c=np.zeros((nc))
x=np.zeros((npt,nv))
y=np.zeros((npt))
x[:,0]=(29,50,74,103,118)
y[:]=(1.6,23.5,38.0,46.4,48.9)
print('最小二乘法的曲线拟合')
my=sum(y)/npt
def f54(x,f):f[0]=1.0f[1]=math.log(x[0])return f54
for i in range(1,npt+1):f54(x[i-1,:],f);ic=0for j in range(1,nc+1):c[j-1]=c[j-1]+f[j-1]*y[i-1]for k in range(1,j+1):ic=ic+1;kv[ic-1]=kv[ic-1]+f[j-1]*f[k-1]
for i in range(1,nc+1):kdiag[i-1]=i*(i+1)/2
B.sparin(kv,kdiag)
B.spabac(kv,c,kdiag)
print('最优函数系数')
for i in range(1,nc+1):print('{:13.4e}'.format(c[i-1]),end='')
print()
print('数据点和拟合点')
print(' (x(i),i=1,',nv,'),y,yi')
sd=0;es=0
for i in range(1,npt+1):f54(x[i-1,:],f);yi=np.dot(c,np.transpose(f))sd=sd+(y[i-1]-my)**2;es=es+(y[i-1]-yi)**2for j in range(1,nv+1):print('{:13.4e}'.format(x[i-1,j-1]),end='')print('{:13.4e}'.format(y[i-1]),end='')print('{:13.4e}'.format(yi))
r2=(sd-es)/sd
print('相关联系数的平方',r2)
sparin
def sparin(kv,kdiag):
#对称天际线矩阵的乔列斯基分解n=kdiag.shape[0] kv[0]=kv[0]**0.5for i in range(2,n+1):ki=kdiag[i-1]-il=kdiag[i-2]-ki+1for j in range(int(l),i+1):x=np.float64(kv[ki+j-1])kj=kdiag[j-1]-jif j!=1:ll=kdiag[j-2]-kj+1ll=max(l,ll)if ll!=j:m=j-1for k in range(int(ll),m+1):x=x-np.float64(kv[ki+k-1]*kv[kj+k-1])kv[ki+j-1]=x/kv[kj+j-1]kv[ki+i-1]=x**0.5
spabac
def spabac(kv,loads,kdiag):
#天际线矩阵的乔列斯基前后迭代n=kdiag.shape[0]loads[0]=loads[0]/kv[0]for i in range(2,n+1):ki=kdiag[i-1]-il=kdiag[i-2]-ki+1 x=loads[i-1]if l!=i:m=i-1for j in range(int(l),m+1): x=x-kv[ki+j-1]*loads[j-1]loads[i-1]=x/kv[ki+i-1]for it in range(2,n+1):i=n+2-itki=kdiag[i-1]-ix=loads[i-1]/kv[ki+i-1]loads[i-1]=xl=kdiag[i-2]-ki+1if l!=i:m=i-1for k in range(int(l),int(m+1)):loads[k-1]=loads[k-1]-x*kv[ki+k-1]loads[0]=loads[0]/kv[0]

终端输出结果如下
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

曲线拟合——最小二乘法( Ordinary Least Square,OLS)

文章目录 前言一、曲线拟合是什么?二、最小二乘法是什么?三、求解最小二乘法(包含数学推导过程)四、使用步骤1.引入库2.读入数据 总结 前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都…

最小二乘法进行曲线拟合

工作需求,这里记录一下数值插值和数值分析方面的算法,希望和大家一起进步。 曲线拟合的最小二乘定义 求一条曲线,使数据点均在离此曲线的上方或下方不远处,所求的曲线称为拟合曲线, 它既能反映数据的总体分布,又不至于出现局部较大的波动,更能反映被逼…

最小二乘法的曲线拟合

最小二乘法解决的问题:AxC 无解下的最优解 例子1: 一条过原点的直线OA,C是直线外一点,求C在OA上的投影点P 例子1 例子2: 已知三个不在一条直线上的点A,B,C,求一条直线,使A,B,C到直线的距离和最小…

最小二乘法曲线拟合

最小二乘法曲线拟合以及Matlab实现 在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获…

chatgpt赋能python:Python中输出的完整指南

Python中输出的完整指南 在Python中进行编程,输出是至关重要的一部分。它可用于在命令行界面或Web应用程序中显示结果、数据操作等。Python具有各种输出方法,包括print语句,文件和日志记录。在本文中,我们将深入研究Python中输出…

机器视觉康耐视智能相机Insight-手眼标定详细步骤

(Q有答疑)康耐视VisionPro工具与脚本入门级系列教程2023 In-Sight 智能相机包含标定手眼的工具 CalibrateGrid,用手动的标定方式,即将康耐视标定片固定在运动平台上,然后手动输入电机位置坐标,要保证电机在 X 方向移动一次,Y 方向移动一次,旋转两次角度,切旋转角度差不能…

ChatGPT的4个不为人知却非常实用的小功能

今天重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中,我们发现结果不是自己想要的,可以直接点击“Stop generating”按钮,这样它就会立即停止输出。 二、复制功能 在ChatGPT返回对话的右侧,有三…

SQL 插入带引号的字段

今天突然想了下给字段插入引号的SQL该怎样写,然后就百度了一下,结果看各位的结果真是云里雾里啊 ╮(╯▽╰)╭ 然后就自己本机测试了一下 O(∩_∩)O,三种数据库都可以 不知道我这样写有没有问题呢 ... 稍微介绍一下吧: 如果要向…

什么是IPSec?6000字带你详细剖析,很赞!

关注、星标公众号,精彩内容每日送达 来源:网络素材 1.IPSEC协议簇安全框架 a.IPSec简介 IPSec(Internet Protocol Security):是一组基于网络层的,应用密码学的安全通信协议族。IPSec不是具体指哪个协议&…

C++ set类成员函数介绍 (set和multiset)

目录 🤔set模板介绍: 🤔特点: 🤔set的成员函数: 😊set构造函数: 🔍代码实例: 🔍运行结果: 😊 set赋值函数&#xf…

MySQL之数据库基本查询语句

——————今天距2020年43天—————— 这是ITester软件测试小栈第80次推文 SELECT 基本查询语句 查询单个列 #查询Author表name列的值 select name from Author;查询多个列 #查询Author表id,name两列的值 select id,name from Author;查询所有列 #查询Author表所有列的信息…

泔水()

欢迎大家观看本人第一张博客 16340218 数据科学与计算机学院 目录 数学干货之不等式 均值不等式幂平均不等式柯西不等式琴生不等式证明不等式的小策略 函数法“暴力”积分法数学归纳法水货-大学感想 一、各类不等式 1.均值不等式 平方平均数 ≥ 算术平均数 ≥ 几何平均数…

【Mysql】mysql数据库的查询语句

单表查询 1、普通查询 &#xff08;1&#xff09;命令&#xff1a;select * from <表名>;//通匹 &#xff08;2&#xff09;命令&#xff1a;select <要查询的字段> from <表名>&#xff1b; 2、去重查询&#xff08;distinct&#xff09; 命令&#xff1a;…

Metasploit超详细安装及使用教程(图文版)

通过本篇文章&#xff0c;我们将会学习以下内容&#xff1a; 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

基于深度学习的高精度汽车自行车检测识别系统(PyTorch+Pyside6+模型)

摘要&#xff1a;基于深度学习的高精度汽车自行车检测识别系统可用于日常生活中检测与定位汽车自行车目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的汽车自行车目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目…

Kotlin笔记(零)简介

百度百科简介 2017年&#xff0c;google公司在官网上宣布Kotlin成为Android的开发语言&#xff0c;使编码效率大增。Kotlin 语言由 JetBrains 公司推出&#xff0c;这是一个面向JVM的新语言 参考资料 官网&#xff1a;https://kotlinlang.org/中文官网&#xff1a;https://w…

【测试基础02】

测试基础02 一、HTML基础二、Python导入三方模块三、安装webgrock驱动四、元素定位(1)、元素定位工具(2)、元素定位方式(3)、XPATH路径(3)、CSS选择器 五、Selenium WebDriver初步应用(1)、基本方法(2)、测试案例1(3)、测试案例2(3)、测试案例3 六、获取元素信息的方法七、fram…

黑马Redis视频教程实战篇(三)

目录 一、优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒杀-一人一单 1.8 集群环境下的并发问题 二、分布式锁 2.1 基本原理和实现方式对比 2.2 Redis分布…

QQ截屏快速获取像素颜色

QQ截屏快速获取像素颜色 qq截屏的快捷键是 CTRL ALT A qq截屏除了截屏 还有个很不错的小功能 获取像素的颜色 是大家都容易忽略的 具体方法很简单 第一步 按下 Ctrl Alt A 快捷键 但是 不要点击鼠标 第二步 移动鼠标 到你想要像素点的颜色 如图所示 按C 即可复制 RGB十进…

计算机如何共享桌面,怎么共享电脑屏幕?

在平时的工作生活中&#xff0c;有的时候我们需要把自己的电脑屏幕共享到另一台电脑上&#xff0c;来方便给同事或者朋友演示一些操作。今天在这里给大家分享2个电脑屏幕共享的方法&#xff0c; 2种电脑屏幕共享的方法 幕享电脑投屏 幕享&#xff0c;英文名叫Letsview&#xff…