如何使用Python最小二乘法拟合曲线代码详解

目录
  • 一、背景描述
  • 二、前期准备
    • 最小二乘法
    • Python类库
      • NumPy
      • Matplotlib
  • 三、代码实现
  • 总结

一、背景描述

在一个普通的摸鱼早晨,群里居然出现了一个不合时宜颇为突兀的正经问题,原来是一个博士同学需要対实验数据进行曲线拟合并且批量计算出多项式方程

一般来说,这种问题对于经常做实验的同学来说并不陌生,通常使用MATLAB或者Origin Pro这类专业的数据计算软件,甚至Excel也可以实现.

但是作为程序员肯定第一想到的还是使用强大的Python来实现,但是因为本人主要做java开发,python知之甚少,但也知道python强大在各种现成的类库,所以实现估计并不难,按我们就上手试试?

再来一张图更直观的表述下,博士同学就是有多组实验数据,可以分布在坐标系,例如图中的各个散点,而他想做的就是将散点拟合为一条曲线,获得曲线的方程式,从而可以通过输入其他x坐标的值预测结果数据.这在非常多的地方都有极大的用处

二、前期准备

在开始前还是需要対一些基本概念和类库进行了解和介绍,因为并不是专业做研究的,所以对于以下名词只做简单的描述,达到理解并且可以使用的目的即可

最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小

最小二乘法是解决曲线拟合问题最常用的方法。

其基本思路是:事先选定的一组线性无关的函数, 是待定系数 ,拟合准则是使实验数据(笛卡尔坐标系的坐标数据)与待拟合曲线的距离的平方和最小,称为最小二乘准则.

总结来说,我们通常就是使用最小二乘法来做曲线拟合,通过计算最小值来获得多项式的系数与误差数值.

(关于最小二乘法的原理大家可以自行了解,甚至可以让你重新感知到数学逻辑之美)

Python类库

NumPy

NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

Matplotlib

Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。

三、代码实现

这里我们举一个例子来展示下,相信下面这道数学题大家一定不陌生.

某公司为合理定价,在试销期间得到单价x(单位:元)与销售量y(单位:件)的数据如表:

单价(x) 80 82 84 86 88 90

销量(y) 90 84 83 80 75 68

如果换做之前,我们肯定就熟练的直接开始列方程解未知数了,但是现在我已经失去了这项能力,那么不妨使用我们准备好的拟合曲线让程序来帮我们计算下.

话不多说,直接上代码

import matplotlib.pyplot as plt
import numpy as np

# 准备数据,将(x,y)坐标点进行输入
x = np.arange(80, 92, 2)  # x = 80,82,84,86,88,90
y = np.array([90, 84, 83, 80, 75, 68])
# 使用polyfit方法来拟合,并选择多项式,这里先使用2次方程
z1 = np.polyfit(x, y, 2)
# 使用poly1d方法获得多项式系数,按照阶数由高到低排列
p1 = np.poly1d(z1)
# 在屏幕上打印拟合多项式
print(p1)
# 求对应x的各项拟合函数值
fx = p1(x)
# 绘制坐标系散点数据及拟合曲线图
plot1 = plt.plot(x, y, '*', label='origin data')
plot2 = plt.plot(x, fx, 'r', label='polyfit data')
plt.xlabel('x-price')
plt.ylabel('y-amount')
plt.legend(loc=4)  # 指定legend的位置,类似象限的位置
plt.title('polyfit')
plt.show()
plt.savefig('polyfit.png')

代码其实比较简单,输入坐标数据,使用polyfit拟合曲线,输出方程并且将图标画出来,我们来执行下看看结果如何

左边那个就是拟合出来的二次方程,因为格式问题,2次方在上面一行,大家能看懂就行,右边就是这个曲线的图,但是可以看出曲线并不能非常好的贴合散点数据

这里我们将多项式改为3次方式再试一下

z1 = np.polyfit(x, y, 3)

再试一下

可以看出三次方程对于数据的贴合度还是比较好的,而如何选择合适的多项式,或者其他类型函数,比如指数函数,幂函数等就需要人自己的合理选择了.

好了,文章就到这里了,在python强大类库的帮助下,总体还是比较简单的

总结

