博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习之线性回归
阅读量:2051 次
发布时间:2019-04-28

本文共 7307 字,大约阅读时间需要 24 分钟。

1.什么是线性回归

线性回归,首先要介绍一下机器学习中的两个常见的问题:回归任务和分类任务。那什么是回归任务和分类任务呢?简单的来说,在监督学习中(也就是有标签的数据中),标签值为连续值时是回归任务,标志值是离散值时是分类任务。

线性回归模型就是处理回归任务的最基础的模型。 线性回归模型试图学得一个线性模型以尽可能准确地预测实值X的输出标记Y。在这个模型中,因变量Y是连续的,自变量X可以是连续或离散的。

首先来了解一些字母的含义:m-训练集样本的数量;x-输入变量/特征;y-输出变量/要预测的目标变量;(x,y)-表示一个训练样本;( x ( i ) x^{(i)} x(i), y ( i ) y^{(i)} y(i))中i上标:表示第i个训练样本,即表示表格中的第i行; x 1 x_{1} x1 x 2 x_{2} x2 、… x n x_{n} xn表示特征向量,n表示特征向量的个数; h θ h_{\theta} hθ (x)称为假设函数,h是一个引导从x得到y的函数;

举个简单的例子:

输入数据:工资( x 1 x_{1} x1)和房屋面积( x 2 x_{2} x2)(两个特征)

输出目标:预测银行会贷款多少钱(标签)

姓名 工资 房屋面积 可贷款金额
张三 6000 58 33433
李四 9000 77 55833
王五 11000 89 72399
赵六 15000 54 62392

这个表格表示的是可贷款的金额与工资和房屋面积之间的关系,其中工资 x 1 x_{1} x1和房屋面积 x 2 x_{2} x2为特征,可贷款金额为目标函数值 h θ h_{\theta} hθ (x)。 θ 1 {\theta_{1}} θ1表示工资的参数, θ 2 {\theta_{2}} θ2表示房屋面积的参数。

那么根据线性函数可得到以下公式:
h θ ( x ) = Θ 1 X 1 + Θ 2 X 2 h_{\theta }(x)=\Theta_{1}X_{1}+\Theta_{2}X_{2} hθ(x)=Θ1X1+Θ2X2

上面的这个式子是当一个模型只有两个特征(x1,x2)的时候的线性回归式子。正常情况下,现金贷中可贷款的额度和用户的很多特征相关联,并不只是简单的这两个特征。所以我们需要把这个式子进行通用化,假如有n个特征的话,那么式子就会变成下面的样子:

在这里插入图片描述
h θ ( x ) = ∑ i = 0 n θ i x i = θ T x h_{\theta }(x)=\sum_{i=0}^{n}\theta _{i}x_{i}=\theta ^Tx hθ(x)=i=0nθixi=θTx

θ 1 {\theta_{1}} θ1 θ 2 {\theta_{2}} θ2两个参数取值不同导致假设函数 h θ h_{\theta} hθ (x)不同,此时我们要找出最优的 θ 1 {\theta_{1}} θ1 θ 2 {\theta_{2}} θ2,使得模型效果最好。

2.误差

在这里插入图片描述图中的横坐标X1 和 X2 分别代表着 两个特征(工资、房屋平米) 。纵坐标Y代表目标(可贷款的额度)。其中红点代表的就是实际的目标值(每个人可贷款的额度)。而平面上和红点竖向相交的点代表着我们根据线性回归模型得到的点。也就是说实际得到的钱和预估的钱之间是有一定误差的,这个就是误差项。

