共计 4629 个字符,预计需要花费 12 分钟才能阅读完成。
大家好,我是东哥。
线性回归作为监督学习中经典的回归模型之一,是初学者入门十分好的开始。宏观上思考了解性的概念,我想咱们在初中可能就接触过,y=ax,x 为自变量,y 为因变量,a 为系数也是斜率。如果咱们晓得了 a 系数,那么给我一个 x,我就能失去一个 y,由此能够很好地为未知的 x 值预测相应的 y 值。这很合乎咱们失常逻辑,不难理解。
那统计学中的线性回归是如何解释的呢?
对于统计模型线性回归,我想从以下六个方面来开展,并分两篇文章进行具体解读:
- 线性回归模型定义
- 线性回归的损失函数
- 线性回归参数估计
- 线性回归预测
- 线性回归拟合优度
- 线性回归假设检验
- 线性回归诊断
线性回归模型定义
线性回归按变量数量的多少能够分为:一元线性回归(简略线性回归)和 多元线性回归。
一元线性回归,也就是有一个自变量,其模型能够示意如下:
公式中参数解释如下:
x:自变量
y:因变量
β 0:截距
β 1:变量回归系数
ϵ:误差项的随机变量 1
这些参数中,(β 0+β 1x*)反映了因为 x 的变动而引起的 y 的线性变动;ϵ反映了除了 x 和 y 之间的线性关系之外的随机因素对 y 的影响,是不能由 x 和 y 之间的线性关系所解释的变异性。能够这么来了解 ϵ:咱们对 y 的预测是不可能达到与实在值齐全一样的,这个实在值只有上帝晓得,因而必然会产生误差,咱们就用 ϵ 来示意这个无奈预测的误差。*
同样的,多元线性回归模型的示意如下:
咱们通过引入了 ϵ 能够让模型达到完满状态,也就是实践的回归模型。然而咱们要如何定义这个无奈预测的误差项呢?为此,伟人们提出了一些 假如条件:
在统计学中,高斯-马尔可夫定理陈说的是:在误差零均值,同方差,且互不相干的线性回归模型中,回归系数的最佳无偏线性预计(BLUE)就是最小方差预计。
总结一下,有如下几个次要的假如条件:
(1)误差项 ϵ 是一个冀望为 0 的随机变量,即E(ϵ)=0
(2)对于自变量的所有值,ϵ的方差σ^2 都雷同
(3)误差项 ϵ 是一个遵从正态分布的随机变量,且互相独立,即ϵ~N(0,σ^2)
ϵ正态性意味着对于给定的自变量,因变量 y 也是一个遵从正态分布的随机变量。依据回归模型的假如,有如下 多元回归方程:
线性回归的损失函数
从样本数据思考,如果想让咱们预测值尽量精确,那么咱们就必须让实在值与预测值的差值最小,即让 误差平方和 ϵ 最小,用公式来表白即:
用平方而没用误差绝对值是因为:平方对于后续求导比拟不便。
尽管咱们失去了损失函数,然而如果从统计实践的角度登程来推导损失函数,我认为更有说服力,也能更好地了解线性回归模型,以及为什么开始要提出那些假如条件。
依据下面假如条件:ϵ 遵从均值为 0,方差为 σ 的正态分布,且独立,因而随机变量ϵ 的概率密度函数(正态分布的概率密度函数)为:
咱们把后面的多元线性回归模型简略地变换一下,如下:
而后将失去的 ϵ 公式带入下面概率密度函数:
有了概率密度函数,咱们天然会想到用最大似然预计推导损失函数:
而后咱们将似然函数 取对数,这样能够将概率密度的乘法转换为加法:
再而后咱们对似然函数 取最大值,即最大化似然函数:
这样咱们就从统计实践的角度失去了咱们要找的损失函数,与咱们最小化误差平方和失去的后果是一样的,也从侧面证实了后面提出假如的正确性。因而,多元线性回归模型的损失函数为:
公式里的 1 / 2 对损失函数没有影响,只是为了能对消求导后的乘数 2。
线性回归参数估计
损失函数只是一种策略,有了策略咱们还要用适宜的算法进行求解。在线性回归模型中,求解损失函数就是求与自变量绝对应的各个回归系数和截距。有了这些参数,咱们能力实现模型的预测(输出 x,给出 y)。
对于误差平方和损失函数的求解办法有很多,典型的如最小二乘法,梯度降落等。上面咱们别离用这两种办法来进行求解。
最小二乘法
最小二乘法能够将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法预计的 正规方程。
咱们将代数方程组用矩阵来代替能够简化推导过程,以及代码实现。
这里会波及到矩阵求导的用法,具体介绍请看上面 wiki 的参考链接:
https://en.wikipedia.org/wiki…
咱们令下面失去的公式等于 0,即可失去最终的求解:
Python 中对于矩阵的各种操作能够通过 Numpy 库的一些办法来实现,十分不便。但在这个代码实现中须要留神: X 矩阵不能为奇怪矩阵,否则是无奈求解矩阵的逆的。上面是手撸最小二乘法的代码实现局部。
def standRegres(xArr,yArr):
"""函数阐明: 计算回归系数 w Parameters: xArr - x 数据集 yArr - y 数据集 Returns: ws - 回归系数"""
xMat = np.mat(xArr); yMat = np.mat(yArr).T
#依据文中推导的公示计算回归系数
xTx = xMat.T * xMat
if np.linalg.det(xTx) == 0.0:
print("矩阵为奇怪矩阵, 不能求逆")
return
ws = xTx.I * (xMat.T*yMat)
return ws
梯度降落法
梯度降落是另一种罕用的办法,能够用来求解凸优化问题。它的原理有别于最小二乘法,它是通过一步步迭代(与最小二乘法的区别在前面介绍)求解,一直迫近正确后果,直到与实在值之差小于一个阈值,从而失去最小化损失函数的模型参数值的。它的公式如下:
对于损失函数的梯度(即求偏导的过程),下面在最小二乘法局部曾经给出推导过程和后果。不同的是,咱们不会将公式等于 0 来求极值,而是带入下面梯度上面公式来迭代实现求解,以下是梯度降落矩阵模式的最终求解后果。
最小二乘法 vs 梯度降落法
通过下面推导,咱们不难看出,二者都对损失函数的回归系数进行了求偏导,并且所失去的推导后果是雷同的,那么到底哪里不同呢?
如果仔细观察,能够察看到:最小二乘法通过使推导后果等于 0,从而间接求得极值,而梯度降落则是将推导后果带入迭代公式中,一步一步地失去最终后果。简略地说,最小二乘法是一步到位的,而梯度降落是一步步进行的。
因此通过以上的异同点,总结如下
最小二乘法:
- 失去的是全局最优解,因为一步到位,间接求极值,因此步骤简略
- 线性回归的模型假如,这是最小二乘办法的优越性前提,否则不能推出最小二乘是最佳(即方差最小)的无偏预计
梯度降落法:
- 失去的是部分最优解,因为是一步步迭代的,而非间接求得极值
- 既能够用于线性模型,也能够用于非线性模型,没有非凡的限度和假如条件
线性回归预测
下面咱们曾经手撸了最小二乘法和梯度降落法求解误差平方和损失函数的过程,即咱们通过以上算法曾经失去了咱们想要的参数值。当然,咱们也能够应用 statsmodels 或者 sklearn 库中曾经被封装好了的模型来进行预测。不过,为了更好的理解模型,优化算法,而不仅仅是做一个调包侠,咱们最好对每种算法都本人实现一遍。
为了更好的阐明整个建模到预测的过程,咱们通过一个例子来具体阐明。对于一个数据集,咱们通过本人手撸的最小二乘法来建模,求解参数而后进行预测。
class LeastSquared(object):
def __init__(self):
self.xArr = []
self.yArr = []
self.params = []
self.y_predict = []
def fit(self,xArr,yArr):
self.xArr = xArr
self.yArr = yArr
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
xTx = xMat.T*xMat
if np.linalg.det(xTx) == 0.0:
print('矩阵为奇怪矩阵')
params = xTx.I*(xMat.T*yMat)
self.params = params
def predict(self,x_new):
y_predict = x_new*self.params
self.y_predict = y_predict
return y_predict
能够看到这是一个简略的二维立体,蓝色代表一个变量 X 和因变量 Y 的散点图,红色是咱们通过最小二乘法拟合进去的直线。如果是多自变量,那么拟合后果将是一个立体,或者超平面。应用这个模型,咱们就能对未知的 X 值进行预测。
而后,咱们在 x 的范畴内再取 10 个随机数,并进行预测感受一下。
# 生成最小二乘法类
xArr, yArr = loadDataSet('ex0.txt')
ls = LeastSquared()
ls.fit(xArr,yArr) #训练模型
y_predict = ls.predict(xArr) #预测模型
# 在 x 范畴内,随机生成 10 个新的 x 值
x_min = np.min(np.array(xArr)[:,1])
x_max = np.max(np.array(xArr)[:,1])
x_random = np.random.uniform(x_min,x_max,[10,1])
x_new = np.c_[np.ones(10),x_random.flatten()]
y_new = ls.predict(x_new)
y_new = y_new.flatten().tolist()[0]
x_new = x_random.flatten().tolist()
# 可视化
n = len(xArr)
xcord = [];ycord = [];y_hat = []
for i in range(n):
xcord.append(xArr[i][1])
ycord.append(yArr[i])
y_hat.append(y_predict.tolist()[i][0])
fig = plt.figure()
#增加 subplot
ax = fig.add_subplot(111)
#绘制样本点
ax.plot(xcord, y_hat, c = 'red')
ax.scatter(xcord, ycord, s = 20, c = 'blue',alpha = .5)
ax.scatter(x_new,y_new, s=150, c='r', alpha = 0.8)
#绘制 title
plt.title('LeastSquareMethod')
plt.xlabel('X')
plt.show()
这时咱们看到,生成的 10 个随机数都在咱们的拟合直线上,对应的 y 值就是咱们的预测值。同样的,咱们也手撸了梯度降落算法进行的求解过程,二者失去的后果参数简直相等。二者可视化成果如下所示(能够看到两个拟合直线是重合的,红色和绿色):
二者所得参数比照如下,其中梯度降落迭代了 500 次,能够看到参数后果是简直一样的。
# 最小二乘法
ls.params
>>matrix([[3.00774324],
[1.69532264]])
#梯度降落法,迭代 500 次
gd.params
>>matrix([[3.00758726],
[1.69562035]])
总结
本篇次要介绍了线性回归的前几个局部:模型定义假如,模型参数估计,模型预测 。然而预测完模型之后,咱们并不知道后果时好时坏,并且咱们也不晓得开始的假如是否成立,这些内容波及 模型拟合优度,模型假设检验,和模型诊断,将在下一篇进行介绍。
参考:
《机器学习实战》Peter Harrington
《统计学》贾俊平
https://zhuanlan.zhihu.com/p/…
https://zhuanlan.zhihu.com/p/…
原创不易,感觉不错点个赞。
另外,欢送关注我的原创公众号:Python 数据迷信
数据迷信学习网站:datadeepin