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脚本将文字转换为图片的实例分享
Aug 29 Python
python中print的不换行即时输出的快速解决方法
Jul 20 Python
Python中with及contextlib的用法详解
Jun 08 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
python3反转字符串的3种方法(小结)
Nov 07 Python
如何基于python把文字图片写入word文档
Jul 31 Python
Pyhton模块和包相关知识总结
May 12 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 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
深入理解PHP中的global
2014/08/19 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
vue项目前端埋点的实现
2019/03/06 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
Python程序语言快速上手教程
2012/07/18 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
python正则中最短匹配实现代码
2018/01/16 Python
python3实现windows下同名进程监控
2018/06/21 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
python返回数组的索引实例
2019/11/28 Python
如何使用python3获取当前路径及os.path.dirname的使用
2019/12/13 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
函授毕业自我鉴定
2013/12/19 职场文书
买房子个人收入证明
2014/01/16 职场文书
地理科学专业自荐信
2014/09/01 职场文书
PyTorch中的torch.cat简单介绍
2022/03/17 Python