因为误差项是真实值和误差值之间的一个差距(用 ε \varepsilon ε 来表示误差), y ( i ) y^{(i)} y(i)表示真实值。那么肯定我们希望误差项越小越好:
y ( i ) = Θ T x ( i ) + ε i y^{(i)}=\Theta^{T}x^{(i)}+\varepsilon ^{i} y(i)=ΘTx(i)+εi
假设认为这个误差项是满足以下几个条件的:误差 ε ( i ) \varepsilon ^{(i)} ε(i),是独立的并且具有相同的分布,并且服从均值为0方差为 θ 2 \theta ^2 θ2的高斯分布。
1.独立:张三和李四一起使用这款产品,可贷款额互不影响
2.同分布:张三和李四是使用的是同一款产品
3.高斯分布:绝大多数的情况下,在一个的空间内浮动不大
下面是高斯分布的图
在这里插入图片描述数学知识:高斯分布(正态分布)的概率密度函数为: f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sqrt{2\pi }\sigma }e^{-\frac{(x-\mu )^{2}}{2\sigma ^{2}}} f(x)=2π σ1e2σ2(xμ)2
误差服从高斯分布
在这里插入图片描述误差项肯定是越小越好了,那么接下来要讨论的就是什么样的参数和特征的组合能够让误差项最小呢? 这里就引入了似然函数的作用。似然函数的作用就是要根据样本来求什么样的参数和特征的组成能够最接近真实值。越接近真实值则误差越小。在这里插入图片描述似然函数就是求能让真实值和预测值相等的那个参数的。 ∏ \prod 表示仪表各数相乘的结果。

上面的式子是多个参数的乘积的形式,很难进行计算,所以我们又采用了对数的一个小技巧,把多个数相乘,转化成多个数相加的形式。在这里插入图片描述

根据上面的这种换算关系,我们就把似然函数的式子换算成下面的这个。
在这里插入图片描述(因为似然函数是越大越好,似然函数的值和对数似然函数的值是成正比的,对值求对数,并不会影响到最后求极限的值。所以才敢进行对数处理。)
在这里插入图片描述为了使似然函数(对数似然函数)越大越好,则需要使 J ( θ ) J(\theta ) Jθ越小越好。
这里定义线性回归的代价函数: J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^{2} J(θ)=2m1i=1m(hθ(x(i))y(i))2
通过上面一系列推导,代价函数 J ( θ ) J(\theta ) Jθ最小二乘模型
这就是在线性回归中使用似然函数的相关知识。

3.求解最小二乘法:

我们要求得就是当θ取某个值时使代价函数J(θ)最小,求解最小二乘法的方法一般有两种方法:矩阵式梯度下降法

3.1矩阵式求解:

J ( θ ) J(\theta ) Jθ求偏导:–凸函数(凸优化),偏导等于0

在求之前,先转换成矩阵式,如下:

在这里插入图片描述把这个式子求一下偏导如下:

在这里插入图片描述上面的公式里面还涉及到矩阵转置的性质。根据矩阵求导的三个重要公式:

在这里插入图片描述
另导数等于0:
在这里插入图片描述
因为 X T X X^TX XTX为方阵,如果 X T X X^TX XTX是可逆的,则参数θ得解析式可以写成:
Θ = ( X T X ) − 1 X T y \Theta =\left ( X^{T}X \right )^{-1}X^{T}y Θ=(XTX)1XTy
特征方程法得到的是解析解,无需迭代,也没有设置学习速率的繁琐,但是求解正规方程需要求矩阵的逆,然而不是所有的矩阵都可逆,而且有些可逆矩阵的求逆极其耗费时间,所以特征方程法看似简单,其实使用场景并不多。只有当特征值比较小的时候,可以考虑矩阵式求法。

X T X X^T X XTX不可逆,可能有两个原因:

1.列向量线性相关,即训练集中存在冗余特征,此时应该剔除掉多余特征;

2.特征过多,此时应该去掉影响较小的特征,或使用“正则化”。

当样本总数 m 小于等于特征数量 n 时, 一定不可逆。

3.2梯度下降法(GD):

我先举个例子简单的介绍一下什么是梯度下降法

