今天我们来看一个最常见的机器学习模型——线性回归(linear regression)模型。先举个例子让你明白什么是线性回归。
现在我们有房屋面积和价格的一些数据,如下图:
![2c8cd11ddcd561f35c78e055c68a92bb.png](https://i-blog.csdnimg.cn/blog_migrate/24f26832b908543a77a9555f1b431edf.jpeg)
现在我们想知道的是,如果给一个新的房屋面积130m²,能否根据已知的数据来预测新的面积对应的价格是多少呢?这时,线性回归模型就派上用场了。
我们先画出已知数据的散点图:
![af84893983494198efda4d64e3018dff.png](https://i-blog.csdnimg.cn/blog_migrate/aa6f5c9bbd232541d77e88b6a5a86e5f.jpeg)
那线性回归要做什么呢?它是模拟出一条直线,让已知的数据点尽量落在直线上或直线周围。效果如下图红线所示:
![3ee6f49bd06842d8bcec316755017063.png](https://i-blog.csdnimg.cn/blog_migrate/c3e02ace6fedbe36a321e8dbc1fc6565.jpeg)
用公式表示的话,这个线性模型就是一条直线:
f(x) = wx + b (1)
其中,w为系数,b为截距。
当我们的模型确定后,如果给定一个新数据x‘,只需把x‘带入(1)式,求得的y就是预测的价格了。
在谈如何确定w和b之前,我们先来思考一个问题:假如房屋价格不仅仅受面积因素影响呢?比如还有厕所数量、房屋高度、房屋楼层数等等因素,这时我们又该如何构建我们的线性模型呢?
其实跟(1)式一样,我们添加系数和输入即可:
![85552a493b0363e20bca5528982ba2ea.png](https://i-blog.csdnimg.cn/blog_migrate/092cd53878a91cbfedd74c9f43300c9e.jpeg)
假设我们有n个影响房屋价格的因素,对应的就是n个系数w。(2)式就是我们新的线性模型。那模型既然出来了,该怎么求w和b呢?在求解之前,我们应该了解到,模型预测的结果f(x)是和实际的结果y有一定出入的。也就是说,模型在对原始数据进行训练时,数据点并不一定都落在该模型上。这样就会产生误差,不同的w和b对应不同的线性模型,我们要找的就是误差最小的那个模型所对应的w、b的值。
首先第一步,我们要找一个代价函数(cost function),用它来衡量我们预测的误差,一般用平方和函数来表示:
![577ff334bc54b662e7d4f90771eee0d6.png](https://i-blog.csdnimg.cn/blog_migrate/c3a1a39a1f52fb4ecf07bd1e3c35fdaf.jpeg)
其中,J就是我们的代价函数,f(x)是我们的预测值,y是训练集数据的实际值,m代表数据的个数。代价函数描述的其实是预测值和实际值差的平方和的均值,那我们在前面为什么要加个1/2呢?这纯粹是为了以后求导方便,而且并不影响我们对代价函数的优化。
然后,我们将预测函数f(x)做一个变形,写成向量乘积的形式。
![057b9caca345fe208e3690b0a3948056.png](https://i-blog.csdnimg.cn/blog_migrate/fdf811340ebab18a7b3d4e3da5aa0895.jpeg)
则(2)式可改写为:
![407f08499333940c7475c343d4c0b763.png](https://i-blog.csdnimg.cn/blog_migrate/70a6d2cd90e15b46f89e2aa7cebf6515.jpeg)
不难看出,f(x)可以写作w和x两个向量的乘积:
![8a8106f28d24d965f0f059550977507f.png](https://i-blog.csdnimg.cn/blog_migrate/5a0bdd57a1b32b959ce0b227868f5a91.jpeg)
进一步缩写为:
![dbd78bef144db16bf21764b8e47917b0.png](https://i-blog.csdnimg.cn/blog_migrate/515d531cac7bd3a96720492bed439661.jpeg)
其中,w和x均为n+1维列向量。再将(4)式代入(3)式,可得:
![43d681d0fe42facbdfaaafe06cf289e1.png](https://i-blog.csdnimg.cn/blog_migrate/b6adcbfb5af8283f4111a397f783c909.jpeg)
由f(x)可知,乘积项的求和可以写为两个向量乘积的形式。要想写成向量形式,我们需要将J(w)做一个变形:
![58f3fd38420675c30d97257e8b8b1af8.png](https://i-blog.csdnimg.cn/blog_migrate/d459dc5cb2fb8389ee72613c6526222e.jpeg)
展开,得到:
![1bcabdfd979af69d73fcde201aff1ae5.png](https://i-blog.csdnimg.cn/blog_migrate/ba0ce42a53c2e217861d720d50b7623a.jpeg)
其中,X 为m*(n+1)维矩阵,m是数据的样本个数,n是每一个数据的特征。w为参数向量,y为实际值向量。
OK,现在我们已经把代价函数化简完成了,但别忘了我们的目标是求当J(w)取最小值时,所对应w的值。可以证明J(w)为凸函数(证明过程暂略),所以当我们对J(w)求导时,令导数为0,J(w)即可取最小值,相应可求得w。(注意w为向量)
在求导之前,我们先记住几个结论,一会就直接用了:
![6439fdafeb283b57bf027bc03bfa6ab4.png](https://i-blog.csdnimg.cn/blog_migrate/8d39e45034641ca1d126b11ff7ebc0c0.jpeg)
随后,我们令k=Xw-y,则J(w)可写为
![d374d9fe118d0d5b1c3665dff84f2196.png](https://i-blog.csdnimg.cn/blog_migrate/9bea008a8d6945e4a434fd5561776433.jpeg)
对其求导,应用结论1,得
![be0bc18d6e1c2b30e5764d876c858d91.png](https://i-blog.csdnimg.cn/blog_migrate/b8a84294fbd19d072a1f87cc66d22505.jpeg)
我们先求k',运用结论3,可得
![cbe3f251f32cf4a29c77bda852e63a29.png](https://i-blog.csdnimg.cn/blog_migrate/7d00c9b68d03a527f278e8b48b045d78.jpeg)
运用结论5,将其改写为
![72fca1e7e6d08c00bc54fb553c933543.png](https://i-blog.csdnimg.cn/blog_migrate/1d1fb48a1c4180fe82aa90d67ccd63a8.jpeg)
运用结论2,继续求导可得
![f6f7ee673fb0ad2d3b585e823eda28f1.png](https://i-blog.csdnimg.cn/blog_migrate/91f08f700d37b90d962012242f2c2b3a.jpeg)
运用结论4、5,并化简
![92a60352ee20ed82d699e8cbdbb9aacc.png](https://i-blog.csdnimg.cn/blog_migrate/00e61a4b00e785faac3144d172e6803f.jpeg)
将k=Xw-y代入并展开,可得
![b860451321b76d51cb8b5a80044342f2.png](https://i-blog.csdnimg.cn/blog_migrate/1a4335972405f710d9ec87c60873b8a9.jpeg)
到此为止,我们的求导过程就完成了。接下来,令导数为0,求得w的值即可。令J'(w)=0,可得
![b9c343728da94dd00eab643be26c5485.png](https://i-blog.csdnimg.cn/blog_migrate/1633ee372bf8e3e296a406357c9b6e90.jpeg)
一般情况下,矩阵
![c8647a4ff1f43241884b12f0704c51ce.png](https://i-blog.csdnimg.cn/blog_migrate/531a582c370f25d820979cffec80d9ee.jpeg)
为可逆矩阵(不可逆的情况我们以后会讨论),即可求得w的解为
![db15a84ddc61edcc301eebf3a84f3e29.png](https://i-blog.csdnimg.cn/blog_migrate/ee12dfd4d9d52adf8c30fde28ed84a93.jpeg)
Bingo!(5)式就是我们在代价函数取最小值时,求得的参数向量w。在实际应用中,计算机会帮我们对(5)式求解,得到w的值。但当我们的数据量非常大时,可能会拖慢运行速度。这时,另一种对J(w)优化的算法——“梯度下降法”就该上场了,我们下篇再对它进行介绍。