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计算程序运行时间的方法
Dec 13 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
python读取文件名称生成list的方法
Apr 27 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
Python如何基于selenium实现自动登录博客园
Dec 16 Python
Python urlopen()和urlretrieve()用法解析
Jan 07 Python
后端开发使用pycharm的技巧(推荐)
Mar 27 Python
Python pandas如何向excel添加数据
May 22 Python
用Python进行websocket接口测试
Oct 16 Python
python pygame入门教程
Jun 01 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
通过ODBC连接的SQL SERVER实例
2006/10/09 PHP
谈谈PHP语法(2)
2006/10/09 PHP
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php实现paypal 授权登录
2015/05/28 PHP
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
2013/01/25 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Django Rest framework三种分页方式详解
2019/07/26 Python
wxPython实现绘图小例子
2019/11/19 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
学习保证书范文
2014/04/30 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
爱晚亭导游词
2015/02/09 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python