【机器学习11】Python 线性回归算法基础

栏目: 数据库 · 发布时间: 7年前

内容简介:可能是线性回归算法最生动的解释。摘要:线性回归基础。之前我们介绍了:kNN 算法,主要用于解决分类问题,也可以解决回归问题,它有很多优缺点,其中一个缺点是模型结果不具有可解释性,而很多时候我们是希望得到的模型是能够作出合理解释的,以便指导业务。今天要介绍的

可能是线性回归算法最生动的解释。

摘要:线性回归基础。

之前我们介绍了:kNN 算法,主要用于解决分类问题,也可以解决回归问题,它有很多优缺点,其中一个缺点是模型结果不具有可解释性,而很多时候我们是希望得到的模型是能够作出合理解释的,以便指导业务。今天要介绍的 线性回归(Linear Regression)模型就是一个很好的可解释模型 。

比如建立了一个关于房价和房屋面积的线性回归模型:y(房价)= 15000*x(房屋面积)+ 100

就可以解释成:房屋面积每增加一平米,房价就会增加 15000 元。

除了这个优点以外,线性回归还有一个重要的优点是它是很多机器学习算法的基础,比如之后会介绍的多项式回归、逻辑回归、svm。通常在建立复杂的模型前都会先尝试一下线性回归模型,所以很有必要学好它。

下面就正式开始,相比与 kNN 模型,我们更熟悉线性回归,因为它和初中学过的一元函数 y = k*x + b 很像,算法思想也比较简单,仅多了一点数学公式推导。

和 kNN 算法一样,依然通过一个小场景切入该算法:

场景代入

小花是一家房屋中介销售员,一天有个客户打电话过来说,想卖掉自己一套 80 平米的房子,问小花这边能报价多少。小花在电话中说查询一下稍后给客户报价。放下电话后她赶紧查看过往房屋销售记录,想从中找个参考价格,但发现此前并没有接手过 80 平米的房子,便一下犯了难不知道报多少合适,报高了自己吃亏,报少了客户可能去别家。

作为小花的同事,你把一切看在眼里,善解人意地问她是否需要帮忙,她如找到救星一般,一边点头一边抓住你的手,拜托你给她个参考价出来。你不慌不忙拿出纸笔,一顿狂算后给了小花一个答案:125 万,在这个基准价上适当调整。

小花告诉了客户后很顺利地拿下这一单。走到你跟前抛来崇拜的眼神,说下班要请你吃饭,你口头忙说不用客气心里却万马奔腾。下班后,小花带你去了一家她和闺蜜常去的店,还专门点了瓶红酒。喝到微醺恍惚之时,你发觉不知什么时候小花坐到了你身边,你面红耳赤小心脏扑通直跳,不敢想接下来会发生什么,只好装懵闭上了眼睛。只感觉小花越来越近,近到快贴到耳根边,感觉要发生点什么的时候,听到她飘来一句:那个房自你为什么确定报价 125 万?

你睁开眼发现小花坐在对面认真地在等你的回答,才发觉刚才是自己在 YY,只好抛出一句自己的口头禅来化解尴尬: 无他,唯机器学习熟尔。

段子编完了。。。

线性回归解释

下面我们就从这个案例中抽象出一个线性回归模型,然后 Python 手写该模型解决为什么答案是 125 万而不是其他价格。

由于小花手上只有一组少量的房屋成交记录,这组记录仅由房屋面积和报价两列数据组成(为了建模而作的简单假设),可以绘制到坐标轴中,横轴是房屋面积,纵轴是房价:

【机器学习11】Python 线性回归算法基础

现在,我们需要根据这组数据去给客户 80 平米的房子预测出一个合理价格。显然,仅凭这几个散点找不到任何规律,房价可以给出很多值:

【机器学习11】Python 线性回归算法基础

不过,我们看到房价和房屋面积呈现一定的线性关系,于是自然地想到是否可以 画出一条直线,能够最大化地拟合住所有红色样本点。 这条直线能够代表样本的总体规律,从而可以建立一个线性方程:y = ax + b,将 x = 80 代入该方程就可以预测出最合适的房价:

【机器学习11】Python 线性回归算法基础

不过新的问题又来了,如何确定这条直线就能够最大化地拟合红色样本点?因为还可以画很多其他直线:

