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中使用gzip模块压缩文件的简单教程
Apr 08 Python
CentOS7.3编译安装Python3.6.2的方法
Jan 22 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
详解Django之auth模块(用户认证)
Apr 17 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
对Python生成器、装饰器、递归的使用详解
Jul 19 Python
python中web框架的自定义创建
Sep 08 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
Django 用户认证Auth组件的使用
Nov 30 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
世界收音机发展史
2021/03/01 无线电
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
document.addEventListener使用介绍
2014/03/07 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
javascript cookie的基本操作(添加和删除)
2017/07/24 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
Python内置函数reversed()用法分析
2018/03/20 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
Python切片索引用法示例
2018/05/15 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
python实现图像拼接功能
2020/03/23 Python
Python 解析xml文件的示例
2020/09/29 Python
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
早读课迟到检讨书
2014/09/25 职场文书
2014年学校卫生工作总结
2014/11/20 职场文书
经理助理岗位职责
2015/02/02 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
教师节晚会主持词
2015/06/30 职场文书
初中体育教学随笔
2015/08/15 职场文书
小学英语听课心得体会
2016/01/14 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
mysql 获取时间方式
2022/03/20 MySQL
Python自动化实战之接口请求的实现
2022/05/30 Python