线性回归及其Python实现(最大似然法)

标签: Python 机器学习

本节内容总结于博主在牛客网机器学习特训营的笔记

参考资料:《机器学习实战》

目录

1.什么是线性回归(Linear Regression)

维基百科:线性回归

在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。

按照博主自己的理解,线性就是因变量的变化量和自变量的变化量成比例(比如1个鸡蛋1元钱,2个鸡蛋2元钱,3个鸡蛋3元钱,其中价格变化量:鸡蛋变化量始终为1:1),数学上表现为一阶导数为常数。例如这个例子的线性回归方程就是y=x,一阶导数y′=1。

线性回归就是把因变量和自变量之间的关系看做线性的关系,然后求它们之间线性关系,感觉是一种减熵的效果,所以是回归。比如把人脚底板长度作为自变量,身高作为因变量,那么在这两种数据之间就可以做一个简单线性回归,可以得到脚底板长度和身高的关系式。公安人员可以依据这种方法从犯罪现场的脚印推断出犯罪嫌疑人身高。

2.回归系数公式推导

假设因变量为y,自变量为x1,x2,...,xn,则有

y=hw(x)=w0+w1x1+...+wnxn=∑i=0nwixi=wTx(1)

w0是x0=1的系数,表示全局偏移量,在平面直线中的具体意义为截距,也作为自变量的一个维度。

因为种种原因,数据是按照一定的误差分布在拟合的曲线两边,否则只需要少数的几个数据就能拟合出完美的直线了。幸运的是,这种误差符合正态分布,所以从此处入手开始推导线性回归方程。

假设一共有m个样本,对于第i个数据(注意不是平方),有

y(i)=wTx(i)+ξ(i)(2)

其中ξ(i)概率密度为正态分布的概率密度

p(ξ(i))=12π−−√σexp[−(ξ(i))22σ2](3)

结合(2)(3)式有

p(y(i)|x(i);ξ(i))=12π−−√σexp[−(y(i)−wTx(i))22σ2](4)

有了(4)式就可以得到似然函数

L(w)=∏i=1mp(y(i)|x(i);ξ(i))=∏i=1m12π−−√σexp[−(y(i)−wTx(i))22σ2](5)

似然函数是根据样本估计分布参数w的,为什么相乘?可以理解为独立事件互不影响,它们同时发生的概率就是相乘,所以求出使得似然函数最大时的w^最接近理论中的w(点击查看最大似然估计的例子)。似然函数中有指数,取对数比较好计算,故有对数似然函数

l(w)===logL(w)log∏i=1m12π−−√σexp[−(y(i)−wTx(i))22σ2]mlog12π−−√σ−1σ2⋅12∑i=1m(y(i)−wTx(i))2(6)

我们取目标函数

J(w)=12∑i=1m(y(i)−wTx(i))2(7)

似然函数有最大值时,目标函数有最小值,我们对(7)式进行求导即可得到

w

的估计值,不过先整理一下等式,用矩阵

X

表示

m

n

维样本,每一行表示一个样本,则

X

M×N

阶矩阵,将矩阵

X

整合到公式中

J(w)=12∑i=1m(y(i)−wTx(i))2=12(Xw−y)T(Xw−y)(8)

对(8)式求向量w导数

J′(w)=XTXw−XTy(9)

求目标函数的最小值,那么最小值的点应该是驻点,有

0⇒w=XTXw−XTy=(XXT)−1XTy(10)

(10)就是推导出求w的等式,这里要求XXT是可逆的,因此采集的样本的个数一定要比样本的维数多,而且最好没有没有无效的数据,所以样本的数量最好好远远大于样本的维数,这样计算的回归系数会更加的准确。

3.线性回归Python实现

代码主要分为两个部分,第一个部分模拟样本的采集,第二个部分是线性回归。

样本的生成公式为

y=0.5∗x+3+random∗4∗sinx

其中

random

是[0,1]之间的一个随机的小数。按照这个样本的计算的线性回归系数

w

,应该接近

[3,0.5]T

import numpy as np

import matplotlib.pyplot as plt

import math

import random

#制造样本

x = np.arange(0, 100, 0.2)

xArr = []

yArr = []

for i in x:

lineX = [1]

lineX.append(i)

xArr.append(lineX)

yArr.append( 0.5 * i + 3 + random.uniform(0, 1) * 4 *math.sin(i) )

#线性回归

xMat = np.mat(xArr)

yMat = np.mat(yArr).T

xTx = xMat.T * xMat

if np.linalg.det(xTx) == 0.0:

print "Can't inverse"

ws = xTx.I * xMat.T * yMat

print ws

y = xMat * ws

#画图

plt.title("linear regression")

plt.xlabel("independent variable")

plt.ylabel("dependent variable")

plt.plot(x, yArr, 'go')

plt.plot(x, y, 'r', linewidth = 2)

plt.show()

样本数据和回归直线:

4.线性回归的应用

线性回归主要有两个用处,一个是预测,一个是分类。

4.1预测

以上面的线性回归为例子,我们只采集了自变量为[0,100]的数据,但是经过线性回归方程则可以预测出自变量在[100,200]内对应的因变量。常见的应用是GDP,石油价格和股票价格趋势预测(参考维基百科)。

