python中matplotlib实现最小二乘法拟合的过程详解


Posted in Python onJuly 11, 2017

前言

最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

下面这篇文章主要跟大家介绍了关于python中matplotlib实现最小二乘法拟合的相关内容,下面话不多说,来一起看看详细的介绍:

一、最小二乘法拟合直线

生成样本点

首先,我们在直线 y = 3 + 5x 附近生成服从正态分布的随机点,作为拟合直线的样本点。

import numpy as np 
import matplotlib.pyplot as plt

# 在直线 y = 3 + 5x 附近生成随机点
X = np.arange(0, 5, 0.1) 
Z = [3 + 5 * x for x in X] 
Y = [np.random.normal(z, 0.5) for z in Z]

plt.plot(X, Y, 'ro') 
plt.show()

样本点如图所示:

python中matplotlib实现最小二乘法拟合的过程详解

拟合直线

设 y = a0 + a1*x,我们利用最小二乘法的正则方程组来求解未知系数 a0 与 a1。

python中matplotlib实现最小二乘法拟合的过程详解

numpy 的 linalg 模块中有一个 solve 函数,它可以根据方程组的系数矩阵和方程右端构成的向量来求解未知量。

def linear_regression(x, y): 
 N = len(x)
 sumx = sum(x)
 sumy = sum(y)
 sumx2 = sum(x**2)
 sumxy = sum(x*y)

 A = np.mat([[N, sumx], [sumx, sumx2]])
 b = np.array([sumy, sumxy])

 return np.linalg.solve(A, b)

a0, a1 = linear_regression(X, Y)

绘制直线

此时,我们已经得到了拟合后的直线方程系数 a0 和 a1。接下来,我们绘制出这条直线,并与样本点做对比。

# 生成拟合直线的绘制点
_X = [0, 5] 
_Y = [a0 + a1 * x for x in _X]

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2) 
plt.title("y = {} + {}x".format(a0, a1)) 
plt.show()

拟合效果如下:

python中matplotlib实现最小二乘法拟合的过程详解

二、最小二乘法拟合曲线

生成样本点

与生成直线样本点相同,我们在曲线 y = 2 + 3x + 4x^2 附近生成服从正态分布的随机点,作为拟合曲线的样本点。

import numpy as np 
import matplotlib.pyplot as plt

# y = 2 + 3x + 4x^2
X = np.arange(0, 5, 0.1) 
Z = [2 + 3 * x + 4 * x ** 2 for x in X] 
Y = np.array([np.random.normal(z,3) for z in Z])

plt.plot(X, Y, 'ro') 
plt.show()

样本点如图所示:

python中matplotlib实现最小二乘法拟合的过程详解

拟合曲线

设该曲线的方程为 y = a0 + a1*x + a2*x^2,同样,我们通过正则方程组来求解未知量 a0、a1 和 a2。

python中matplotlib实现最小二乘法拟合的过程详解

# 生成系数矩阵A
def gen_coefficient_matrix(X, Y): 
 N = len(X)
 m = 3
 A = []
 # 计算每一个方程的系数
 for i in range(m):
  a = []
  # 计算当前方程中的每一个系数
  for j in range(m):
   a.append(sum(X ** (i+j)))
  A.append(a)
 return A

# 计算方程组的右端向量b
def gen_right_vector(X, Y): 
 N = len(X)
 m = 3
 b = []
 for i in range(m):
  b.append(sum(X**i * Y))
 return b

A = gen_coefficient_matrix(X, Y) 
b = gen_right_vector(X, Y)

a0, a1, a2 = np.linalg.solve(A, b)

绘制曲线

我们根据求得的曲线方程,绘制出曲线的图像。

# 生成拟合曲线的绘制点
_X = np.arange(0, 5, 0.1) 
_Y = np.array([a0 + a1*x + a2*x**2 for x in _X])

plt.plot(X, Y, 'ro', _X, _Y, 'b', linewidth=2) 
plt.title("y = {} + {}x + {}$x^2$ ".format(a0, a1, a2)) 
plt.show()

拟合效果如下:

python中matplotlib实现最小二乘法拟合的过程详解

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
对于Python的框架中一些会话程序的管理
Apr 20 Python
分享一下Python 开发者节省时间的10个方法
Oct 02 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
Flask框架中request、请求钩子、上下文用法分析
Jul 23 Python
Django的性能优化实现解析
Jul 30 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 Python
keras分类之二分类实例(Cat and dog)
Jul 09 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Python如何实现Paramiko的二次封装
Jan 30 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 #Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 #Python
python处理按钮消息的实例详解
Jul 11 #Python
python 创建弹出式菜单的实现代码
Jul 11 #Python
在Python中使用AOP实现Redis缓存示例
Jul 11 #Python
浅谈python import引入不同路径下的模块
Jul 11 #Python
python 环境变量和import模块导入方法(详解)
Jul 11 #Python
You might like
Zend Guard一些常见问题解答
2008/09/11 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
javascript 嵌套的函数(作用域链)
2010/03/15 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
vue this.reload 方法 配置
2018/09/12 Javascript
js实现数字滚动特效
2019/12/16 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
在Django的URLconf中使用命名组的方法
2015/07/18 Python
使用Python抓取豆瓣影评数据的方法
2018/10/17 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Django 请求Request的具体使用方法
2019/11/11 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
护士求职推荐信范文
2013/11/23 职场文书
小学教师岗位职责
2013/11/25 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
民主评议党员总结
2014/10/20 职场文书
高一英语教学反思
2016/03/03 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
小学记事作文之200字
2019/08/06 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS