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网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
给Python初学者的一些编程技巧
Apr 03 Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 Python
深入浅析python定时杀进程
Jun 06 Python
Pandas之排序函数sort_values()的实现
Jul 09 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
python tkinter实现连连看游戏
Nov 16 Python
Python中return函数返回值实例用法
Nov 19 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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
PHP 验证登陆类分享
2015/03/13 PHP
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
[00:12]2018DOTA2亚洲邀请赛 Somnus丶M出阵单挑
2018/04/06 DOTA
python字符串的常用操作方法小结
2016/05/21 Python
python 拼接文件路径的方法
2018/10/23 Python
Python闭包思想与用法浅析
2018/12/27 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
使用css创建三角形 使用CSS3创建3d四面体原理及代码(html5实践)
2013/01/06 HTML / CSS
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
体育学院毕业生自荐信
2013/11/03 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
北体毕业生求职信
2014/02/28 职场文书
护校行动方案
2014/05/31 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
各种货币符号快捷输入
2022/02/17 杂记
Redis入门基础常用操作命令整理
2022/06/01 Redis