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 itchat实现微信自动回复的示例代码
Aug 14 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
Python http接口自动化测试框架实现方法示例
Dec 06 Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
python动态文本进度条的实例代码
Jan 22 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
在Python 中将类对象序列化为JSON
Apr 06 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
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
PHPMailer 中文使用说明小结
2010/01/22 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
mysql数据库差异比较的PHP代码
2012/02/05 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
JavaScript异步加载浅析
2014/12/28 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python实现大学人员管理系统
2019/10/25 Python
Python3实现飞机大战游戏
2020/04/24 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
Python内存泄漏和内存溢出的解决方案
2020/09/26 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
校园十大歌手策划书
2014/02/01 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
房产公证书
2015/01/23 职场文书
个人专业技术总结
2015/03/05 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
养成教育工作总结
2015/08/13 职场文书
创业计划书之校园超市
2019/09/12 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL
keepalived + nginx 实现高可用方案
2022/12/24 Servers