Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【机器学习笔记】:大话线性回归(一)

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

作者头像
Python数据科学
发布于 2018-12-05 10:27:55
发布于 2018-12-05 10:27:55
1.4K00
代码可运行
举报
文章被收录于专栏:Python数据科学Python数据科学
运行总次数:0
代码可运行

作者 | xiaoyu

知乎 | https://zhuanlan.zhihu.com/pypcfx

介绍 | 一个半路转行的数据挖掘工程师

线性回归作为监督学习中经典的回归模型之一,是初学者入门非常好的开始。宏观上考虑理解性的概念,我想我们在初中可能就接触过,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/Matrix_calculus#Scalar-by-vector_identities

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

Python中对于矩阵的各种操作可以通过Numpy库的一些方法来实现,非常方便。但在这个代码实现中需要注意:X矩阵不能为奇异矩阵,否则是无法求解矩阵的逆的。下面是手撸最小二乘法的代码实现部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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库中已经被封装好了的模型来进行预测。不过,为了更好的了解模型,优化算法,而不仅仅是做一个调包侠,我们最好对每种算法都自己实现一遍。

为了更好的说明整个建模到预测的过程,我们通过一个例子来详细说明。对于一个数据集,我们通过自己手撸的最小二乘法来建模,求解参数然后进行预测。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个随机数,并进行预测感受一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 生成最小二乘法类
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值就是我们的预测值。同样的,我们也手撸了梯度下降算法进行的求解过程,二者得到的结果参数几乎相等。二者可视化效果如下所示(可以看到两个拟合直线是重合的,红色和绿色):

代码语言:javascript
代码运行次数:0
运行
复制

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#最小二乘法
ls.params
>>matrix([[3.00774324],
         [1.69532264]])

#梯度下降法,迭代500次
gd.params
>>matrix([[3.00758726],
         [1.69562035]])

▌总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
机器学习 | 线性回归
计划好久,还欠下的债。 问题一: 最小二乘法和梯度下降法的区别 在回答这个问题前,有必要来推导下线性回归的公式,方能说到实处。 开始公式 如一元线性回归,即只有一个自变量,那也只有两个参数w1w_{1}和w0w_{0},表达式如下: f(x)=w0+w1∗x1 f(x) = w_{0} + w_{1}*x_{1} 其损失函数为: J(w)=∑i=1N(yi−w0−w1∗xi)2 J(w) = \sum_{i=1}^{N} (y_{i} - w_{0} - w_{1}*x_{i})^{2} 改为矩阵
努力在北京混出人样
2018/05/14
6660
【机器学习笔记】:大话线性回归(二)
前一篇文章给大家介绍了线性回归的模型假设,损失函数,参数估计,和简单的预测。具体内容请看下面链接:【机器学习笔记】:大话线性回归(一)
Python数据科学
2018/12/10
2K0
【机器学习笔记】:大话线性回归(二)
利用回归模型预测数值型数据(代码)
机器学习算法按照目标变量的类型,分为标称型数据和连续型数据。标称型数据类似于标签型的数据,而对于它的预测方法称为分类,连续型数据类似于预测的结果为一定范围内的连续值,对于它的预测方法称为回归。 “回归”一词比较晦涩,下面说一下这个词的来源: “回归”一词是由达尔文的表兄弟Francis Galton发明的。Galton于1877年完成了第一次回归预测,目的是根据上一代豌豆种子(双亲)的尺寸来预测下一代豌豆种子(孩子)的尺寸。 Galton在大量对象上应用了回归分析,甚至包括人的身高预测。他注意到,如果双亲
机器学习AI算法工程
2018/03/14
1.9K0
利用回归模型预测数值型数据(代码)
Python3《机器学习实战》学习笔记(十一):线性回归基础篇之预测鲍鱼年龄
版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 https://blog.csdn.net/c406495762/article/details/78760239
Jack_Cui
2019/05/25
7930
机器学习实战之线性回归
之前我们学习的机器学习算法都是属于分类算法,也就是预测值是离散值。当预测值为连续值时,就需要使用回归算法。本文将介绍线性回归的原理和代码实现。 线性回归原理与推导 如图所示,这时一组二维的数据,我们先想想如何通过一条直线较好的拟合这些散点了?直白的说:尽量让拟合的直线穿过这些散点(这些点离拟合直线很近)。 目标函数 要使这些点离拟合直线很近,我们需要用数学公式来表示。首先,我们要求的直线公式为:Y = XTw。我们这里要求的就是这个w向量(类似于logistic回归)。误差最小,也就是预测值y和真实值的y的
罗罗攀
2018/07/03
4900
局部加权线性回归 | 冰水数据智能专题 | 3rd
局部加权线性回归(Locally Weighted Linear Regression,LWLR),针对于线性回归存在的欠 拟合现象,可以引入一些偏差得到局部加权线性回归对算法进行优化。
用户7623498
2020/08/04
5350
局部加权线性回归  | 冰水数据智能专题 | 3rd
回归-线性回归算法(房价预测项目)
线性回归(Linear Regression)是回归任务中最常见的算法,利用回归方程对自变量和因变量进行建模,且因变量和自变量之间是线性关系而得名,从而可以根据已知数据预测未来数据,如房价预测、PM2.5预测等。
唔仄lo咚锵
2022/10/04
1.8K0
回归-线性回归算法(房价预测项目)
最小二乘法,残差,线性模型-线性回归
最小二乘法公式是一个数学的公式,在数学上称为曲线拟合,此处所讲最小二乘法,专指线性回归方程。
zhangjiqun
2024/12/14
3400
最小二乘法,残差,线性模型-线性回归
机器学习从0入门-线性回归
机器学习有许多不同的算法,每个算法都有其特定的应用场景和优缺点。然而,最简单的机器学习算法可能是线性回归。
皮大大
2023/08/25
5410
机器学习从0入门-线性回归
【机器学习与实现】线性回归分析
如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
Francek Chen
2025/01/22
960
【机器学习与实现】线性回归分析
机器学习 学习笔记(5) 线性回归
给定数据集D={(x1,y1),(x2,y2),...,(xm,ym)},其中xi=(xi1;xi2;xi3;...;xid),yi是实数。线性回归试图学得一个线性模型以尽可能准确地预测实值输出标记。
2018/09/03
8830
机器学习 学习笔记(5) 线性回归
机器学习实战---线性回归提高篇之乐高玩具套件二手价预测
作者:崔家华 编辑:王抒伟 PS(欢迎访问作者个人网站:www.cuijiahua.com) 线性回归 零 前言: 本篇文章讲解线性回归的缩减方法,岭回归以及逐步线性回归,同时熟悉sklearn的岭回归使用方法,对乐高玩具套件的二手价格做出预测。 一 岭回归: 如果数据的特征比样本点还多应该怎么办?很显然,此时我们不能再使用上文的方法进行计算了,因为矩阵X不是满秩矩阵,非满秩矩阵在求逆时会出现问题。为了解决这个问题,统计学家引入岭回归(ridge regression)的概念。 1、岭回归是啥子? 岭回归
机器学习算法工程师
2018/03/06
1.8K0
机器学习实战---线性回归提高篇之乐高玩具套件二手价预测
【机器学习】一文读懂线性回归、岭回归和Lasso回归
本文介绍线性回归模型,从梯度下降和最小二乘的角度来求解线性回归问题,以概率的方式解释了线性回归为什么采用平方损失,然后介绍了线性回归中常用的两种范数来解决过拟合和矩阵不可逆的情况,分别对应岭回归和Lasso回归,最后考虑到线性回归的局限性,介绍了一种局部加权线性回归,增加其非线性表示能力
yuquanle
2019/09/30
5930
【机器学习】一文读懂线性回归、岭回归和Lasso回归
Python3《机器学习实战》学习笔记(十二):线性回归提高篇之乐高玩具套件二手价预测
版权声明:本文为博主原创文章,未经博主允许不得转载。个人网站:http://cuijiahua.com。 https://blog.csdn.net/c406495762/article/details/82967529
Jack_Cui
2019/05/25
7500
机器学习-线性回归算法(房价预测项目)
线性回归(Linear Regression)是回归任务中最常见的算法,利用回归方程对自变量和因变量进行建模,且因变量和自变量之间是线性关系而得名,从而可以根据已知数据预测未来数据,如房价预测、PM2.5预测等。
唔仄lo咚锵
2023/05/23
9470
机器学习-线性回归算法(房价预测项目)
使用局部加权线性回归解决非线性数据的拟合问题
对于回归而言,有线性模型和非线性模型两大模型,从名字中的线性和非线性也可以直观的看出其对应的使用场景,但是在实际分析中,线性模型作为最简单直观的模型,是我们分析的首选模型,无论数据是否符合线性,肯定都会第一时间使用线性模型来拟合看看效果。
生信修炼手册
2021/02/08
2.1K0
线性回归
统计学习方法 算法(线性回归) 策略(损失函数) 优化(找到最小损失对于的W值) 线性回归 寻找一种能预测的趋势 线性关系 二维:直线关系 三维:特征,目标值,平面当中 线性关系定义 h(w)=w0+w1x1+w2x2+… 其中w,x为矩阵: w表示权重,b表示偏置顶 损失函数(误差大小:只有一个最小值) yi为第i个训练样本的真实值 hw(xi)为第i个训练样本特征值组合的预测函数 总损失的定义:(最小二乘法) 预测结果-真实结果的平方 寻找W方法 最小二乘法之梯度下降 (数据十分庞大适合用
冬夜先生
2021/12/29
4560
自查自纠 | 线性回归,你真的掌握了嘛?
寄语:本文对线性回归算法的原理及模型,学习策略、算法求解和sklearn参数做了详细的讲解。同时,用例子进行Python代码实践。
Datawhale
2020/04/28
5740
机器学习 | 简单而强大的线性回归详解
回归分析是一种预测性的建模技术,它研究的是因变量和自变量之间的关系。它能够表明自多个自变量对一个因变量的影响强度。这种技术通常用于预测分析、时间序列模型以及发现变量之间的因果关系。回归分析是一种通过建立模型来研究变量之间相互关系的密切程度、结构状态及进行模型预测的有效工具,是建模和分析数据的重要工具。
数据STUDIO
2021/06/24
1.5K0
AI-线性回归模型
通过sklearn.linear_model.LinearRegression类创建一个线性回归模型实例。这个类有许多参数可以设置,如fit_intercept(是否计算模型的截距)和normalize(是否对数据进行标准化处理)等。
@小森
2024/03/15
2870
AI-线性回归模型
相关推荐
机器学习 | 线性回归
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验