到此这篇关于如何使用Python最小二乘法拟合曲线的文章就介绍到这了,更多相关Python最小二乘法拟合曲线内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现两种稀疏矩阵的最小二乘法

    目录 最小二乘法 返回值 测试 最小二乘法 scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr,前者是经典算法,后者来自斯坦福优化实验室,据称可以比lsqr更快收敛. 这两个函数可以求解Ax=b,或arg minx ∥Ax−b∥2,或arg minx ∥Ax−b∥2 +d2∥x−x0∥2,其中A必须是方阵或三角阵,可以有任意秩. 通过设置容忍度at ,bt,可以控制算法精度,记r=b-Ax 为残差向量,如果Ax=b是相容的,lsqr在∥r∥⩽at∗∥A∥⋅∥x∥

  • Python实现曲线拟合的最小二乘法

    本文实例为大家分享了Python曲线拟合的最小二乘法,供大家参考,具体内容如下 模块导入 import numpy as np import gaosi as gs 代码 """ 本函数通过创建增广矩阵,并调用高斯列主元消去法模块进行求解. """ import numpy as np import gaosi as gs shape = int(input('请输入拟合函数的次数:')) x = np.array([0.6,1.3,1.64,1

  • Python最小二乘法矩阵

    最小二乘法矩阵 #! /usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def calc_left_k_mat(k): """ 获得左侧k矩阵 :param k: :return: """ k_mat = [] for i in range(k + 1): now_line = [] for j in range(k + 1): now_line.append(j + i

  • 最小二乘法及其python实现详解

    最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出).它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小.最小二乘法还可用于曲线拟合.其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达. 那什么是最小二乘法呢?别着急,我们先从几个简单的概念说起. 假设我们现在有一系列的数据点 ,那么由我们给出的拟合函数h(x)得到的估计量就是

  • Python调用实现最小二乘法的方法详解

    目录 numpy实现 scipy封装 速度对比 补充 所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题.最小二乘法的实质,是保证误差最小的情况下对未知数进行赋值. 最小二乘法是非常经典的算法,而且这个名字我们在高中的时候就已经接触了,属于极其常用的算法.此前曾经写过线性最小二乘法的原理,并用Python实现:最小二乘法及其Python实现:以及scipy中非线性最小二乘法的调用方式:非线性最小二乘法(文末补充内容):还有稀疏矩阵的最小二乘法

  • Python实现调度算法代码详解

    调度算法 操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源.这就是调度.目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源. 在操作系统中调度是指一种资源分配,因而调度算法是指:根据系统的资源分配策略所规定的资源分配算法.对于不同的的系统和系统目标,通常采用不同的调度算法,例如,在批处理系统中,为了照顾为数众多的段作业,应采用短作业优先的调度算法:又如在分时系统中,为了保证系统具有合理

  • Python模块文件结构代码详解

    本文研究的主要是Python模块文件结构的相关内容,具体如下. Python文件结构 文件结构(范例全文) #/usr/bin/env python "this is a test module" import sys import os debug = True class FooClass (object): "Foo class" pass def test(): "test function" foo = FooClass() if de

  • Python 分形算法代码详解

    目录 1. 前言 什么是分形算法? 2. 分形算法 2.1 科赫雪花 2.2 康托三分集 2.3 谢尔宾斯基三角形 2.4 分形树 3. 总结 1. 前言 分形几何是几何数学中的一个分支,也称大自然几何学,由著名数学家本华曼德勃罗( 法语:BenoitB.Mandelbrot)在 1975 年构思和发展出来的一种新的几何学. 分形几何是对大自然中微观与宏观和谐统一之美的发现,分形几何最大的特点: 整体与局部的相似性: 一个完整的图形是由诸多相似的微图形组成,而整体图形又是微图形的放大. 局部是整

  • Python装饰器代码详解

    目录 一.理解装饰器 二.装饰器原型 1.不带参数的装饰器 2.带参数的被装饰的函数 3.带参数的装饰器 4.使用类作为装饰器 5.使用对象作为装饰器 6.多层装饰器的嵌套 总结 一.理解装饰器 所有东西都是对象(函数可以当做对象传递) 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. def function_one(): print("测试函数") #可以将一个函数赋值给一个变量,比如 foo =function_one #这里没有在使用小括号,因

  • Python日志采集代码详解

    目录 一,日志概述 1,日志作用 2,日志级别 3,日志格式 4,日志位置 二,logging模块 1,简介 2,文档 三,logging第一种使用方法:简单配置使用 1,使用方法 2,basicConfig()部分参数说明 3,示例1:日志打印至控制台 4,示例2:日志保存至文件 四,logging的第二种使用方式:日志流处理流程 1,logging四大组件介绍 2,Logger 记录器 3,Handler 处理器 3.1,StreamHandler 3.2,FileHandler 4,Fil

  • Python探索之ModelForm代码详解

    这是一个神奇的组件,通过名字我们可以看出来,这个组件的功能就是把model和form组合起来,对,你没猜错,相信自己的英语水平. 先来一个简单的例子来看一下这个东西怎么用: 比如我们的数据库中有这样一张学生表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册时间等等一大堆信息,现在让你写一个创建学生的页面,你的后台应该怎么写呢? 首先我们会在前端一个一个罗列出这些字段,让用户去填写,然后我们从后天一个一个接收用户的输入,创建一个新的学生对象,保存 其实,重点不是这些,而是合法性验证,我们需要在前端

  • Python自然语言处理之词干,词形与最大匹配算法代码详解

    本文主要对词干提取及词形还原以及最大匹配算法进行了介绍和代码示例,Python实现,下面我们一起看看具体内容. 自然语言处理中一个很重要的操作就是所谓的stemming和lemmatization,二者非常类似.它们是词形规范化的两类重要方式,都能够达到有效归并词形的目的,二者既有联系也有区别. 1.词干提取(stemming) 定义:Stemmingistheprocessforreducinginflected(orsometimesderived)wordstotheirstem,base

  • python数字图像处理之高级滤波代码详解

    本文提供许多的滤波方法,这些方法放在filters.rank子模块内. 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定. 1.autolevel 这个词在photoshop里面翻译成自动色阶,用局部直方图来对图片进行滤波分级. 该滤波器局部地拉伸灰度像素值的直方图,以覆盖整个像素值范围. 格式:skimage.filters.rank.autolevel(image, selem) selem表示结构化元素,用于设定滤波器. from skimage im

  • python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from matplotlib import rcParams fig1 = plt.figure(2) rects =plt.bar(left = (0.2,1),height = (1,0.5),width = 0.2,align="center",yerr=0.000001) plt.titl

  • python类的方法属性与方法属性的动态绑定代码详解

    动态语言与静态语言有很多不同,最大的特性之一就是可以实现动态的对类和实例进行修改,在Python中,我们创建了一个类后可以对实例和类绑定心的方法或者属性,实现动态绑定. 最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,发现廖雪峰老师的网站上面的学习资源很不错,而且言简意赅,提取了一些python中的重要的语法和案例.重要的是可以在线测试python的运行代码,缺点就是没有系统的看python的书籍,不能及时的将

随机推荐