大家好,我是东哥。作为监督学习中经典的回归模型之一,线性回归对于初学者来说是一个非常好的开始。从宏观的角度来考虑理解力的概念,我想我们初中的时候可能已经接触过,y=ax,x是自变量,y是因变量,a是系数和斜率。如果我们知道a系数,那么给我一个x,我可以得到一个y,从中我可以很好的预测未知x值对应的y值。这符合我们的正常逻辑,也不难理解。统计学中的线性回归是如何解释的?对于线性回归的统计模型,我想从以下六个方面展开,分两篇文章来解释:线性回归模型定义线性回归损失函数线性回归参数估计线性回归预测线性回归拟合优度线性回归假设测试线性回归诊断线性回归模型定义线性回归根据变量的多少可以分为:一元线性回归(simplelinearregression)和多元线性回归。单变量线性回归,即有一个自变量,其模型可以表示如下:公式中的参数解释如下: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矩阵不能是奇异矩阵,否则无法求解矩阵的逆。以下是手动最小二乘法的代码实现部分。defstandRegres(xArr,yArr):"""函数说明:计算回归系数w参数:xArr-x数据集yArr-y数据集返回:ws-回归系数"""xMat=np.mat(xArr);yMat=np.mat(yArr).T#根据文中推导计算回归系数xTx=xMat.T*xMatifnp.linalg.det(xTx)==0.0:print("矩阵为奇异矩阵且不可逆")returnws=xTx.I*(xMat.T*yMat)returnws梯度下降法梯度下降是另一种常用的方法,可用于解决凸优化问题。它的原理不同于最小二乘法。它一步步求解(后面会介绍与最小二乘法的差异),不断逼近正确结果,直到与真实值的差异小于一个阈值,从而得到最小化的损失函数。模型参数值。其公式如下:对于损失函数的梯度(即求偏导数的过程),上面已经在最小二乘法中给出了推导过程和结果。不同的是,我们不会将公式设置为0来求极值,而是将公式带入上述梯度下方,迭代完成求解。以下是梯度下降矩阵形式的最终求解结果。最小二乘法vs梯度下降法通过上面的推导,不难看出两者都对损失函数的回归系数进行了偏导,得到的推导结果是一样的,那么有什么区别呢?仔细观察可以发现,最小二乘法是通过让推导结果为0来直接获取极值,而梯度下降是将推导结果带入迭代公式,一步步得到最终结果。简单来说,最小二乘法是一步完成的,而梯度下降是一步一步完成的。因此,通过以上异同,最小二乘法总结如下:得到全局最优解,因为一步到位,直接计算极值,所以简单线性回归的模型假设在一个步长是最小二乘法的优越前提。否则不能推导出最小二乘是最好的(即方差最小)无偏估计梯度下降法:得到的是局部最优解,因为是一步步迭代的,而不是直接得到极值即可用于线性模型,也可以用于非线性模型,没有特殊的限制和假设。线性回归预测上面我们手摇了最小二乘法和梯度下降法求解误差平方和损失函数的过程,也就是得到了我们想要的参数值。当然,我们也可以使用statsmodels或者sklearn库中已经封装好的模型来进行预测。但是,为了更好地理解模型和优化算法,我们最好自己实现每个算法,而不是仅仅做一个切换器。为了更好地说明从建模到预测的整个过程,我们用一个例子来详细说明。对于一个数据集,我们用我们自己的最小二乘法对其建模,求解参数并进行预测。LeastSquared类(对象):def__init__(self):self.xArr=[]self.yArr=[]self.params=[]self.y_predict=[]deffit(self,xArr,yArr):self.xArr=xArrself.yArr=yArrxMat=np.mat(xArr)yMat=np.mat(yArr).TxTx=xMat.T*xMatifnp.linalg.det(xTx)==0.0:print('矩阵是奇异矩阵')params=xTx.I*(xMat.T*yMat)self.params=paramsdefpredict(self,x_new):y_predict=x_new*self.paramsself.y_predict=y_predictreturny_predict可以看到这是一个简单的二维平面,蓝色代表变量X和因变量Y的散点图,红色是我们通过最小二乘法拟合的直线。如果是多个自变量,那么拟合的结果就是一个平面,或者超平面。利用这个模型,我们可以对X的未知值进行预测。然后,我们再取10个x范围内的随机数,进行预测,感受一下。#生成最小二乘法类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=[]foriinrange(n):xcord.append(xArr[i][1])ycord.append(yArr[i])y_hat.append(y_predict.tolist()[i][0])fig=plt.figure()#addsubplotax=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)#Drawtitleplt.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]])总结主要内容本文的前几部分介绍了线性回归:模型定义假设、模型参数估计、模型预测。但是预测模型之后,我们不知道结果是好是坏,也不知道最初的假设是否成立。这些涉及模型拟合、模型假设检验和模型诊断,将在下一篇文章中介绍。参考:《机器学习实战》PeterHarrington《统计学》贾君平https://zhuanlan.zhihu.com/p/...https://zhuanlan.zhihu.com/p/...原创不易,我认为它很好,我喜欢它。另外,欢迎关注我的原创:Pythondatascience数据科学学习网站:datadeepin
