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中实现贪婪排名算法的教程
Apr 17 Python
python 默认参数问题的陷阱
Feb 29 Python
python2.7实现爬虫网页数据
May 25 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
python中pip的使用和修改下载源的方法
Jul 08 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
python使用多线程+socket实现端口扫描
May 28 Python
Django模型验证器介绍与源码分析
Sep 08 Python
10个示例带你掌握python中的元组
Nov 23 Python
解决numpy和torch数据类型转化的问题
May 23 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
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP日期函数date格式化UNIX时间的方法
2015/03/19 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python多线程同步---文件读写控制方法
2019/02/12 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
python生成随机红包的实例写法
2019/09/02 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
总经理助理的八要求
2013/11/12 职场文书
半年思想汇报
2013/12/30 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
班级文化标语
2014/06/23 职场文书
植树造林的宣传标语
2014/06/23 职场文书
社会实践的活动方案
2014/08/22 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
大学生暑期实践报告
2015/07/13 职场文书
《西门豹》教学反思
2016/02/23 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
基于Python实现将列表数据生成折线图
2022/03/23 Python