在这里插入图片描述 如上图所示,想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算法中,我们要做的就是旋转360度,看看我们的周围,并问自己要在某个方向上,用小碎步尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部最低点的位置。
如何找到最低点对应的 θ \theta θ
其实就是代价函数J(θ)对该参数求导的结果 。已知代价函数J(θ)为: J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^{2} J(θ)=2m1i=1m(hθ(x(i))y(i))2
求偏导数:
在这里插入图片描述上面的推导中1/2和2互消了,所以给了我们一个更加直观简洁的结果,这就是为什么代价函数公式要乘以一个1/2.
需要注意的是,上面的公式中,我们采用了一个更加通用的(考虑了多个自变量的情况)表示模型h的方式:
h θ ( x ) = θ 1 1 + θ 2 x 2 + . . . θ n x n = ∑ i = 0 n θ i x i h_{\theta }(x)=\theta_{1}1+\theta_{2}x_{2}+...\theta_{n}x_{n}=\sum_{i=0}^{n}\theta_{i}x_{i} hθ(x)=θ11+θ2x2+...θnxn=i=0nθixi
这里 θ 0 \theta_{0} θ0乘以一个常数1,也可以认为乘以了常量 x 0 = 1 x_0 = 1 x0=1
所以代价函数对 θ 0 \theta_{0} θ0 求偏导的结果就是:
∂ ∂ θ 0 J ( θ ) = ( h θ ( x ) − y ) x 0 = ( h θ ( x ) − y ) \frac{\partial }{\partial \theta_{0}}J(\theta )=(h_{\theta }(x)-y)x_{0}=(h_{\theta }(x)-y) θ0J(θ)=(hθ(x)y)x0=(hθ(x)y)
所以代价函数对 θ 1 \theta_{1} θ1 求偏导的结果就是:
∂ ∂ θ 1 J ( θ ) = ( h θ ( x ) − y ) x 1 \frac{\partial }{\partial \theta_{1}}J(\theta )=(h_{\theta }(x)-y)x_{1} θ1J(θ)=(hθ(x)y)x1
求得的结果怎么使用?

注意,对 θ \theta θ求偏导数的意义是得到这一点上的切线的斜率,它将给我们一个向最小值移动的方向。

因此, θ \theta θ减去偏导数就等于 θ \theta θ向最小值的方向移动了一步。这一步的大小由一个参数 α \alpha α决定,也称作学习率(代表下降幅度,步长,小会导致收敛慢,大会导致错过最优点。它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。)。用公式表达如下:

θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta _{j}:=\theta _{j}-\alpha\frac{\partial }{\partial \theta _{j}}J(\theta ) θj:=θjαθjJ(θ)
因为θ中有多个参数,所以每次迭代对于每个参数都需要进行梯度下降,直到J(θ)收敛到最小值。

4.数据归一化

4.1特征缩放:

在我们面对多维特征问题的时候,我们要保证这些特征都具有相近的尺度,这将帮助梯度下降算法更快地收敛。

以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000平方英尺,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁,梯度下降算法需要非常多次的迭代才能收敛。在这里插入图片描述

解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间。如图
在这里插入图片描述特征缩放就是将特征除以最大值。

4.2均值归一化:

均值归一化的方法就是令 x i = x i − μ i s i x_{i} =\frac{x_{i}- \mu _{i} }{s_{i} } xi=sixiμi:,其中 μ i \mu _{i} μi是平均值, s i s_{i} si是标准差.

具体做法就是:如果你有一个特征xi你就用xi−μi来替换。这样做的目的是为了让你的特征值具有为0的平均值。很明显 我们不需要把这一步应用到x0中,因为x0中,因为x0总是等于1的,所以它不可能有为0的的平均值。

但是对其他的特征来说,比如房子的大小取值介于0 ~ 2000,并且假如房子面积的平均值是等于1000的,那么你可以用这个公式:

x1=(size−1000)/2000

类似地,如果你的房子有五间卧室,并且平均一套房子有两间卧室,那么你可以使用这个公式来归一化你的第二个特征x2:

x2=(卧室数−2)/5

在这两种情况下你可以算出新的特征x1和x2x1和x2,它们的范围可以在-0.5 ~ +0.5之间,当然这肯定不对,x2的值实际上肯定会大于0.5。更一般的规律是用: (xn−μn)/Sn来替换xn

其中定义μn的意思是在训练集中特征xn的平均值。而Sn是该特征值的范围(最大值减去最小值)。

最后需要注意的是:特征缩放其实并不需要太精确,其目的只是为了让梯度下降能够运行得更快一点,让梯度下降收敛所需的循环次数更少一些而已。

5.梯度下降法的三种方式