4.2分类

上图中有圆形样本点和三角形样本点,中间红色的线是回归方程所对应的曲线,线性回归方程是y=f(x)。可以做一个简单的判断,对于一个样本(x0,y0),可以计算y=f(x0),当y

5.总结

线性回归应用广泛,计算简单,应当明白其推导过程和最终求解表达式

本文介绍了最大似然法求回归系数,还有梯度下降法求回归系数

线性回归最后的结果是一个直线,可能还不能达到我们的要求,比如本例想要得到接近y=0.5∗x+3+4∗sinx的结果,则可以使用局部加权线性回归

对于XXT不可逆的情况,可用岭回归方法

最后推荐3个良心资料

Harrington P. 机器学习实战[J]. 人民邮电出版社, 北京, 2013.

李航. 统计学习方法[J]. 2012.

维基百科(有离线版)

6.附录

6.1维基百科中最大似然估计的一个例子

python做线性回归统计推断提取参数_线性回归及其Python实现(最大似然法)相关推荐

  1. python做线性回归统计推断提取参数_概率分析方法与推断统计(来自我写的python书)...

    在数据分析统计的场景里,常用的方法除了描述性统计方法外,还有推断统计方法,如果再从工作性质上来划分,推断统计包含了参数估计和假设验证这两方面的内容.而推断统计用到了很多概率统计方法,所以本小节在介绍推 ...

  2. python类方法需要传入cls参数_如何从Python 3.x中的类定义传递参数到元类?

    这是如何从类定义向元类传递参数的python 3.x版本?问题,根据请求单独列出,因为答案与python 2.x明显不同. 在python 3.x中,如何将参数传递给元类的__prepare__.__ ...

  3. 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?

    如何批量处理评论信息情感分析,并且在时间轴上可视化呈现?舆情分析并不难,让我们用Python来实现它吧. 痛点 你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价.从前,你苦恼的是顾客不爱写评价.最 ...

  4. 用python做我的世界代码_从零开始用Python做一个Minecraft成就(进度)生成器

    最近看到mcmod百科上有个叫成就生成器的东西,于是也想用Python做一个. 大致思路: 一张成就图像,需要有底图,图标和和说明文字三个部分. 成就的图标比较难搞,我使用的是Minecraft Wi ...

  5. python 函数不确定传入参数_如何使用python传入不确定个数参数

    如何使用python传入不确定个数参数 这篇文章主要介绍了如何使用python传入不确定个数参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Py ...

  6. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  7. python中函数的可变参数_简单谈谈Python中函数的可变参数

    前言 在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数. ...

  8. 用python做股票量化分析豆瓣_小白学 Python 爬虫(24):2019 豆瓣电影排行

    人生苦短,我用 Python 前文传送门: 引言 从本篇的标题各位同学应该已经猜到了,本篇又到了实战环节~~~ 2019 已经快过完了,按照本文推送的时间预估,到 2020 应该还有十来天的时间,又到 ...

  9. python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法

    一般情况下,在调用函数时,使用的是位置参数,即是按照参数的位置来传值:关键字参数是按照定义函数传入的参数名称来传值的.那么,关键字参数怎么使用? 工具/原料 python pycharm 截图工具 W ...

最新文章

  1. 多线程不重复读取数据_用 PHP 实现多线程编程
  2. linux里grep和egrep,fgrep的区别
  3. 如何在Kubernetes中暴露服务访问
  4. JMS中queue和topic区别
  5. Groovy里的运行时元数据编程(metata programming)
  6. oracle 10g 安装介质,如何从Oracle 10g的安装介质中提取BBED必须的sbbdpt.o和ssbbded.o库文件...
  7. 电脑知识:BIOS和UEFI的对比介绍!
  8. 扎心了,程序员2017到2019经历了什么?
  9. linux内核有ebpf吗,聊聊很重要的内核技术eBPF
  10. 用Office2010做博客园客户端
  11. linux中文显示和输入
  12. foobar 2000 介绍
  13. 私活之安卓论坛Demo
  14. 尚学堂马士兵_Struts2下载完成
  15. twitter 授权过程
  16. ELK日志平台---老男孩教育笔记
  17. Word/WPS 文本转换成表格
  18. 360安全浏览器如何锁定极速模式
  19. HTMl+CSS 模仿京东网登录页面
  20. 《数学之美(第一版)》笔记 —— 第6章

热门文章

  1. 视觉检测应用之电路板二维码读取
  2. 大明16帝之:朱厚照
  3. 记录一个海信电视(VIDAA)进入开发者方式
  4. SpringBoot集成Redis笔记-动力节点王鹤
  5. 倍福ads通讯软件_倍福TwinCAT ADS通讯-高级语言.ppt
  6. 苹果mp3软件_一款非常不错的音频格式转换软件
  7. 【84期分享】4款中国风PPT模板免费下载
  8. 记从开始到现在(一)
  9. RT-Thread_rt_kprintf()打印浮点数(解决方法2:添加rt_vsnprintf_full)
  10. X-ray Photoelectron Spectroscopy (XPS)——* 化学位移