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创建系统目录的方法
Mar 11 Python
详解Python3中的Sequence type的使用
Aug 01 Python
Python实现的随机森林算法与简单总结
Jan 30 Python
transform python环境快速配置方法
Sep 27 Python
python截取两个单词之间的内容方法
Dec 25 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
python字典的setdefault的巧妙用法
Aug 07 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
Python 捕获代码中所有异常的方法
Aug 03 Python
python批量提取图片信息并保存的实现
Feb 05 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php.ini中文版
2006/10/09 PHP
php读取mysql的简单实例
2014/01/15 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
2015/03/25 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
Prototype源码浅析 Number部分
2012/01/16 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
小程序实现留言板
2018/11/02 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Python中Class类用法实例分析
2015/11/12 Python
Python中的pack和unpack的使用
2018/03/12 Python
基于python指定包的安装路径方法
2018/10/27 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
浅谈Python中文件夹和python package包的区别
2020/06/01 Python
django rest framework 自定义返回方式
2020/07/12 Python
Python实现一个优先级队列的方法
2020/07/31 Python
python pymysql库的常用操作
2020/10/16 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
晚会主持人开场白台词
2015/05/28 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
pandas提升计算效率的一些方法汇总
2021/05/30 Python
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python