Python实现——一元线性回归(最小二乘法)
2019/3/24
线性回归——最小二乘法公式法
暂时用python成功做出来了图像,但是其中涉及到的公式还是更多的来自于网络,尤其是最小二乘法公式中的两个系数的求解,不过目前看了下书高数也会马上提及(虽然可能不会讲这两个公式),但是运用的知识其实还是目前能够接受的:偏导,二元方程。乍一看其实也没什么,只是由于有了求和符号的干扰让计算显得复杂。
最小二乘法-公式推导
该博客中对其的推导看起来比较简洁容易接受,其中结尾公式的计算不难让人想到线性代数中的向量乘积运算,但是那样的表示方法我并不熟练,等到系统的学习线代后再深挖....吧。
总的来说:y=a+bx 便是我们的预测函数。然而不同于以往的是变量变为了a与b两个系数,从这里也不难看到其实若是二次拟合也有一个好处那便是虽然x中含有二次项而系数中并没有,仍然是一次方程。
而我们所要做到的便是能够让这个函数在基于现有数据的参照下偏差最小,而偏差值的衡量我们将会用方差来表示,不选择简单的做差是由于做差势必会带来正负的区别,而由此又会导致偏差之间相互抵消,而若是加上绝对值的话又要涉及判断,因此方差成为了简单直接的方式。
之后的求解,简单来说就是分别对两个系数进行求偏导,在之后,我们再转换一下观念。
虽然我们目前来看是把系数当作了未知数,但是实际上这还是关于x,y的方程,对于x,y的方差,应视其为二次函数,也因此最小值的求解应该在导数0点取得。
(有待商榷,这只是我目前的理解)
因此再分别对应回两个偏导为零继续求解,其中关于a的方程较为简单,而b则会麻烦一点。
而在我的python实现中
前两个库函数可能没有使用到
修正:上两个函数应该为excel导入的函数,之前应该是忘了
import xlrd
import xlwt
import matplotlib.pyplot as plt
import numpy as np
此处则对应的是读取数据
workbook=xlrd.open_workbook(r'1.xls')
sheet=workbook.sheet_by_index(0)
cols1=sheet.col_values(0) #获取第一列
cols2=sheet.col_values(1) #获取第二列
以下则是在为最后一步的公式提供准备每个参量,把单个值提前表示出来
s1=0
s2=0
s3=0
s4=0
for i in range(n):
s1 = s1 + cols1[i]*cols2[i]
s2 = s2 + cols1[i]
s3 = s3 + cols2[i]
s4 = s4 + cols1[i]*cols1[i]
最后这里就是公式的求解,相信就算没看前面推导,也能大概懂点其中每个量的相互关系以及上面所准备的参量的意义
b = (s2*s3-n*s1)/(s2*s2-s4*n)
a = (s3 - b*s2)/n
最后便是作图,plt.scatter()绘制散点图,plt.plot是折线图,而np.linspace()则需要根据实际数据的情况进行合理取值
plt.scatter(cols1,cols2,color = 'blue')
x=np.linspace(0,100,1000)
y=b*x+a
plt.plot(x,y,color="red")
plt.show()
这个是我第一次成功运行后得出的图像(实验室提供的第一组数据)虽然可能更适合二次拟合?但是大概也是我的第一次成功尝试吧
整体代码如下
import xlrd
import xlwt
import matplotlib.pyplot as plt
import numpy as np
workbook=xlrd.open_workbook(r'2.xls')
sheet=workbook.sheet_by_index(0)
cols1=sheet.col_values(0) #获取第一列
cols2=sheet.col_values(1) #获取第二列
#plt.plot(cols1,cols2)
n=100
s1=0
s2=0
s3=0
s4=0
for i in range(n):
s1 = s1 + cols1[i]*cols2[i]
s2 = s2 + cols1[i]
s3 = s3 + cols2[i]
s4 = s4 + cols1[i]*cols1[i]
b = (s2*s3-n*s1)/(s2*s2-s4*n) #最小二乘法获取系数的公式
a = (s3 - b*s2)/n #最小二乘法获取系数的公式
plt.scatter(cols1,cols2,color = 'blue')
x=np.linspace(0,15,100)
y=b*x+a
plt.plot(x,y,color="red")
plt.show()
PS:谨记,利用excel导入数据的时候一定要记得检查表格中数据的类型,由于当时一开始表格内部的数并不是以数字存储的,读入的时候可能是以字符?文本?反正是不能正确显示,直接就是一个莫名其妙的y=x图像,惊了我都,一直以为是我代码错误,后来才觉察到。
我还特地又搞了一回错的来纪念这个奇怪的情况...
来自蒟蒻的瑟瑟发抖...【对萌新的我造成了极大的伤害/蒙圈
Python实现——一元线性回归(最小二乘法)的更多相关文章
- Python实现——一元线性回归(梯度下降法)
2019/3/25 一元线性回归--梯度下降/最小二乘法_又名:一两位小数点的悲剧_ 感觉这个才是真正的重头戏,毕竟前两者都是更倾向于直接使用公式,而不是让计算机一步步去接近真相,而这个梯度下降就不一 ...
- Python实现——二元线性回归(最小二乘法)
2019/3/30 二元线性回归--矩阵公式法_又名:对于python科学库的糟心尝试_ 二元线性回归严格意义上其实不过是换汤不换药,我对公式进行推导,其实也就是跟以前一样的求偏导并使之为零,并且最终 ...
- 一元线性回归模型与最小二乘法及其C++实现
原文:http://blog.csdn.net/qll125596718/article/details/8248249 监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等), ...
- 梯度下降法及一元线性回归的python实现
梯度下降法及一元线性回归的python实现 一.梯度下降法形象解释 设想我们处在一座山的半山腰的位置,现在我们需要找到一条最快的下山路径,请问应该怎么走?根据生活经验,我们会用一种十分贪心的策略,即在 ...
- 机器学习:Python中如何使用最小二乘法
之所以说"使用"而不是"实现",是因为python的相关类库已经帮我们实现了具体算法,而我们只要学会使用就可以了.随着对技术的逐渐掌握及积累,当类库中的算法已经 ...
- 回归分析法&一元线性回归操作和解释
用Excel做回归分析的详细步骤 一.什么是回归分析法 "回归分析"是解析"注目变量"和"因于变量"并明确两者关系的统计方法.此时,我们把因 ...
- python实现简单线性回归
之前推导了一元线性回归和多元线性回归,今天就用python来实现一下一元线性回归 先看下之前推导的结果 , 第一种是用循环迭代的计算方法.这里的x,y是numpy中的array类型 def su ...
- 机器学习---用python实现最小二乘线性回归算法并用随机梯度下降法求解 (Machine Learning Least Squares Linear Regression Application SGD)
在<机器学习---线性回归(Machine Learning Linear Regression)>一文中,我们主要介绍了最小二乘线性回归算法以及简单地介绍了梯度下降法.现在,让我们来实践 ...
- R语言解读一元线性回归模型
转载自:http://blog.fens.me/r-linear-regression/ 前言 在我们的日常生活中,存在大量的具有相关性的事件,比如大气压和海拔高度,海拔越高大气压强越小:人的身高和体 ...
随机推荐
- 【整理】Android中的gravity和layout_gravity区别
[背景] 在Android中,想要设置个按钮的水平对齐,都累死了: [已解决]ADT中已设置TableLayout布局的情况下如何设置按钮居中对齐 所以现在有必要搞清楚,到底gravity和la ...
- OO设计基本原则
OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象 ...
- Pascal三角形
Pascal算法呢,很简单,因为有了推导公式nCr,而当我们刚刚接触一个事物时,面对要解决的问题,归纳分析得到规律,再通过编程,控制流程,对象,语言,方法,属性得到我们想要的结果.如果这次不是PAsc ...
- 【287】◀▶ arcpy 常用类说明
ArcPy 类列表(按字母顺序) 01 Raster 创建一个可在 Python 脚本或地图代数表达式中使用的栅格对象. 02 Cursor Cursor 是一种数据访问对象,可用于在表中迭代 ...
- 尝试在centos5下运行phantomjs2
在redhat5上运行plantomjs 2,出现如下错误 bin/phantomjs: /lib64/libz.so.1: no version information available (req ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial—5.5 控制语句: for, while, if 语句
5.5 控制语句: for, while, if 语句 参考视频: 5 - 5 - Control Statements_ for, while, if statements (13 min).mkv ...
- Linux的基本指令--服务器
ftp: 1.安装vsftpd服务器 sudo apt-get install vsftpd 2.创建一个空目录,供用户上传:创建服务器文件夹,ftp服务器,服务器端和客户端,我建立的是/home/c ...
- Subscript & Inheritance
[Subscript] 1.subscript的定义: 2.Subscript的使用: 3.可以定义多维subscript: 多维Subscript的使用: [Inheritance] 1.overr ...
- linux下rsync命令详细整理
点评:rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一详细说明,需要了解的朋友可以参考下-在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命 ...
- 最新Eclipse Photon安装tomcat
发现最新版的eclipse竟然没有tomcat配置项,可能是因为spring boot很火,所以server默认就不包含tomcat,需要手动安装组件, Version: Photon Releas ...