一文速学-最小二乘法曲线拟合算法详解+项目代码

简介: 一文速学-最小二乘法曲线拟合算法详解+项目代码

前言


我们知道一般都是从多个点来画出直线,那么如果点的排列并非能够用一条直线来拟合,但是又需要找到这样一条线来拟合多个坐标轴上面的点,那么一般都是采用曲线进行拟合。但是如何在众多密集且离散的分布点中找到一条曲线来尽可能多的去拟合多个点呢?这就需要我们采取相应的算法或者策略。


我们需要使这条直线到各个数据点之间的误差最小且更可能的逼近,那么宏观来看该算法应该是全局最优算法,所以根据此我们使用最小二乘法来拟合离散的点尽可能使这些数据点均在离此曲线的上方或下方不远处。它既能反映数据的总体分布,又不至于出现局部较大的波动。我们现在我们来从零开始探索该算法。


本篇博客的愿景是希望我或者读者通过阅读这篇博客能够学会方法并能实际运用,而且能够记录到你的思想之中。希望读者看完能够提出错误或者看法,博主会长期维护博客做及时更新。


一、曲线拟合策略



在工程实际应用和科学实验中通过测量得到的一组离散的数据点,为了从中找到两个变量中间的内在规律性,也就是求自变量和因变量之间的近似程度比较好的函数关系式,这类问题有插值法和曲线拟合法。这类问题的插值法和曲线拟合法,当个别数据的误差较大时,插值效果显然是不理想的,而且实验或观测提供的数据个数往往较多,用插值法势必得到次数较高的插值多项式,会出现龙格现象。这时候最优策略就是选择曲线拟合策略了。


0ebcdf76620e46e1b0230e5c2f05a061.png


我们从数据出发构造一个近似函数,只要求所得的近似曲线能反映数据的基本趋势,使求得的逼近函数与已知函数从总体上来说偏差的平方和最小,这就是最小二乘法。


二、最小二乘法理论基础


1.残差

原理


要从零基础了解最小二乘法,那么我们需要把支撑最小二乘法的原理和算法搞懂,首先我们要了解什么是残差。我们知道曲线拟合不要求近似曲线严格过所有的数据点,但使求得的逼近函数与已知函数从总体上来说其偏差按某种方法度量达到总体上尽可能最小。那么我们估计的曲线与真实点的差距就是残差。


我们设线性回归模型为gif.gif

其中:

  • Y是有相应变量构成的n维向量
  • X是gif.gif阶设计矩阵
  • \betagif.gif维向量
  • \varepsilon是n维随机变量

回归系数的估计值,gif.gif拟合值为,其中:gif.gif

  • gif.gif,H为帽子矩阵

则残差为。gif.gif


特征

在回归分析中,测定值与按回归方程预测的值之差,以表示gif.gif。残差gif.gif遵从正态分布gif.gif

gif.gif的标准差,称为标准化残差,以gif.gif表示。gif.gif遵从标准正态分布N(0,1)。验点的标准化残差落在(-2,2)区间以外的概率≤0.05。若某一实验点的标准化残差落在(-2,2)区间以外,可在95%置信度将其判为异常实验点,不参与回归直线拟合。


显然,有多少对数据,就有多少个残差。残差分析就是通过残差所提供的信息,分析出数据的可靠性、周期性或其它干扰。


选取策略

通常我们构造拟合曲线,要使得残差\delta 尽可能的小,有3中准则可供选择,具体内容如下:


  • 残差的最大绝对值最小:gif.gif
  • 残差的绝对值之和最小: gif.gif
  • 残差的平方和最小:gif.gif


根据三种准则的具体形式,可以分析出前两种比较简单,而二者都含有绝对值运算,实际应用中不便于操作;基于第三种准则构造的拟合曲线方法便是曲线拟合的最小二乘法。


2.最小二乘原则


定义

我们将残差的平方和最小gif.gif的原则称为最小二乘原则。

按照最小二乘原则选取拟合曲线的方法,称为最小二乘法。


解法总览


对于如何利用最小二乘法原则来解决问题,我们可以根据我们想要的结果来看:

在某个函数类gif.gif来寻求一个函数gif.gif

gif.gif使其满足:

gif.gif其中gif.gif函数类gif.gif中任意函数。gif.gif是待定常数。