【机器学习11】Python 线性回归算法基础

从图中可以看出每个样本都有预测房价和实际房价,且每条直线的预测房价不尽相同。所以可以想出这一个方法来 判断直线拟合程度的好坏 :

计算各直线上全部样本点的实际房价和预测房价的差值,然后出求它们的总和,哪条直线的总和最小,就认为该条直线拟合效果最好。

不过差值有正有负,为了避免相互抵消,可以换成计算差值的平方和:

$$

\sum_{i=1}^{m}\left(y^{(i)}-\hat{y}^{(i)}\right)^{2}=

\sum_{i=1}^{m}\left(y^{(i)}-a x^{(i)}-b\right)^{2} \

y^{(i)}:实际值\

\hat{y}^{(i)}=a x^{(i)}+b :预测值

$$

这个平方和也叫 损失函数(loss function) ,损失的意思就是指拟没有拟合到真实值的部分。在图中,实际房价减去预测房价的差值就是没有拟合到的房价差,也就是损失值。

另外,这里的未知数不再是 x 和 y (x y 都是已知样本值)而是斜率 a 和 截距 b,相当于是关于 a 和 b 的二次方程,也可以看成是一条抛物线,它是有最小值的。

所以,我们的 目的从找到一条最大化拟合住所有红色样本点的直线,转变成找到一条损失函数达到最小的直线 。

寻找这条直线显然不能靠手动划线去找,因为穷举不完。可以换个思路: 求出该损失函数的最小值,反解出未知数 a 和 b,这样就可以找到这条直线。 如何求该函数的最小值呢?这就可以用到中学学过的函数求导来解决,让导函数等于 0 找到函数最小值。

到这儿,找直线问题就转变成了数学求导。求导不难高中数学知识就够,我们来一步步写下:

线性回归公式推导

为了方便求导,令该损失函数等于 J(a,b),分别对 a 和 b 求偏导,令其等于 0 计算出 a 和 b 的值:

$$

J(a, b)=\sum_{i=1}^{m}\left(y^{(i)}-a x^{(i)}-b\right)^{2} \qquad \frac{\partial J(a, b)}{\partial a}=0 \quad \frac{\partial J(a, b)}{\partial b}=0

$$

b 的形式简单些,所以先对 b 求导:

$$

\frac{\partial J(a, b)}{\partial b}=\sum_{i=1}^{m} 2\left(y^{(i)}-a x^{(i)}-b\right)(-1)=0\

\

\sum_{i=1}^{m}\left(y^{(i)}-a x^{(i)}-b\right)=0\

\\

\sum_{i=1}^{m} y^{(i)}-a \sum_{i=1}^{m} x^{(i)}-\sum_{i=1}^{m} b=0\

\

\sum_{i=1}^{m} y^{(i)}-a \sum_{i=1}^{m} x^{(i)}-mb=0\

$$

很容易地就能求出 b 的值:等于 y 的均值减去 a 乘以 x 的均值:

$$

m b=\sum_{i=1}^{m} y^{(i)}-a \sum_{i=1}^{m} x^{(i)}\

\

b=\overline{y}-a \overline{x}

$$

我们已有全部样本点的 x 和 y 值,所以均值很简单就能计算出来,只需要求出 a,稍微复杂点:

$$

\frac{\partial J(a, b)}{\partial a}=\sum_{i=1}^{m} 2\left(y^{(i)}-a x^{(i)}-b\right)\left(-x^{(i)}\right)=0\

\sum_{i=1}^{m}\left(y^{(i)}-a x^{(i)}-b\right) x^{(i)}=0\

1 把 b 代入:\

\sum_{i=1}^{m}\left(y^{(i)}-a x^{(i)}-\overline{y}+a \overline{x}\right) x^{(i)}=0\

2 分别乘入 x^{(i)}:\

\sum_{i=1}^{m}\left(x^{(i)} y^{(i)}-a\left(x^{(i)}\right)^{2}-x^{(i)} \overline{y}+a \overline{x} x^{(i)}\right)=0\

\sum_{i=1}^{m}\left(x^{(i)} y^{(i)}-x^{(i)} \overline{y}-a\left(x^{(i)}\right)^{2}+a \overline{x} x^{(i)}\right)=0\

