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中使用SAX解析xml实例
Nov 21 Python
python学习必备知识汇总
Sep 08 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
pytorch 自定义数据集加载方法
Aug 18 Python
python编写猜数字小游戏
Oct 06 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
详解Python IO口多路复用
Jun 17 Python
Python编写memcached启动脚本代码实例
Aug 14 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
pandas将list数据拆分成行或列的实现
Dec 13 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
PHP Ajax中文乱码问题解决方法
2009/02/27 PHP
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
PHP字符串中特殊符号的过滤方法介绍
2014/02/18 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
php中__toString()方法用法示例
2016/12/07 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
可选择和输入的下拉列表框示例
2013/11/05 Javascript
Javascript中数组sort和reverse用法分析
2014/12/30 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
jQuery实现加入收藏夹功能(主流浏览器兼职)
2016/12/24 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
vue router学习之动态路由和嵌套路由详解
2017/09/21 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
Keras 切换后端方式(Theano和TensorFlow)
2020/06/19 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
英国剑桥包中文官网:The Cambridge Satchel Company中国
2018/11/06 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
上班睡觉检讨书
2014/01/09 职场文书
委托书的样本
2015/01/28 职场文书