引入

年薪和工作年限有关吗?
在这里插入图片描述
可见两个变量之间存在明显的线性关系,而根据常识,工作年限是因,年薪是果。
那么,是否存在某个模型,如图中的一次函数直线,来描述两个变量之间的关系呢?

原理简述与背景介绍

一元线性回归模型也被称为简单线性回归模型,指模型中只有一个自变量和一个因变量。
其原理可以简述为:用一个(二维中的)直线(以及高维中的超平面)去最大程度地拟合样本特征和样本输出标记(即数据点)之间的关系。
一元线性回归思想简单,但背后有强大的数学理论支持,具有很好的可解释性,是许多强大的非线性模型的基础。

算法推导

基本设定

给定数据集T={(x1,y1),(x2,y2),⋯ ,(xN,yN)} T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \cdots,\left(x_{N}, y_{N}\right)\right\} T={(x1,y1),(x2,y2),,(xN,yN)}其中xi∈X⊆Rx_{i} \in \mathcal{X} \subseteq \mathbb{R}xiXRyi∈Y⊆Ry_{i} \in \mathcal{Y} \subseteq \mathbb{R}yiYRi=1,2,⋯ ,Ni=1,2, \cdots, Ni=1,2,,N
假设决策函数为f(x)=ax+bf(x)=ax+bf(x)=ax+b其中a,ba,ba,b称为回归系数。
可知第iii个元素xix_{i}xi的预测值为yi^=f(xi)=axi+b{\hat{y_{i}}}=f(x_{i})=ax_{i}+byi^=f(xi)=axi+b使用平方损失函数作为损失函数:L(y,f(x))=(y−f(x))2L\left(y,f(x)\right)=\left(y-f(x)\right)^2L(y,f(x))=(yf(x))2求以下经验风险最小化J(a,b)=∑i=1N(yi−yi^)2=∑i=1N(yi−axi−b)2 J(a, b)=\sum_{i=1}^{N}(y_{i}-{\hat{y_{i}}})^{2}=\sum_{i=1}^{N}\left(y_{i}-ax_{i}-b\right)^{2} J(a,b)=i=1N(yiyi^)2=i=1N(yiaxib)2即目标是求取使目标函数JJJ最小的回归系数a,ba,ba,b.

参数求解

1. 求解bbb

bbb求偏导并另令其等于000
∂J(a,b)∂b=∑i=1N2(yi−axi−b)(−1)=0 \frac{\partial J(a, b)}{\partial b}=\sum_{i=1}^{N} 2\left(y_{i}-a x_{i}-b\right)(-1)=0 bJ(a,b)=i=1N2(yiaxib)(1)=0去除系数,即得∑i=1N(yi−axi−b)=0 \sum_{i=1}^{N}\left(y_{i}-a x_{i}-b\right)=0 i=1N(yiaxib)=0展开得到∑i=1Nyi−a∑i=1Nxi−∑i=1Nb=0 \sum_{i=1}^{N} y_{i}-a \sum_{i=1}^{N} x_{i}-\sum_{i=1}^{N} b=0 i=1Nyiai=1Nxii=1Nb=0由于bbb是常数,最后一项可以改写为∑i=1Nyi−a∑i=1Nxi−Nb=0 \sum_{i=1}^{N} y_{i}-a \sum_{i=1}^{N} x_{i}-Nb=0 i=1Nyiai=1NxiNb=0因此移项得到Nb=∑i=1Nyi−a∑i=1NxiNb= \sum_{i=1}^{N} y_{i}-a \sum_{i=1}^{N} x_{i} Nb=i=1Nyiai=1Nxi注意到左边有所有yyy值的和与所有xxx的值,因此如果左右两边都除以NNN值,将得到b=y‾−ax‾ b=\overline{y}-a \overline{x} b=yax其中y‾,x‾\overline{y}, \overline{x}y,x分别是所有y,xy,xy,x的均值。

2. 求解aaa

aaa求偏导并令其等于000
∂J(a,b)∂a=∑i=1N2(yi−axi−b)(−xi)=0 \frac{\partial J(a, b)}{\partial a}=\sum_{i=1}^{N} 2\left(y_{i}-a x_{i}-b\right)\left(-x_i\right)=0 aJ(a,b)=i=1N2(yiaxib)(xi)=0去除系数得到∑i=1N(yi−axi−b)xi=0\sum_{i=1}^{N} \left(y_{i}-a x_{i}-b\right)x_i=0i=1N(yiaxib)xi=0b=y‾−ax‾b=\overline{y}-a \overline{x}b=yax代入得到∑i=1N(yi−axi−y‾+ax‾)xi=0 \sum_{i=1}^{N}\left(y_{i}-a x_{i}-\overline{y}+a \overline{x}\right) x_i=0 i=1N(yiaxiy+ax)xi=0xix_ixi乘入得到∑i=1N[yixi−a(xi)2−y‾xi+ax‾xi]=0 \sum_{i=1}^{N}\left[y_{i}x_i-a(x_{i})^2-\overline{y}x_i+a \overline{x}x_i\right] =0 i=1N[yixia(xi)2yxi+axxi]=0可以看到系数aaa在第二项和第四项,拆开并提取aaa得到∑i=1N(yixi−y‾xi)−a∑i=1N[(xi)2−x‾xi]=0 \sum_{i=1}^{N}(y_ix_i-\overline{y}x_i)-a\sum_{i=1}^{N}[(x_i)^2-\overline{x}x_i]=0 i=1N(yixiyxi)ai=1N[(xi)2xxi]=0移项并作除法得到a=∑i=1N(xiyi−xiy‾)∑i=1N[(xi)2−xix‾] a=\frac{\sum_{i=1}^{N}\left(x_iy_i-x_i \overline{y}\right)}{\sum_{i=1}^{N}\left[(x_i)^2-x_i \overline{x}\right]} a=i=1N[(xi)2xix]i=1N(xiyixiy)计算结束。

