线性回归 -- 简介


线性回归是机器学习算法中最简单的算法之一,它是监督学习的一种算法,主要思想是在给定训练集上学习得到一个线性函数,在损失函数的约束下,求解相关系数,最终在测试集上测试模型的回归效果。

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为 为误差服从均值为0的正态分布。

回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

线性回归分析

一元线性回归:一个解释变量

多元线性回归:多个解释变量

线性回归 -- 步骤


回归分析的步骤:

1、根据预测目标,确定自变量和因变量;

2、绘制散点图,确定回归模型类型;

3、估计模型参数,建立回归模型;

4、对回归模型进行检验;

5、利用回归模型进行预测;

线性回归 -- 一元线性回归


一元回归的主要任务是从两个相关变量中的一个变量去估计另一个变量,被估计的变量,称因变量,可设为;估计出的变量,称自变量,设为。回归分析就是要找出一个数学模型,使得从估计可以用一个函数式去计算。当的形式是一个直线方程时,称为一元线性回归。这个方程一般可表示为。根据最小平方法或其他方法,可以从样本数据确定常数项与回归系数的值。确定后,有一个的观测值,就可得到一个的估计值。回归方程是否可靠,估计的误差有多大,都还应经过显著性检验和误差计算。有无显著的相关关系以及样本的大小等等,是影响回归方程可靠性的因素。

现实世界中的数据总是存在各种误差,比如测量工具的误差,人度数的误差等等。而且数据的产生也大部分是一个随机的过程。所以如果现实世界中存在某些线性关系,那么这个关系也一定是近似的。所以其一次函数其实是这样的:

      其中是数据偏离线性的误差,这个误差是服从正态分布的。什么!你还不知道什么是正态分布?那请先学习下相关知识。就是因为这个的存在,所以对于每一组数据,他们的误差都是不同的,所以在前面那个式子中,我们不能使用待定系数法求得尽量精确的解。所以就需要一个更高端的做法。

      先不考虑怎么做的话,我们既然知道有这个误差存在了,那么我们就应该让这个误差尽量减小,数据已经是确定好了的,我们只能在计算方法上做文章。这里移项可以得到误差的方程: 
      所以现在我们就应该想方法,利用已知的来找的合适的使  的和对于所有的已知点最小,这就是线性回归的思路。下面介绍具体方法。

      线性回归的方法

      为了求解出最小的 ,我们可以其实可以利用平方消去其中的绝对值符号,得到了我们的要求的式子:

      为了取到最小的S,我们可以对上式分别对求偏导,并令它们为,以求的S的极值,即:

                      

根据这个式子,可以知道偏导数的图像(如左图)和原函数随或者变化的图像(类似于右图)

        所以可以说,当这两个偏导数都取到的时候,就是误差取到最小值的时候。现在将提取出来

算法实现

#根据y=2*x+b随意写几个数
X=[1,2,3,4,5,6,7]
Y=[3.09,5.06,7.03,9.12,10.96,12.91,15.01]
Xsum=0.0
X2sum=0.0
Ysum=0.0
XY=0.0
n=len(X)
for i in range(n):Xsum+=X[i]Ysum+=Y[i]XY+=X[i]*Y[i]X2sum+=X[i]**2
k=(Xsum*Ysum/n-XY)/(Xsum**2/n-X2sum)
b=(Ysum-k*Xsum)/n
print('the line is y=%f*x+%f' % (k,b) )

线性回归  -- 多元线性回归


在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是与多个因素相联系的,由多个自变量的最优组合共同来预测或估计因变量,比只用一个自变量进行预测或估计更有效,更符合实际。因此多元线性回归比一元线性回归的实用意义更大。

矩阵表示:

假设数据集:

权值向量:

配置值:

对权值向量进行转置运算,可以得到:

将所有的特征向量和权为1的一列放在一起,得到X的矩阵表示:

对所有的标签进行转置运算,可以得到的矩阵表示:

由上面三个矩阵,可以得到:

二元线性回归

为因变量,为自变量,并且自变量与因变量之间为线性关系时,则二元线性回归模型为:

多元线性回归

假设为因变量,为自变量,并且自变量与因变量之间为线性关系时,则多元线性回归模型为:

其中为因变量,为n个自变量,个未知参数,为随机误差项。

假设随机误差项为0时,因变量的期望值和自变量的线性方程为:

从下图来直观理解一下线性回归优化的目标——图中线段距离(平方)的平均值,也就是最小化到分割面的距离和。

线性回归模型 -- 最小二乘法


最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

  使用极大似然估计解析最小二乘法:

  在真实数据中,一个x值可能对应多个y值,因为实际y值可能是受多种因素影响,所以我们可以假设任意一个x对于的y的真实值服从正态分布。我们什么时候可以认为模型拟合出来的点最好?当然是 取值概率最大的时候。

