最近老师让我学习线性回归编程模型,此篇介绍使用最小二乘法实现单机器线性回归。
线性回归背景
在生活中,我们常常会发现,一个现象可以由很多因素共同作用才会发生,我们把现象称为t,把影响它的因素1,因素2,因素三…因素m称为x1,x2…xm,把每个因素的影响权重称为w1,w2…wm。那么会存在一个现象,即 t=w1x1+w2x2+…+wm*xm。例如房价,受到地方,人口,银行,土地政策四个因素的共同作用,我们以全国三个城市的房价为例,即我手上一共有三组数据:
城市 | 省GDP | 人口流入量 | 银行 | 土地起拍 | 房价 |
---|---|---|---|---|---|
石家庄 | 3.6万亿 | 40万 | 4.35% | 8000 | 1.2万 |
西安 | 2.44万亿 | 11万 | 4.35% | 7000 | 1.3万 |
天津 | 1.88万亿 | 0.78万 | 4.35% | 1.5万 | 3万 |
假如我手上哈尔滨的相关数据,我需要根据我已知数据找到一个房价预测公式,该公式包含上述因素和因素对应权重,即 房价=因素1权重1+因素2权重2+…+因素m*权重m。 最后,我通过哈尔滨的一系列因素值,能够较为准确的预测出哈尔滨的房价。以上通过样例数据找各个因素的权重的过程就是线性回归。
最小二乘法计算线性回归
数据的准备
因为我们要根据样例数据去预测未知结果,所以我们的样例数据格式为:
样例数据最终结果 | 因素1权重 | 因素2权重 | … | 因素m权重 |
---|---|---|---|---|
我们使用t(i)去记录第i个样例数据最终结果。
我们使用(x(i,0),x(i,1),x(i,2)…x(i,m))表示第i组数据,一共n组数据。
令w(j)表示第j个因素的权重。
把数据转换成数学
损失函数
损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。这里我们只说平方损失函数:实际结果和观测结果之间差距的平方和。使用损失函数是一种能够查看当前模型准不准确的手段。损失函数越小,证明当前模型越准确。损失函数计算公式为:
损失函数在本例中的推导如下:
损失函数变形 step 1:
损失函数变形 step 2:
根据损失函数计算最终结果
对于上述图片中的损失函数来说,t是我们的样例数据结果值,它是已知的,x是我们样例数据影响因素值,它们也是已知。事实上,对于该损失函数来说,它是一个多元函数,它的自变量为:w0,w1,w2…wm,若要使损失函数降到最小,实际上是要一组w值,使得该损失函数的值能够最小。 由此涉及到多元函数求导问题,导数为0的地方则为极值处。
由于我们把一组w当做一个列向量来看待,现在给出针对列向量的微分公式:
根据上图公式,对损失函数求微分的过程如下:
总结
对此,线性回归最小二乘法的公式推导过程已经结束。但是,其中涉及的一些公式,我只是使用,并不知道它们的完整推导过程,其中这个问题最严重地体现在对一系列变量(列向量)的求微分的公式。我学习这个线性回归,主要是想用线性回归为例,学习GPU和CPU下处理大数据的性能对比。本着想写一个系列总结,有利于自己将来学习的想法,下一节打算写以一元线性回归为例的CUDA的最简单使用。