3 将 a 整理合并:\

\sum_{i=1}^{m}\left(x^{(i)} y^{(i)}-x^{(i)} \overline{y}\right)-\sum_{i=1}^{m}\left(a\left(x^{(i)}\right)^{2}-a \overline{x} x^{(i)}\right)\

\sum_{i=1}^{m}\left(x^{(i)} y^{(i)}-x^{(i)} \overline{y}\right)-a \sum_{i=1}^{m}\left(\left(x^{(i)}\right)^{2}-\overline{x} x^{(i)}\right)=0

$$

最后就能求出 a:

$$

a=\frac{\sum_{i=1}^{m}\left(x^{(i)} y^{(i)}-x^{(i)} \overline{y}\right)}{\sum_{i=1}^{m}\left(\left(x^{(i)}\right)^{2}-\overline{x} x^{(i)}\right)}

$$

不过该公式还略微复杂,我们还可以进一步整理让 a 跟 x 和 y 的均值产生联系,对分子第二项做变换:

$$

\sum_{i=1}^{m} x^{(i)} \overline{y}=\overline{y} \sum_{i=1}^{m} x^{(i)}=m \overline{y} \cdot \overline{x}=\overline{x} \sum_{i=1}^{m} y^{(i)}=\sum_{i=1}^{m} \overline{x} y^{(i)}

$$

变换后,发现 x 和 y 对调后上式也成立。

接着再从另一个角度变换:

$$

\sum_{i=1}^{m} x^{(i)} \overline{y}=\overline{y} \sum_{i=1}^{m} x^{(i)}=m \overline{y} \cdot \overline{x}=\sum_{i=1}^{m} \overline{x} \cdot \overline{y}

$$

这样就可以对 a 的表达式做替换,分子和分母,各加一项同时减去相等的一项(等于没加没减):

$$

a =\frac{\sum_{i=1}^{m}\left(x^{(i)} y^{(i)}-x^{(i)} \overline{y}-\overline{x} y^{(i)}+\overline{x} \cdot \overline{y}\right)}{\sum_{i=1}^{m}\left(\left(x^{(i)}\right)^{2}-\overline{x} x^{(i)}-\overline{x} x^{(i)}+\overline{x}^{2}\right)}

$$

然后就可以变换了,分子合并因式分解项,分母写成完全平方公式项:

$$

a =\frac{\sum_{i=1}^{m}\left(x^{(i)}-\overline{x}\right)\left(y^{(i)}-\overline{y}\right)}{\sum_{i=1}^{m}\left(x^{(i)}-\overline{x}\right)^{2}}

$$

到这里, a 和 b 的计算公式就都和 x 和 y 的均值产生联系了,很容易能求出:

$$

a=\frac{\sum_{i=1}^{m}\left(x^{(i)}-\overline{x}\right)\left(y^{(i)}-\overline{y}\right)}{\sum_{i=1}^{m}\left(x^{(i)}-\overline{x}\right)^{2}} \qquad b=\overline{y}-a \overline{x}

$$

所以只要把数学公式推导出来,就可以用简单的几行 Python 代码计算出 a 和 b,有了 a 和 b 就能解出直线 y 的表达式,从而绘制出前面的最佳拟合直线。

Python 手写线性回归

【机器学习11】Python 线性回归算法基础

【机器学习11】Python 线性回归算法基础

如果觉得推导过程难,可以只记住 a 和 b 的表达式。

以上我们介绍了线性回归算法,并用简单的 Python 代码实现了该算法预测出了房价。

不过前面在计算斜率 a 的值时,使用了 for 循环,当数据量很大时这种方法效率很低,其实可以采用另一种高效率方法: 向量化运算。 我们下一篇文章介绍,并将线性回归算法封装成一个类似 sklearn 中的线性回归库。

本文的 jupyter notebook 代码,可以在公众号:「 高级农民工 」后台回复「 LR1 」得到,加油!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Practical Vim, Second Edition

Practical Vim, Second Edition

Drew Neil / The Pragmatic Bookshelf / 2015-10-31 / USD 29.00

Vim is a fast and efficient text editor that will make you a faster and more efficient developer. It’s available on almost every OS, and if you master the techniques in this book, you’ll never need an......一起来看看 《Practical Vim, Second Edition》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具