第一种方式就是全量梯度下降,也就是说每一次梯度下降都利用全部的数据。这种方法简称为BGD(Batch Gradient Descent)。该算法的缺点是当数据量m较大时,速度很慢。

第二种方式是随机梯度下降,即随机梯度下降(Stochastic Gradient Descent),简称SGD。这种方法的意思是 ,每次梯度下降的过程使用一个随机的样本,但是该方法有一个问题,就是每次选取的学习率如果太小则速度很慢,太大怎么无法得到全局最优解,解决该问题的方法就是灵活设置学习率,让学习率一开始比较大,随后逐渐减小,这种方法也称作模拟退火(simulated annealing)。

第三种方法介于上面两种方法之间,即mini-batch Gradient Descent,简称mini-batch GD,该方法是每次梯度下降过程使用一个比较小的随机数据集。该方法的好处是能够利用计算机对于矩阵求解的性能优化,进而加快计算效率。

6.我们通过一个例子来解决线性回归问题:

1.初始化一个模型,例如 h = 2 + 3x,也就是说,我们的初始参数是 θ 0 = 2 \theta_{0}=2 θ0=2 θ 1 = 3 \theta_{1}=3 θ1=3

2.给定一个样本对,例如(2,4),代入模型中求得预测值,即 h = 2 + 3*2 = 8

3.代入代价函数公式中,求代价值,即 J = 1/2 * (8-4) ^ 2 = 8

4.代入偏导数公式中求 θ 0 \theta_{0} θ0 θ 1 \theta_{1} θ1的偏导数,即 ∂ ∂ θ 0 J ( θ ) = ( h θ ( x ) − y ) = 2 + 3 ∗ 2 − 4 = 4 \frac{\partial }{\partial \theta_{0}}J(\theta )=(h_{\theta }(x)-y)= 2 + 3*2-4=4 θ0J(θ)=(hθ(x)y)=2+324=4

5. ∂ ∂ θ 1 J ( θ ) = ( h θ ( x ) − y ) x 1 = ( ( 2 + 3 ∗ 2 ) − 4 ) ∗ 2 = 8 \frac{\partial }{\partial \theta_{1}}J(\theta )=(h_{\theta }(x)-y)x_{1}=( (2 + 3*2)-4)*2=8 θ1J(θ)=(hθ(x)y)x1=((2+32)4)2=8

6.假设我们的学习率是0.1,那么代入梯度下降公式得到

θ 0 : = θ 0 − α ∂ ∂ θ 0 J ( θ ) = 2 − 0.1 ∗ 4 = 1.6 \theta _{0}:=\theta _{0}-\alpha\frac{\partial }{\partial \theta _{0}}J(\theta )=2-0.1*4=1.6 θ0:=θ0αθ0J(θ)=20.14=1.6

7. θ 1 : = θ 1 − α ∂ ∂ θ 1 J ( θ ) = 3 − 0.1 ∗ 8 = 2.2 \theta _{1}:=\theta _{1}-\alpha\frac{\partial }{\partial \theta _{1}}J(\theta )=3-0.1*8=2.2 θ1:=θ1αθ1J(θ)=30.18=2.2

8.我们得到了新的参数,即 θ 0 = 1.6 \theta _{0}=1.6 θ0=1.6 θ 1 = 2.2 \theta _{1}=2.2 θ1=2.2所以新的模型是:h = 1.6 + 2.2x,新的预测值是h = 1.6 + 2.2*2 = 6,再次计算代价函数的值:J = 1/2 * (6-4) ^ 2 = 2

9.比较新的模型得到的代价值2,比老模型得到的代价值8减少了6,代价越小说明我们的模型与训练集匹配的越好,所以通过不断的梯度下降(也就是最小二乘法),我们可以得到最适合训练数据的模型h。

转载地址:http://ufulf.baihongyu.com/

你可能感兴趣的文章
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
被废弃的dispatch_get_current_queue
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
ExecutorService 线程池 newFixedThreadPool newSingleThreadExecutor newCachedThreadPool
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>
checkbox设置字体颜色
查看>>
第一篇 HelloWorld.java重新学起
查看>>
ORACLE表空间扩张
查看>>
orcal 循环执行sql
查看>>