如上图,红蓝两条线来拟合绿色的这些数据点,明显红色的直线拟合效果更好一些。为什么?仔细看图中直线上红色x点,红色的x点正好是当前x值下,训练数据中出现概率最高的位置(之前我们已经假设每个位置y值符合高斯分布)。所以我们要求的就是使得拟合出的线(高纬度是超平面)上概率最大的,这个时候我们就可以用到极大似然估计。 
  接下来我们用极大似然来证明最小二乘法。假设误差(就是上图中绿色数据点到红色x点的距离)是独立同分布的,服从均值为0,方差为某定值的高斯分布。

可以得到似然函数:

的正态分布公式:

将似然公式带入正态分布公式,得到:

m个样本是独立的,进行下面的运算得到关于的似然函数

对上面似然函数求对数得到对数似然函数 

上式中,是定值,我们要使得上式最大,就得使最小,于是我们就得到了线性回归的目标函数:

其实通过这个公式我们可以求得关于的解析解,可以直接计算出,但我们一般不这么做,因为求解析解过程中需要求矩阵的逆,这是一个非常耗时的工作(时间复杂度),另外矩阵也不一定可逆,一般都是用梯度下降。 但我们还是看下如何求的解析解。

将M个N维样本组成矩阵X:

· X的每一行对应一个样本,共M个样本(measurements);

· X的每一列对应样本的一个维度,共N维(regressors);

· 还有额外的一维常数项,全为1;

根据上矩阵,可以得到

目标函数,即损失函数:

求一阶导得到梯度:

导数最小值,即求导数为零的点(驻点):

上述得到的方程组叫做正规方程组,那么最终得到

线性回归模型 -- 梯度下降算法


       首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。

从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

梯度下降的相关概念

    在详细了解梯度下降的算法之前,我们先看看相关的一些概念。

    1. 步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

    2.特征(feature):指的是样本中输入部分,比如2个单特征的样本,则第一个样本特征为,第一个样本输出为

    3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为。比如对于单个特征的m个样本,可以采用拟合函数如下:

    4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本,采用线性回归,损失函数为:

    其中表示第i个样本特征,表示第i个样本对应的输出,为假设函数。

梯度下降的详细算法

    既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标。

1. 先决条件: 确认优化模型的假设函数和损失函数。

对于线性回归,假设函数的矩阵表达方式为:

其中, 假设函数为m*1的向量,θ为(n+1)*1的向量,里面有n个代数法的模型参数。X为m*(n+1)维的矩阵。m代表样本的个数,n+1代表样本的特征数。

损失函数的表达式为:,其中Y是样本的输出向量,维度为m*1.

2. 算法相关参数初始化

主要是初始化,算法终止距离  以及步长。在没有任何先验知识的时候,我喜欢将所有的初始化为0, 将步长初始化为1。在调优的时候再优化。

3. 算法过程

1)确定当前位置的损失函数的梯度,对于 向量,其梯度表达式如下:

2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即对应于前面登山例子中的某一步。

3)确定向量里面的每个值,梯度下降的距离都小于,如果小于则算法终止,当前向量即为最终结果。否则进入步骤4.

4)更新向量,其更新表达式如下。更新完毕后继续转入步骤1.

                                                                           

梯度方向

进行关于的求导,得到梯度下降的梯度方向:

       批量梯度下降法(Batch Gradient Descent)

批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新,上面的详细算法过程就是使用批量梯度下降法实现的。对应的更新公式是:

由于我们有m个样本,这里求梯度的时候就用了所有m个样本的梯度数据。

批量梯度下降法图示:

       随机梯度下降法(Stochastic Gradient Descent)

随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:

随机梯度下降法,和的批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

线性回归 -- 实例


#线性回归
import numpy as np # 快速操作结构数组的工具
import matplotlib.pyplot as plt  # 可视化绘制
from sklearn.linear_model import LinearRegression  # 线性回归# 样本数据集,第一列为x,第二列为y,在x和y之间建立回归模型
data=[[0.067732,3.176513],[0.427810,3.816464],[0.995731,4.550095],[0.738336,4.256571],[0.981083,4.560815],[0.526171,3.929515],[0.378887,3.526170],[0.033859,3.156393],[0.132791,3.110301],[0.138306,3.149813],[0.247809,3.476346],[0.648270,4.119688],[0.731209,4.282233],[0.236833,3.486582],[0.969788,4.655492],[0.607492,3.965162],[0.358622,3.514900],[0.147846,3.125947],[0.637820,4.094115],[0.230372,3.476039],[0.070237,3.210610],[0.067154,3.190612],[0.925577,4.631504],[0.717733,4.295890],[0.015371,3.085028],[0.335070,3.448080],[0.040486,3.167440],[0.212575,3.364266],[0.617218,3.993482],[0.541196,3.891471]
]#生成X和y矩阵
dataMat = np.array(data)
X = dataMat[:,0:1]   # 变量x
y = dataMat[:,1]   #变量y# ========线性回归========
model = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
model.fit(X, y)   # 线性回归建模
print('系数矩阵:\n',model.coef_)
print('线性回归模型:\n',model)
# 使用模型预测
predicted = model.predict(X)# 绘制散点图 参数:x横轴 y纵轴
plt.scatter(X, y, marker='x')
plt.plot(X, predicted,c='r')# 绘制x轴和y轴坐标
plt.xlabel("x")
plt.ylabel("y")# 显示图形
plt.show()

