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妹子图简单爬虫实例
Jul 07 Python
Python实现的单向循环链表功能示例
Nov 10 Python
Python中最大最小赋值小技巧(分享)
Dec 23 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
Sanic框架路由用法实例分析
Jul 16 Python
详解Python3注释知识点
Feb 19 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
Python中的__init__作用是什么
Jun 09 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
LyScript实现绕过反调试保护的示例详解
Aug 14 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实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
初学Python实用技巧两则
2014/08/29 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
详解Python if-elif-else知识点
2018/06/11 Python
Python爬虫常用小技巧之设置代理IP
2018/09/13 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
Django模板Templates使用方法详解
2019/07/19 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
pandas 数据类型转换的实现
2020/12/29 Python
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
党校培训自我鉴定
2014/02/01 职场文书
酒店总经理助理职责
2014/02/12 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
Python利用capstone实现反汇编
2022/04/06 Python
PostgreSQL聚合函数介绍以及分组和排序
2022/04/12 PostgreSQL
Go微服务项目配置文件的定义和读取示例详解
2022/06/21 Golang