Python机器学习之线性回归

1 引言

回归分析技术旨在推断因变量和一个或多个自变量之间的关系,通常应用于监督学习领域。回归分析的方法有很多,可以应用在不同的情景之中,本文主要就其中的线性回归方法展开介绍.
本文的主要目的是尽可能清晰直观的介绍线性回归三种实现方式的原理和快速实现,所有模型的开发实现仅涉及Python和Numpy,这里采用生成的数据方便大家更好的理解和可视化。

2 线性相关

线性回归可以理解为一种统计分析过程,它推断因变量和一个或多个自变量之间为线性关系。通常来说,我们采用线性相关系数来描述X和Y的线性关系,公式如下:
请添加图片描述
上述公式中:

  • μ表示随机变量的期望
  • σ表示随机变量的标准差
  • E表示期望操作

代码实现:

def correlation(X, Y):
  mu_X, mu_Y = X.mean(), Y.mean()
  cov = ((X - mu_X)*(Y - mu_Y)).mean()
  sigma_X, sigma_Y = X.std(), Y.std()
  return cov/(sigma_X*sigma_Y)

生成几张测试图,方便我们直观理解线性相关系数,图像如下:
请添加图片描述

3 简单线性回归

3.1 定义

简单线性回归对二维空间样本点进行处理,其中一个代表因变量Y,另一个表示自变量X,公式如下:
请添加图片描述
上式中,m表示斜率,b表示截距。可以用以下公式计算:
请添加图片描述
请添加图片描述
这里 x ˉ \bar x xˉ y ˉ \bar y yˉ 表示x和y各自的均值。

3.2 实现

代码实现如下:

class linearRegression_simple(object):
  def __init__(self):
    # Init clas
    self._m = 0
    self._b = 0
  
  def fit(self, X, y):
    # Train model
    X_, y_ = X.mean(), y.mean()
    num = ((X - X_)*(y - y_)).sum()
    den = ((X - X_)**2).sum()
    self._m = num/den
    self._b = y_ - self._m*X_
  
  def pred(self, x):
    # Predict
    x = np.array(x)
    return self._m*x + self._b

结果如下:
在这里插入图片描述

3.3 误差评估

这里一般采用均方差(MSE)作为我们的评价标准,其计算公式如下:
请添加图片描述
进而我们可以得到上述例子的回归误差如下:
请添加图片描述

4 多元线性回归

4.1 定义

多元线性回归对n维样本点进行处理,其中y代表因变量,另一个或多个代表自变量 x n x_n xn , 公式如下:
请添加图片描述

4.2 实现

代码实现如下:

class linearRegression_multiple(object):
  def __init__(self):
    self._m = 0
    self._b = 0
  
  def fit(self, X, y):
    X_, y_ = X.mean(axis=0), y.mean(axis=0)
    num = ((X - X_)*(y - y_)).sum(axis=0)
    den = ((X - X_)**2).sum(axis = 0)
    self._m = num/den
    self._b = y_ - (self._m*X_).sum()
  
  def pred(self, x):
    return (self._m*x).sum(axis=1) + self._b

假设我们数据为3维空间的超平面数据,包含一个因变量和两个自变量,采用上述算法,结果如下:
请添加图片描述

4.3 误差评估

这里依旧采用MSE作为评价标准,可视化后的误差结果如下:
请添加图片描述

5 梯度下降法

5.1 定义

在线性回归领域采用梯度下降法的目的在于最小化斜率m和截距b的误差,公式如下:
请添加图片描述
通常我们通过计算上述函数的梯度,如下:

请添加图片描述
上述公式中,相关梯度的详细计算如下:

请添加图片描述

5.2 实现

我们用python实现上述过程,代码如下:

class linearRegression_GD(object):
  def __init__(self, mo=0, bo=0, rate=0.001):
    self._m = mo     # initial value for m
    self._b = bo     # initial value for b
    self.rate = rate  # iteration's rate
    
  def fit_step(self, X, y):
    n = X.size
    dm = (2/n)*np.sum(-x*(y - (self._m*x + self._b)))
    db = (2/n)*np.sum(-(y - (self._m*x + self._b)))
    self._m -= dm*self.rate
    self._b -= db*self.rate
    
  def pred(self, x):
    x = np.array(x)
    return self._m*x + self._b

5.3 实现结果

这里我们采用学习率lr=0.01,共计迭代3072次,实现结果如下:

lrgd = linearRegression_GD(rate=0.01)

# Synthetic data 3
x, x_, y = synthData3()

iterations = 3072
for i in range(iterations):
    lrgd.fit_step(x, y)
y_ = lrgd.pred(x)

请添加图片描述可以看到,随着迭代次数的增加,误差逐渐减小,最后趋于稳定.

6 画图的重要性

1973年,统计学家F.J. Anscombe构造出了四组奇特的数据。它告诉人们,在分析数据之前,描绘数据所对应的图像有多么的重要。
请添加图片描述
我们使用简单线性回归,对上述四组数据进行处理,结果如下:
请添加图片描述对应的误差分析如下:
请添加图片描述
[分析]
1)通过上图我们可以得到以下结论:

  • 这四组数据中,x值的平均数都是9.0,y值的平均数都是7.5;
  • x值的方差都是10.0,y值的方差都是3.75;
  • 它们的相关系数都是0.82,线性回归方程都是y=3+0.5x。

单从上述这些统计数字上看来,四组数据所反映出的实际情况非常相近,而事实上,这四组数据有着天壤之别。

2)我们画出四组数据的图像,仔细观察后,可以得到

  • 第一组数据的图像是大多人看到上述统计数字的第一反应,是最“正常”的一组数据;
  • 第二组数据所反映的事实上是一个精确的二次函数关系,只是在错误地应用了线性模型后,各项统计数字与第一组数据恰好都相同;
  • 第三组数据描述的是一个精确的线性关系,只是这里面有一个异常值,它导致了上述各个统计数字,尤其是相关系数的偏差;
  • 第四组数据则是一个更极端的例子,其异常值导致了平均数、方差、相关系数、线性回归线等所有统计数字全部发生偏差。

7 总结

本文重点介绍了线性回归的三种实现方式,给出了具体示例和相应的处理代码,同时给出了一组数据用来说明画图对数据分析的重要性。


您学废了吗?

8 附录

本文参考链接如下:

链接

关注公众号《AI算法之道》,获取更多AI算法资讯。

在这里插入图片描述



注: 完整代码,关注公众号,后台回复 线性回归 , 即可获取。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值