输出结果:

系数矩阵:
                         [ 1.6314263]
        线性回归模型:

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

图形:

Python机器学习 — 线性回归(Linear Regression)相关推荐

  1. Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”

    Coursera公开课笔记: 斯坦福大学机器学习第四课"多变量线性回归(Linear Regression with Multiple Variables)" 斯坦福大学机器学习第 ...

  2. Coursera公开课笔记: 斯坦福大学机器学习第二课“单变量线性回归(Linear regression with one variable)”

    Coursera公开课笔记: 斯坦福大学机器学习第二课"单变量线性回归(Linear regression with one variable)" 发表于 2012年05月6号 由 ...

  3. Stanford机器学习---第二讲. 多变量线性回归 Linear Regression with multiple variable

    本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学 ...

  4. Ng第二课:单变量线性回归(Linear Regression with One Variable)

    二.单变量线性回归(Linear Regression with One Variable) 2.1  模型表示 2.2  代价函数 2.3  代价函数的直观理解 2.4  梯度下降 2.5  梯度下 ...

  5. 机器学习方法:回归(一):线性回归Linear regression

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 开一个机器学习方法科普系列:做基础回顾之用,学而时习之:也拿出来与大家分享.数学水平有限,只求易懂,学习与工 ...

  6. 复盘:手推LR(逻辑回归logistics regression),它和线性回归linear regression的区别是啥

    复盘:手推LR(逻辑回归logistics regression),它和线性回归linear regression的区别是啥? 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学 ...

  7. 线性回归 Linear Regression 与逻辑回归 Logistic Regression

    1 线性回归 Linear Regression 理论 线性回归模型研究多个变量x与y之间的关系,通过回归模型预测位置样本的数据. 假设函数 损失函数 损失函数寻优,最小二乘法 即: 注:最小二乘法需 ...

  8. 西瓜书+实战+吴恩达机器学习(四)监督学习之线性回归 Linear Regression

    文章目录 0. 前言 1. 线性回归参数求解方法 2. 线性回归正则化 2.1. 岭回归 2.2. LASSO 3. 局部加权线性回归 4. 广义线性模型 如果这篇文章对你有一点小小的帮助,请给个关注 ...

  9. 多元线性回归算法: 线性回归Linear Regression、岭回归Ridge regression、Lasso回归、主成分回归PCR、偏最小二乘PLS

    0. 问题描述 输入数据:X=(x1,x2,....,xm)\mathbf{X} = (x_1, x_2,...., x_m)X=(x1​,x2​,....,xm​), 相应标签 Y=(y1,y2,. ...

  10. 线性模型|| 线性回归(Linear Regression)

    目录: 一.线性模型概念 二.LR算法直观原理 三.Python代码实现算法 (notice: 1)公式中,字母粗体以示向量 2)本文中LR指代Linear Regression,而非Logistic ...

最新文章

  1. UNIX/Linux系统管理技术手册(3)----bash 数组和算术运算
  2. Oracle PL/SQL语言初级教程
  3. Python random 模块 - Python零基础入门教程
  4. 怎样设置电脑壁纸_怎样设置电脑的资料定时备份到移动硬盘里
  5. 不做单元测试的6大借口
  6. 蚌埠计算机学校招生,蚌埠高级技工学校招生政策
  7. php获取当前行,获取在PHP中执行当前函数的代码行和文件?
  8. 记我朋友的一次前端面试
  9. python文本关联分析,详解Python文本操作相关模块
  10. AWS DeepRacer ROS 架构 模拟环境和真实赛道的区别
  11. MySQL 中文的乱码问题
  12. 站长必备-伪原创原创度检测软件v1.3 (支持百度/谷歌/360/搜狗/神马/微信)
  13. 动态规划 TSP 问题
  14. Snipaste截图软件安装、使用详细教程(附下载链接)
  15. Android 9.0 wifi 热点 汇总
  16. It彭于晏带你学JAVA之适配器模式及API
  17. 中国移动:4G流量不清零,可分享
  18. Python中find_elements以及presence_of_element_located的用法
  19. 微信公众号--发送模板消息
  20. 白鹭引擎 android9,白鹭引擎打包APP过程

热门文章

  1. 从一个Word文档拷贝Header到另一个Word文档
  2. 测试——解决MonkeyRunner无法运行的问题
  3. 三十多岁就别转行做算法了
  4. 计算机中丢失vcru,计算机中丢失MSVCR120.dll
  5. org.elasticsearch.ElasticsearchException: not all primary shards of
  6. 加固加壳脱壳分析(2)_脱壳原理和一些脱壳机分析
  7. AndroidStudio无法正确安装或者启动HAXM(Win7下数字签名问题)
  8. C++中SIN的用法
  9. java编程测试标识符是否正确_20145209刘一阳《JAVA程序设计》第二周课堂测试
  10. 如何设置一个计算机用户访问磁盘,怎么把硬盘共享给其他电脑