满足上述关系式的函数称gif.gif为上述最小二乘问题的最小二乘解。

三、最小二乘解法


1.确定函数类


原则:根据实际问题域所给数据点的变化规律确定。


   在实际问题中如何选择基函数是一个复杂的问题,一般要根据问题本身的性质来决定。通常可取的基函数有多项式、三角函数、指数函数。或者数据集可能本身就是一个轨迹点数据集,没有强关联的自变量因变量关系。这是要根据实际问题求解的目标调整算法。


2.求解方程


问题转化为求待定系数gif.gif使得:

gif.gif


极小值原理:


记,gif.gif那么我们知道存在极小值的情况,原函数需要存在收敛。

证明函数收敛,gif.gif则有多元函数极值必要条件有:

gif.gif

其中gif.gifgif.gif


求解方程组


对任意函数h(x)和g(x)引入记号:


gif.gif

用向量内积形式表示,可得

gif.gif


即:gif.gif

上式为求gif.gif的法方程组,其矩阵的形式为

gif.gif

由于向量组gif.gif是线性无关,故上式系数行列式gif.gif

存在唯一解gif.gif于是得到函数gif.gif的最小二乘解

gif.gif


故得到下列:


定理


对于给定的一组实验数据gif.gif互异。在函数类gif.gifgif.gif线性无关,存在唯一的函数

gif.gif使得关系式gif.gif成立,并且其系数gif.gif


可以通过解法方程组得到。


特例


如取gif.gif就得到代数多项式gif.gif

gif.gif


gif.gif


最小二乘的法方程为:


gif.gifgif.gifgif.gif


四、代码实现


首先进行曲线拟合的话肯定需要数据分析三巨头pandas、numpy和绘图用的matplotlib

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


这里我们使用案例来实现最小二乘法拟合:

在某化学反应里,测得生成物浓度y(%)与时间t(min)的数据:


580c829ecc8442c087ff76e286a3b8bf.png

一般我们拿到数据都是在excel和csv,直接读取就好了:


1. df_metric=pd.read_excel('try_test.xlsx')
2. df_metric


1b81f774b0584de7b5d63b231a61e935.png

通过绘制散点图我们很容易看出数据趋势:

x=df_metric['t']
y=df_metric['y']
plot1 = plt.plot(x, y, '*', label='origin data')
plt.title('polyfit')
plt.show()

cdfadfb19abb414dbf42ec98ea0755be.png

在matplotlib库中polyfit函数可以实现多项式拟合,也就是最小二乘拟合:

# 使用polyfit方法来拟合,并选择多项式
z1 = np.polyfit(x, y, 2)
# 使用poly1d方法获得多项式系数,按照阶数由高到低排列
p1 = np.poly1d(z1)
#打印拟合多项式
print(p1)


6d1941f9818241ebbdc7d192f13c0414.png

当然如果需要精度更高可以增加系数:


# 使用polyfit方法来拟合,并选择多项式
z1 = np.polyfit(x, y, 3)
# 使用poly1d方法获得多项式系数,按照阶数由高到低排列
p1 = np.poly1d(z1)
#打印拟合多项式
print(p1)

41f5c90162ee48ceaa104f299a55f395.png


拟合之后对比:


# 求对应x的各项拟合函数值
fx = p1(x)
plot1 = plt.plot(x, y, '*', label='origin data')
plot2 = plt.plot(x, fx, 'r', label='polyfit data')
plt.legend(loc=4)
plt.show()


deac3b262e5a4725b2382fdfd53866e7.png

当系数更多越精确:

a3eb9b5e413844dc84e9509427fa7131.png


实际问题的解决中测得的数据都不是等精度的。显然,对于精度高、权重大的数据应该给予足够的重视,在计算时,给以足够的权重,在这种情况下就要使用加权最小二乘法。


利用最小二乘法原则上解决了最小二乘法意义下的曲线拟合问题,但在实际问题的解决时,n往往很大,法方程组往往是病态的,因而给求解带来了一定的困难。其中也有相当多的策略去优化该算法。

目录
相关文章
|
1天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
7 3
|
13天前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
14天前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
17天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
39 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
2月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
86 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
79 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
6天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
13 0
|
2月前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
49 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
27天前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
15 0