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 04 Python
Python实现的Excel文件读写类
Jul 30 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
Python中格式化format()方法详解
Apr 01 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
python实现自动登录
Sep 17 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
python给微信好友定时推送消息的示例
Feb 20 Python
python向图片里添加文字
Nov 26 Python
Python+Appium实现自动化测试的使用步骤
Mar 24 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
python爬虫分布式获取数据的实例方法
Nov 26 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中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
jQuery实现动画效果的实例代码
2013/05/07 Javascript
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
2015/11/17 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
Angular实现双向折叠列表组件的示例代码
2017/11/21 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
vuejs项目打包之后的首屏加载优化及打包之后出现的问题
2018/04/01 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
JS实现公告上线滚动效果
2021/01/10 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
Python中的元类编程入门指引
2015/04/15 Python
python实现百度语音识别api
2018/04/10 Python
pandas 读取各种格式文件的方法
2018/06/22 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
测量实习生自我鉴定
2013/09/19 职场文书
岗位职责的定义
2013/11/10 职场文书
手机促销活动方案
2014/02/05 职场文书
电台实习生求职信
2014/02/25 职场文书
团队经理竞聘书
2014/03/31 职场文书
大学生求职信范文
2014/05/24 职场文书
教师党员个人总结
2015/02/10 职场文书
大班下学期个人总结
2015/02/13 职场文书
亮剑观后感300字
2015/06/05 职场文书
三八妇女节主持词
2015/07/04 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP