【机器学习笔记】:大话线性回归(一)

简介: 线性回归作为监督学习中经典的回归模型之一,是初学者入门非常好的开始。宏观上考虑理解性的概念,我想我们在初中可能就接触过,y=ax,x为自变量,y为因变量,a为系数也是斜率。如果我们知道了a系数,那么给我一个x,我就能得到一个y,由此可以很好地为未知的x值预测相应的y值。这很符合我们正常逻辑,不难理解。那统计学中的线性回归是如何解释的呢?

对于统计模型线性回归,我想从以下六个方面来展开,并分两篇文章进行详细解读:


  • 线性回归模型定义
  • 线性回归的损失函数
  • 线性回归参数估计
  • 线性回归预测
  • 线性回归拟合优度
  • 线性回归假设检验
  • 线性回归诊断


▌线性回归模型定义


线性回归按变量数量的多少可以分为:一元线性回归(简单线性回归)多元线性回归


一元线性回归,也就是有一个自变量,其模型可以表示如下:

微信图片_20220218135558.jpg

公式中参数解释如下:

x:自变量

y:因变量

β 0截距

β 1变量回归系数

ϵ:误差项的随机变量1


这些参数中,(β 0+β 1x)反映了由于x的变化而引起的y的线性变化;ϵ反映了除了x和y之间的线性关系之外的随机因素对y的影响,是不能由x和y之间的线性关系所解释的变异性。可以这么来理解ϵ:我们对y的预测是不可能达到与真实值完全一样的,这个真实值只有上帝知道,因此必然会产生误差,我们就用ϵ来表示这个无法预测的误差。


同样的,多元线性回归模型的表示如下:


微信图片_20220218135618.jpg

我们通过引入了ϵ可以让模型达到完美状态,也就是理论的回归模型。但是我们要如何定义这个无法预测的误差项呢?为此,伟人们提出了一些假设条件


在统计学中,高斯-马尔可夫定理陈述的是:在误差零均值,同方差,且互不相关的线性回归模型中,回归系数的最佳无偏线性估计(BLUE)就是最小方差估计。


总结一下,有如下几个主要的假设条件:

(1)误差项ϵ是一个期望为0的随机变量,即E(ϵ)=0

(2)对于自变量的所有值,ϵ的方差σ^2都相同

(3)误差项ϵ是一个服从正态分布的随机变量,且相互独立,即ϵ~N(0,σ^2)


ϵ正态性意味着对于给定的自变量,因变量y也是一个服从正态分布的随机变量。根据回归模型的假设,有如下多元回归方程


微信图片_20220218135651.jpg


▌线性回归的损失函数


从样本数据考虑,如果想让我们预测值尽量准确,那么我们就必须让真实值与预测值的差值最小,即让误差平方和ϵ最小,用公式来表达即:


微信图片_20220218135721.jpg

用平方而没用误差绝对值是因为:平方对于后续求导比较方便。


虽然我们得到了损失函数,但是如果从统计理论的角度出发来推导损失函数,我认为更有说服力,也能更好地理解线性回归模型,以及为什么开始要提出那些假设条件。


根据上面假设条件:ϵ 服从均值为0,方差为σ的正态分布,且独立,因此随机变量ϵ 的概率密度函数(正态分布的概率密度函数)为:

微信图片_20220218135749.jpg

image.gif

我们把前面的多元线性回归模型简单地变换一下,如下:


微信图片_20220218135752.jpgimage.gif

然后将得到的ϵ公式带入上面概率密度函数:


微信图片_20220218135755.jpgimage.gif

有了概率密度函数,我们自然会想到用最大似然估计推导损失函数:


微信图片_20220218135816.jpg

然后我们将似然函数取对数,这样可以将概率密度的乘法转换为加法:


微信图片_20220218135818.jpg

再然后我们对似然函数取最大值,即最大化似然函数:


微信图片_20220218135821.jpg

这样我们就从统计理论的角度得到了我们要找的损失函数,与我们最小化误差平方和得到的结果是一样的,也从侧面证实了前面提出假设的正确性。因此,多元线性回归模型的损失函数为:


微信图片_20220218135853.jpg

公式里的1/2对损失函数没有影响,只是为了能抵消求导后的乘数2。


▌线性回归参数估计


损失函数只是一种策略,有了策略我们还要用适合的算法进行求解。在线性回归模型中,求解损失函数就是求与自变量相对应的各个回归系数和截距。有了这些参数,我们才能实现模型的预测(输入x,给出y)。


对于误差平方和损失函数的求解方法有很多,典型的如最小二乘法,梯度下降等。下面我们分别用这两种方法来进行求解。


最小二乘法


最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程


我们将代数方程组用矩阵来代替可以简化推导过程,以及代码实现。

微信图片_20220218135917.jpg

image.gif

这里会涉及到矩阵求导的用法,详细介绍请看下面wiki的参考链接:

https://en.wikipedia.org/wiki/Matrix_calculus#Scalar-by-vector_identities


微信图片_20220218135920.jpg

我们令上面得到的公式等于0,即可得到最终的求解:

微信图片_20220218135946.jpg

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

梯度下降法


梯度下降是另一种常用的方法,可以用来求解凸优化问题。它的原理有别于最小二乘法,它是通过一步步迭代(与最小二乘法的区别在后面介绍)求解,不断逼近正确结果,直到与真实值之差小于一个阈值,从而得到最小化损失函数的模型参数值的。它的公式如下:

微信图片_20220218140017.jpg


对于损失函数的梯度(即求偏导的过程),上面在最小二乘法部分已经给出推导过程和结果。不同的是,我们不会将公式等于0来求极值,而是带入上面梯度下面公式来迭代完成求解,以下是梯度下降矩阵形式的最终求解结果。


微信图片_20220218140019.jpg


最小二乘法 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值进行预测。

微信图片_20220218140100.jpg

image.gif

然后,我们在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()
微信图片_20220218140105.jpg


这时我们看到,生成的10个随机数都在我们的拟合直线上,对应的y值就是我们的预测值。同样的,我们也手撸了梯度下降算法进行的求解过程,二者得到的结果参数几乎相等。二者可视化效果如下所示(可以看到两个拟合直线是重合的,红色和绿色):


微信图片_20220218140153.jpg

二者所得参数对比如下,其中梯度下降迭代了500次,可以看到参数结果是几乎一样的。


#最小二乘法
ls.params
>>matrix([[3.00774324],
         [1.69532264]])
#梯度下降法,迭代500次
gd.params
>>matrix([[3.00758726],
         [1.69562035]])


▌总结


本篇主要介绍了线性回归的前几个部分:模型定义假设,模型参数估计,模型预测。但是预测完模型之后,我们并不知道结果时好时坏,并且我们也不知道开始的假设是否成立,这些内容涉及模型拟合优度,模型假设检验,和模型诊断,将在下一篇进行介绍。


相关文章
|
7月前
|
机器学习/深度学习 算法 TensorFlow
机器学习算法简介:从线性回归到深度学习
【5月更文挑战第30天】本文概述了6种基本机器学习算法:线性回归、逻辑回归、决策树、支持向量机、随机森林和深度学习。通过Python示例代码展示了如何使用Scikit-learn、statsmodels、TensorFlow库进行实现。这些算法在不同场景下各有优势,如线性回归处理连续值,逻辑回归用于二分类,决策树适用于规则提取,支持向量机最大化类别间隔,随机森林集成多个决策树提升性能,而深度学习利用神经网络解决复杂模式识别问题。理解并选择合适算法对提升模型效果至关重要。
249 4
|
2月前
|
机器学习/深度学习 计算机视觉 Python
模型预测笔记(三):通过交叉验证网格搜索机器学习的最优参数
本文介绍了网格搜索(Grid Search)在机器学习中用于优化模型超参数的方法,包括定义超参数范围、创建参数网格、选择评估指标、构建模型和交叉验证策略、执行网格搜索、选择最佳超参数组合,并使用这些参数重新训练模型。文中还讨论了GridSearchCV的参数和不同机器学习问题适用的评分指标。最后提供了使用决策树分类器进行网格搜索的Python代码示例。
72 1
|
28天前
|
机器学习/深度学习 数据采集 算法
探索机器学习中的线性回归
【10月更文挑战第25天】本文将深入浅出地介绍线性回归模型,一个在机器学习领域中广泛使用的预测工具。我们将从理论出发,逐步引入代码示例,展示如何利用Python和scikit-learn库实现一个简单的线性回归模型。文章不仅适合初学者理解线性回归的基础概念,同时也为有一定基础的读者提供实践指导。
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
探索机器学习:从线性回归到深度学习
在这篇文章中,我们将一起踏上一场激动人心的旅程,穿越机器学习的广阔天地。我们将从最基本的线性回归开始,逐步深入到复杂的深度学习模型。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。让我们一起探索这个充满无限可能的世界吧!
|
2月前
|
机器学习/深度学习 API
机器学习入门(七):线性回归原理,损失函数和正规方程
机器学习入门(七):线性回归原理,损失函数和正规方程
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习:从线性回归到深度学习
【9月更文挑战第4天】在这篇文章中,我们将深入探讨机器学习的世界,从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将通过实际的代码示例,揭示这些模型背后的数学原理,以及如何在现实世界的问题中应用它们。无论你是初学者还是有经验的数据科学家,这篇文章都将为你提供新的视角和深入的理解。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
探索机器学习的奥秘:从线性回归到深度学习
【8月更文挑战第26天】本文将带领读者走进机器学习的世界,从基础的线性回归模型开始,逐步深入到复杂的深度学习网络。我们将探讨各种算法的原理、应用场景以及实现方法,并通过代码示例加深理解。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的知识和技能。让我们一起揭开机器学习的神秘面纱,探索这个充满无限可能的领域吧!
|
4月前
|
机器学习/深度学习 人工智能 算法
探索机器学习:Python中的线性回归模型实现
【8月更文挑战第24天】在机器学习的世界中,线性回归是最基础也是应用最广泛的算法之一。本文将通过Python编程语言,使用scikit-learn库来实现一个简单的线性回归模型。我们将从理论出发,逐步深入到代码实现,最后通过一个实际数据集来验证模型的效果。无论你是机器学习的初学者,还是想要复习线性回归的基础知识,这篇文章都将为你提供有价值的信息。让我们一起踏上这段探索之旅吧!
|
6月前
|
机器学习/深度学习 算法 BI
机器学习笔记(一) 感知机算法 之 原理篇
机器学习笔记(一) 感知机算法 之 原理篇
|
6月前
|
机器学习/深度学习 数据采集 算法
【机器学习】线性回归:以房价预测为例
【机器学习】线性回归:以房价预测为例
392 1