Python中实现最小二乘法思路及实现代码


Posted in Python onJanuary 04, 2018

之所以说”使用”而不是”实现”,是因为python的相关类库已经帮我们实现了具体算法,而我们只要学会使用就可以了。随着对技术的逐渐掌握及积累,当类库中的算法已经无法满足自身需求的时候,我们也可以尝试通过自己的方式实现各种算法。

言归正传,什么是”最小二乘法”呢?

定义:最小二乘法(又称最小平方法)是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。

作用:利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。

原则:以”残差平方和最小”确定直线位置(在数理统计中,残差是指实际观察值与估计值之间的差)

数学公式:

Python中实现最小二乘法思路及实现代码

基本思路:对于一元线性回归模型,假设从总体中获取了n组观察值(X1,Y1),(X2,Y2),…,(Xn,Yn),对于平面中的这n个点,可以使用无数条曲线来拟合。而线性回归就是要求样本回归函数尽可能好地拟合这组值,也就是说,这条直线应该尽可能的处于样本数据的中心位置。因此,选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小。

实现代码如下,代码中已经详细的给了注释:

##最小二乘法
import numpy as np  ##科学计算库 
import scipy as sp  ##在numpy基础上实现的部分算法库
import matplotlib.pyplot as plt ##绘图库
from scipy.optimize import leastsq ##引入最小二乘法算法

'''
   设置样本数据,真实数据需要在这里处理
'''
##样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2])
Yi=np.array([5.25,2.83,6.41,6.71,5.1,4.23,5.05,1.98,10.5,6.3])

'''
  设定拟合函数和偏差函数
  函数的形状确定过程:
  1.先画样本图像
  2.根据样本图像大致形状确定函数形式(直线、抛物线、正弦余弦等)
'''

##需要拟合的函数func :指定函数的形状
def func(p,x):
  k,b=p
  return k*x+b

##偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(p,x,y):
  return func(p,x)-y

'''
  主要部分:附带部分说明
  1.leastsq函数的返回值tuple,第一个元素是求解结果,第二个是求解的代价值(个人理解)
  2.官网的原话(第二个值):Value of the cost function at the solution
  3.实例:Para=>(array([ 0.61349535, 1.79409255]), 3)
  4.返回值元组中第一个值的数量跟需要求解的参数的数量一致
'''

#k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[1,20]

#把error函数中除了p0以外的参数打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))

#读取结果
k,b=Para[0]
print("k=",k,"b=",b)
print("cost:"+str(Para[1]))
print("求解的拟合直线为:")
print("y="+str(round(k,2))+"x+"+str(round(b,2)))

'''
  绘图,看拟合效果.
  matplotlib默认不支持中文,label设置中文的话需要另行设置
  如果报错,改成英文就可以
'''

#画样本点
plt.figure(figsize=(8,6)) ##指定图像比例: 8:6
plt.scatter(Xi,Yi,color="green",label="样本数据",linewidth=2) 

#画拟合直线
x=np.linspace(0,12,100) ##在0-15直接画100个连续点
y=k*x+b ##函数式
plt.plot(x,y,color="red",label="拟合直线",linewidth=2) 
plt.legend(loc='lower right') #绘制图例
plt.show()

结果如下所示:

输出结果:

k= 0.900458420439 b= 0.831055638877
cost:1
求解的拟合直线为:
y=0.9x+0.83

绘图结果:

Python中实现最小二乘法思路及实现代码

补充说明:简单的列举了直线的情况,曲线的求解方式类似,但是曲线会存在过度拟合的情况,在以后的博客中会讲到。

总结

以上就是本文关于Python中实现最小二乘法思路及实现代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
python-视频分帧&多帧合成视频实例
Dec 10 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
pycharm sciview的图片另存为操作
Jun 01 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
Python找出最小的K个数实例代码
Jan 04 #Python
Python编程把二叉树打印成多行代码
Jan 04 #Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 #Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 #Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 #Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 #Python
python实现简易云音乐播放器
Jan 04 #Python
You might like
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
JsonServer安装及启动过程图解
2020/02/28 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
python采集博客中上传的QQ截图文件
2014/07/18 Python
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
Python中join和split用法实例
2015/04/14 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
python绘制条形图方法代码详解
2017/12/19 Python
python实现RabbitMQ的消息队列的示例代码
2018/11/08 Python
Python字符串格式化输出代码实例
2019/11/22 Python
Python定时器线程池原理详解
2020/02/26 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
医院护士求职自荐信格式
2013/09/21 职场文书
小学教师自我鉴定
2013/11/07 职场文书
新闻报道策划方案
2014/06/11 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
旷工辞退通知书
2015/04/17 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python
Go语言 详解net的tcp服务
2022/04/14 Golang