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发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Dec 03 Python
python re正则表达式模块(Regular Expression)
Jul 16 Python
python计算书页码的统计数字问题实例
Sep 26 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
Python字符串详细介绍
May 09 Python
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
Oct 17 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
Django发送邮件功能实例详解
Sep 02 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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+mysqli批量查询多张表数据的方法
2015/01/29 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
web性能优化之javascript性能调优
2012/12/28 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
python构建深度神经网络(DNN)
2018/03/10 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
如何使用Python 打印各种三角形
2019/06/28 Python
opencv resize图片为正方形尺寸的实现方法
2019/12/26 Python
python实现简单坦克大战
2020/03/27 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
为什么相对PHP黑python的更少
2020/06/21 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
python3实现简单飞机大战
2020/11/29 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
美国最值得信赖的宠物药房:Allivet
2019/03/23 全球购物
给朋友的道歉信
2014/01/09 职场文书
高级工程师英文求职信
2014/03/19 职场文书
上海世博会志愿者口号
2014/06/17 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
汶川大地震感悟
2015/08/10 职场文书
车辆挂靠协议书
2016/03/23 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL