本篇大纲:
1、推导出线性回归的损失函数loss
2、推导出线性回归中Theta的求解公式
3、代码试验公式的准确性
开篇预警:
本篇内容主要目的是为了知其然更知其所以然,故而会从源头开始推导到最终的Theta取值。
需要涉及到一些基本数学知识,比如中心极限定理,极大似然估计,矩阵求导,矢量运算,凸函数性质等。
整体推导可能会略显枯燥,可以选择跟着思路走一遍,也可直接查看结果,但若自己跟着从头推下来,相信会和楼主一样,会有一种很舒服的感觉,也能略微体会到一点那“数学之美”。
正题:
首先,我们需要了解线性回归的背景:
1、它是有监督的。
2、它是对于连续性数值的预测。(比如房价预测,比如本月家庭用电数量预测,其预测对应的值域都是连续性的)
3、它和自变量之间存在着某种线性关系。(高次函数通过变量替换依然能看成是线性的)
其次,以房价作为引入示例
我们知道这样的背景:
房屋的价格会受着房屋面积,房间数量,房屋楼层,地理位置,房屋装修配置等等的影响。
这里,
我们将要预测的目标:房屋的价格作为因变量,记为
我们将所有可能影响的因素,比如后面列举的房屋面积,房间数量,房屋楼层,地理位置,房屋装修配置等,作为自变量(也叫特征变量),记为
由于我们认为每一个变量和因变量之间应该存在着某种关系,故而,我们记为
有了房价和各个特征变量的关系式,那么下一步就是要计算出每一个特征变量x对应的系数theta的值。
为了区分是自己预测的y还是真实的y,我们如下标记我们自己预测的y
那么,对于真实的y值,由于每一个预测和真实值之间都会存在其误差项,故而,我们可以获得真实值y的表达式:
这里的epsilon即为误差项。
由中心极限定理我们可以认为,误差项epsilon是独立同分布,并且符合均值为0,方差为某定值的高斯分布。
当然,误差一般会分为模型误差和随机误差,我们需要尽可能降低的是模型误差,由于随机误差主要是来源于数据取样过程中一些不可控因素,也难以避免,故而不是我们讨论的范畴。
那么接下来就让我们来逐步剖析一番(由于用编辑器输入数学符号一来比较慢,二来写起来实在没有那种推导的感觉,故而接下来楼主会选择使用手写推导来完成这个过程)
此时,我们也就得到了每一组样本下对应取到真实值y的概率。
对于极大似然估计一点没印象的小伙伴,可以需要稍微谷哥度娘一下求解过程。
到这里,我们知道,
要想“给定theta,在已知x的前提下,获取y值”的概率越大,即P值想越大,则L(theta)也越大
要想L越大,则ln(L)也越大
这里对于每个场景下的样本值,其均值和标准差我们并没有办法去控制,如前面所说,我们能调整的,是模型误差。
故而要想ln(L)越大,则被减项
越小
而由于对样本方差的不可控性
所以,我们实际上是需要
越小越好
故而我们定义这里的损失函数为
到这里为止,是不是还算很简单,已经到达了第一个小山坡了,我们再确定一下我们的历程以及最根本的目标。
我们希望能求出一组theta,使得在给定x以后能最大概率得获得y的真实值。
而要想求出这组theta,则需要L(theta)最大
L(theta)最大,则需要ln(L)最大
Ln(L)最大,则需要loss函数最小
换而言之,我们的目标是为了获取loss最小时的那组theta值。
那么接下来我们要做的,就是求解loss函数取到最小时theta的取值。
前方略带高能!!!
前方略带高能!!!
前方略带高能!!!
为了进一步能让人理解每一步的推导过程,我们先给出一些预备点预热,然后再进行推导。
最后,在开始正式求解loss前,我们理一理求解的思路:
对于二元函数 y=f(x)=x^2 求最值来说,我们直观的做法是
1、求导
2、求极值点
3、获取极值
4、若是闭区间,则和边界点做比较
5、若是无穷区间,则以极值点来做为最值点(由凸函数的性质决定)
而对于具有多维theta的loss函数而言,其实过程也是如此:
计算量是不是还是很少的,推下来是不是对数学感受到了一点亲切。
由于损失函数是二阶凸函数,故而当取得极小值theta值时即为当前的最小值。
换一句话说,也就是此时的theta则是我们所需要求解的theta。
最后我们来简单实践检验一下这个公式的可靠性。
即验证
直接上源码:
看,我们构造了一个 y1 = x1 + 2*x2 + 3*x3 ,用公式计算出来的参数值也和我们预计的一模一样。
看来在小量数据的时候,用直接公式法还是很靠谱的。实际上,sklearn里面的线性回归算法用的也是直接求解法来获取结果。
那么到这里,求知欲旺盛的小伙伴可能会提问:
如果x.T点积x不可逆怎么办
线性拟合达不到拟合效果怎么办
拟合效果是不是越高就一定越好
现实中能解决什么问题了
实际开发的例子有木有。
请看下回分解。
领取专属 10元无门槛券
私享最新 技术干货