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 相关文章推荐
Flask框架中密码的加盐哈希加密和验证功能的用法详解
Jun 07 Python
python 全文检索引擎详解
Apr 25 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
Python get获取页面cookie代码实例
Sep 12 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
Python利用scapy实现ARP欺骗的方法
Jul 23 Python
Django框架视图函数设计示例
Jul 29 Python
如何基于python实现归一化处理
Jan 20 Python
python中tab键是什么意思
Jun 18 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 Python
Python urllib3软件包的使用说明
Nov 18 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
德劲1102收音机的打理维修案例
2021/03/02 无线电
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
Javascript MD4
2006/12/20 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
JS 自定义函数缺省值的设置方法
2010/05/05 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
Python实现粒子群算法的示例
2021/02/14 Python
thinkphp5 路由分发原理
2021/03/18 PHP
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
写好求职信第一句话的技巧
2013/10/26 职场文书
大学学习生活感言
2014/01/18 职场文书
物理研修随笔感言
2014/02/14 职场文书
工程建设实施方案
2014/03/14 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
小学教育见习总结
2015/06/23 职场文书
电工生产实习心得体会
2016/01/22 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android
服务器nginx权限被拒绝解决案例
2022/09/23 Servers