手撕机器学习算法一——线性回归-梯度下降
一位码农的吐槽
本人码农10年一枚,从去年8月起开始的利用业余时间数学基础到现在的阿里云大学人工智能专业即将毕业,发现我的学习路线有些曲折,有太多想吐槽的地方:各种网络课程选择恐惧症;一堆堆的数学概念难以理解;看了就想晕倒的数学公式;学习过程中学了又忘的焦虑……最终,想说的是被虐待惯了就好了,另外还要有感谢阿里云大学、我的导师赵奇辉和同学们,有你们真好……
今天要和大家一起手撕鬼子,
手撕鬼子不!手误,是一起手撕下线性回归的梯度下降的过程,复杂的数学公式在文章中统统没有体现(有兴趣了之后可以延伸阅读学习),力求没有编程和数学基础的人都能看懂,因为个人认为AI和用水用电一样稀疏平常,人人都可以习得的。
首先看看,我们要解决的是什么样的一个问题?
问题:长沙市某一小区房屋面积和房价表如下,求当前小区房屋面积为120平方的房价预测?
房屋面积与房屋价格关系表为了推演简单,我这里只给出了三条数据,科学家们为了搞懂一些复杂的原理,也常常先简化,这是一个不错的思维方式。
分析问题
用犀利的眼光马上就会发现这题有问题,房价和房屋面积是有关系,但是影响因素应该还有很多,的确是有包含很多其他影响因素,不过,为了了解过程和原理先强行达成一致,我们房价就只受房间面积影响。
强行达成共识,此题中房价只是受房屋面积影响很多情况下,我们可以把数据绘制出来进行观察,使用散点图来看下:
房屋面积与房价的散点图乍一看,这题貌似用初高中知识也可以求解吧,在直角坐标中可以通过一条曲线把这三个点连接起来。
如果不太记得初高中知识,应该大有人在,因为不常用。
为什么可以通过一条曲线把这三个点连起来?可以用数学公式画图工具画图就感受下(mac下用Grapher,window下用Graph),比如输入公式:,效果如下图:
数学公式绘制一条曲线,感觉是可以的三个数据的点连接起来解题步骤如下:
假设曲线公式为:,其中x是房价面积,y是房价,a、b、c是未知系数,把三条数据带入进去之后就可以求系数a,b,c,如下:
,
,
三个系数未知,有三个方程,这样就应该很好求解了a、b、c的值,然后将房屋面积120平方代入到公式便可求得房价预测值y。
这不就完事了,还需要什么机器学习算法吗?那好,我们看下1000个房价与面积的数据,如下图:
1000个房屋面积和房价的数据的散点图如果上图所有点也用一条曲线来连起来,是有点困难的,房价预测这精确度要求不高,即使预测价格稍高于或稍低于一点也没多大关系,所以科学的方法,就是用一条直线去近似,只要在可接受的范围内即可,而且求一条直线的方程计算起来也比较快速,现在我们就要去找这么一条直线,这样的一种方式就可以叫做线性回归了,各个数据点回归到或者是“靠近”到一条直线上(直角坐标系中)。是不是还有点懵?下面补充些通俗的说法。
什么是线性?什么是回归?
先看什么是线性,通俗的说:超市买袜子,每双3元,没有折扣,如果办购物卡也算进来,则消费金额和购买袜子的数量如图所示,为线性关系。在直角坐标系就是一条直线,如下图左侧直角坐标系。
线性与非线性顺便学习下非线性是什么,可加深对线性的理解,通俗的说,非线性关系:路边摊买袜子,一双3元,两双5元,4双10元,此时消费金额和购买袜子的数量如图所示,为非线性关系。在直角坐标系中是一条曲线,如上图右侧直角坐标系。
什么是回归?也就上面提到各个数据点回归到或者是“靠近”到一条直线上(直角坐标系中)。比较笨又爱钻牛角尖的同学都喜欢在“回归”这两字上纠结很长时间,我们不必在“回归”一词上费太多脑筋。这里给出“回归”起源,方便大家记忆,英国著名统计学家弗朗西斯·高尔顿(Francis Galton,1822—1911),“回归”一词就是由他引入的。他对父母身高与儿女身高之间的关系很感兴趣,父辈高的群体,儿辈的平均身高低于父辈的身高;父辈矮的群体,儿辈的平均身高高于其父辈的身高。用高尔顿的话说,儿辈身高的“回归”到中等身高。
进入正题
我们目标是要预测房间面积为120平方的房价,我们希望用一条直线去拟合,但这样的直线可能有很多很多条,如下图:
拟合三个点的线有很多中可能什么是拟合?虽然看过很多次,总感觉有一些陌生或是有一种莫名的不适,但是当在代码中函数命名为fit,这不就是"适合"的意思嘛!在本文中意思就是找一条线去“适合”直角坐标系上面的那些点嘛!
上图中,画了4条线,用肉眼去观察,黑色的线离各点距离最远,红色的线与各点距离最近,红色最为合适,这种评判的思路就叫做最小均方误差,即所有真实值减去对应的预测值的平方的一个值,然后找值最小的一个对应直线,也就是红线。专业一点的说话,是将最小均方误差来做损失函数。
真实值与红线预测值标注,请一定要看清楚什么是真实值,什么是预测值机器学习算法是需要计算机去运行,那计算机是如何去寻找这一条线的呢?最先能想到就是在一定范围内逐个尝试所有可能值,首先假设a、b、c的值范围都是0到100000,然后去逐个尝试所有的可能值,并记录均方误差,最后比较得出一个最小的值,然后得到对应系数a、b、c的值,下面是模拟的一个过程,看过之后应该会清楚了。
机器学习的工作其实就是在假设空间中寻找对当前数据匹配度最高的假设。
过程如下:
第一次计算,尝试a=1,b=1,c=1,代入公式,然后把三条房间面积和房价价格数据带入,然后算均方误差,保存并记录。
第二次计算,尝试a=2,b=1,c=1...代入公式,然后把三条房间面积和房价价格数据带入,然后算术均方误差,保存并记录。
第三次计算,尝试a=3,b=1,c=1,代入公式……
第100001次计算,尝试a=100000,b=2,c=1......
第次计算,a=100000,b=100000,c=100000……
经过次才能完成这个计算过程之后,我们找个结果中寻找最小的一个,然后找出对应的a、b、c,然后把需要预测的120数据代入公式:,就可以求出我们最终的结果了。
上诉计算过程中,可能会存在的问题:
1、假设a、b、c的值的范围不对,数学公式画图工具绘制的曲线中,a应该是负值的小数即-0.111121,我们是不是应该尝试在-100000到100000找更合理。
2、a、b、c每次在递增整数1,可能最终的结果离最优的解还会存在一定距离,即递增是数值有没有可能是带小数点的。
3、这样大海捞针式的计算是非常消耗计算资源,即使目前的硬件越来越便宜了。
有没有一种更好的方式来做呢?突破方向有如下两种:
第一种,提高假设能力,就是对a、b、c值的范围能够准确的判断,作者通过看无数部数学、推理小说和电影,提升作者的数学抽象能力和逻辑推理能力,然后学好易经等......貌似短期内还得不到结果。
第二种,加速a、b、c的向最优值前进的速度,之前a、b、c每次都是增加1,能不能增加2呢?或者更合理的值呢?这样即使范围不对,我们也能早点得到最后的结果。然后在重新尝试一个新的数据范围。恩,这个方向好像有点搞头。
好了,通过上面的分析,我们目标以转变为减少到达最优解的尝试次数呢,这里就是梯度下降用武之地了。
什么是梯度下降?
梯度下降是一种求最优化解的方式,就好比是一小人站在山顶上想要最快速度下山,下山有很多的方向,但那个是最快的方向?下山最快的方向垂直于山的等高线切线的反方向,然后往下走一了一段以后,然后在看看自己是不是在最佳下山方向(即垂直于山的等高线的切线方向),然后往下走一段。这么一直往下走,直到山底。
思考题
1、房价的影响因素有很多,多个因素影响的情况下,我们如何进行房价预测呢?
2、线性回归有梯度下降方式求最优解,是否其他方式求呢?
3、如果收集的数据中存在异常值如何处理?
小结
1、利用初高中知识求解房价的预测过程。
2、现实问题会更加复杂,需要通过一条直线去近似求解房价。
3、很多直线可以拟合,哪一条才是最合适?通过最小均方误差这个评判标准,可以找到一条直线离所有的真实房价值最近。
4、在一定范围内尝试所有可能的值,然后求最小均方误差。这个最小均方误差对应的直线就是我们所求。
5、在一定范围内尝试所有值计算量还是太大了,我们通过梯度下降加速寻找最优解。
6、通过思考题,告诉大家这里仅仅线性回归所涉及的知识一部分,还有很多待求索。
连载手撕机器学习算法:
手撕机器学习算法零——陈思旭的AI入坑记(待续)
手撕机器学习算法二——逻辑斯谛回归(逻辑回归)(待续)
手撕机器学习算法三——BP神经网络(反向传播)(待续)
......
延伸阅读一:深入浅出--梯度下降法及其实现,写的很好。(一波数学公式来袭,习惯就好)
延伸阅读二:An overview of gradient descent optimization algorithms∗(看论文也许会成为你的日常)