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

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

内容简介:可能是线性回归算法最生动的解释。摘要:线性回归基础。之前我们介绍了: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 」得到,加油!


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

查看所有标签

猜你喜欢:

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

C++面向对象程序设计

C++面向对象程序设计

萨维奇 (Walter Savitch) / 周靖 / 清华大学出版社 / 2003-12 / 59.0

《C++面向对象程序设计》具备良好的编排体系,适合打算涉足编程领域的读者阅读,尤其适合大一学生。它最大的特色是Savitch教授最受欢迎的写作风格,这一风格非常适合初学者,能迅速引导他们开始编程实践。《C++面向对象程序设计》包括全面的习题、项目、编程提示、编程示例、编程陷阱以及有用的小结,以帮助初学者更清楚地了解C++。一起来看看 《C++面向对象程序设计》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器