3. 优化

考虑到y‾,x‾\overline{y}, \overline{x}y,x都是定值,有以下等式:
∑i=1Nxiy‾=y‾∑i=1Nxi=Ny‾x‾=x‾∑i=1Nyi=∑i=1Nx‾yi=∑i=1Nx‾∗y‾ \sum_{i=1}^{N} x_i \overline{y}=\overline{y} \sum_{i=1}^{N} x_i=N \overline{y} \overline{x}=\overline{x} \sum_{i=1}^{N} y_i=\sum_{i=1}^{N} \overline{x} y_i=\sum_{i=1}^{N} \overline{x} *\overline{y} i=1Nxiy=yi=1Nxi=Nyx=xi=1Nyi=i=1Nxyi=i=1Nxy
同理有∑i=1Nxix‾=x‾∑i=1Nxi=x‾Nx‾=N(x‾)2=∑i=1N(x‾)2\sum_{i=1}^{N}x_i\overline{x} =\overline{x} \sum_{i=1}^{N}x_i=\overline{x}N\overline{x}=N({\overline{x}})^2=\sum_{i=1}^{N}({\overline{x}})^2i=1Nxix=xi=1Nxi=xNx=N(x)2=i=1N(x)2因此对于aaaa=∑i=1N(xiyi−xiy‾)∑i=1N[(xi)2−xix‾]=∑i=1N(xiyi−xiy‾−x‾yi+x‾∗y‾)∑i=1N[(xi)2−x‾xi−x‾xi+(x‾)2]=∑i=1N(xi−x‾)(yi−y‾)∑i=1N(xi−x‾)2 a=\frac{\sum_{i=1}^{N}\left(x_iy_i-x_i \overline{y}\right)}{\sum_{i=1}^{N}\left[(x_i)^2-x_i \overline{x}\right]}=\frac{\sum_{i=1}^{N}\left(x_iy_i-x_i \overline{y}-\overline{x} y_i+\overline{x}* \overline{y}\right)}{\sum_{i=1}^{N}\left[\left(x_i\right)^{2}-\overline{x} x_i-\overline{x} x_i+(\overline{x})^{2}\right]}=\frac{\sum_{i=1}^{N}\left(x_i-\overline{x}\right)\left(y_i-\overline{y}\right)}{\sum_{i=1}^{N}\left(x_i-\overline{x}\right)^{2}} a=i=1N[(xi)2xix]i=1N(xiyixiy)=i=1N[(xi)2xxixxi+(x)2]i=1N(xiyixiyxyi+xy)=i=1N(xix)2i=1N(xix)(yiy)
可见这样可以极大地提升计算效率。

4. 答案

以下为答案:
{a=∑i=1N(xi−x‾)(yi−y‾)∑i=1N(xi−x‾)2b=y‾−ax‾ \left\{\begin{array}{l}{a=\frac{\sum_{i=1}^{N}\left(x_i-\overline{x}\right)\left(y_i-\overline{y}\right)}{\sum_{i=1}^{N}\left(x_i-\overline{x}\right)^{2}}}\\{b=\overline{y}-a \overline{x}}\end{array}\right. {a=i=1N(xix)2i=1N(xix)(yiy)b=yax

代码实现

数据介绍

使用seaborn自带的tips数据集

import pandas as pd
import seaborn as sns
tips=sns.load_dataset('tips')
tips.head()

在这里插入图片描述
我们选取前两列,total_bill总消费作为自变量x,tip小费作为因变量y,画出两者的关系图如下:

sns.jointplot(x='total_bill',y='tip',data=tips,kind='reg')

在这里插入图片描述
可见两者存在线性关系,且可以用一条直线大致拟合。

自制代码实现

def simpleRegression(x,y):
    xMean=x.mean()
    yMean=y.mean()
    a=((x-xMean)*(y-yMean)).sum()/(x-xMean).pow(2).sum()
    b=yMean-xMean*a
    return a,b
simpleRegression(tips['total_bill'],tips['tip'])

在这里插入图片描述
前者是aaa的值,后者是bbb的值。

sklearn代码实现

from sklearn import linear_model
lr=linear_model.LinearRegression()
x=tips[['total_bill']]#注意这里必须要加两个方括号,xy都是
y=tips[['tip']]
res=lr.fit(x,y)
res.coef_[0][0],res.intercept_[0]

在这里插入图片描述

可见两组答案数字在小数点后10位都是一样的,可以说是基本一致。

参考资料

  1. https://blog.csdn.net/thfyshz/article/details/83589836
  2. https://zhuanlan.zhihu.com/p/76580358
  3. 《从零开始学Python数据分析与挖掘》,第7章
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