首页
学习
活动
专区
工具
TVP
发布

R语言之梯度下降法求解线性回归方程

数学从来都不是玄学~~

个人认为,理解一个模型,最好的办法就是看懂其公式推导过程,数学从来都不是玄学,任何一个好的方法或者模型,都必然有其严谨的推导或者证明过程!如果可以,还是建议多看看公式推导,虽然有不少超出了我们的理解范围,但如果可以,还是看一看,至少你可以慢慢鉴别出,别人在跟你聊(chui)模(niu)型(bi)时,是不是在忽悠你。实在看不懂,那就先放一放吧,比如本人,我就经常放一放,哈哈,你不要学我

(来源百度图片)

本文主要参考资料来自于吴恩达老师讲解的机器学习视频,该类视频在网上一搜便可搜到,这里提供B站的一个链接:https://www.bilibili.com/video/av9912938/index_91.html#page=1。感兴趣的可以去看看~~

分解一下本文题目,就可以知道本文想从三个方面来给大家分享:

1. R语言编写相关代码;2. 梯度下降法(Gradient descent);3. 线性回归(Linear regression)。

当然,本文以最简单的例子入手,但是其求解思想完全都在里面

线性回归

其主要是查看因变量和自变量之间的线性关系,常见比较简单的线性方程:y=a+bx,通常我们会有两列数,一列数代表自变量(x),一列数代表因变量(y),然后根据这些数据求出a和b是多少,从而得到我们的线性方程。

求解的方法有很多,比如最小二乘法,极大似然估计法,至于这个的公式就不在这里展列了,本文的关注点在梯度下降法。

梯度下降法

其英文叫法“Gradient descent”,翻译过来是梯度下降,所谓法如其名,直观的理解,其就是以某一个梯度值(alpha)逐步下降,最终找到局部最优解,就如下图一样:

(吴老师视频资料)

这里面要知道的一个概念就是这个J函数,也就是上图中的z轴所表达的。它的专有名字是“Cost function”,翻译过来有的叫代价函数,有的叫损失函数。为什么这么叫呢?我们来看下其定义:

还是以简单的例子说明,现在我们的线性方程是y=θ+θ1x,其实跟我们常见的这个y=a+bx是一个东西哈,只是用不同的字母表示一下,那么θ就是我们常说的截距,θ1就是我们常说的系数,那么J(θ,θ1)就是:

其中,hθ(x(i))=θ+θ1x(i),m就表示有m个样本,x(i)就是那一列表示自变量数值的第i个数,y(i)就是那一列表示因变量数值的第i个数,比如吴老师在视频中经常爱举的例子,想要根据房子的大小,预测房子的价格,数据如下:

那么这里x(1)就等于2104,y(1)就等于460,其他的以此类推,m就等于4。

我们想求得θ和θ1的最优值,其含义就是想找一根直线能够很好的表征x和y之间的关系,比如房屋面积和价钱之间的关系,那么怎么才能算是“很好的表征”呢?一个直观的想法就是“要足够的准确”!我们在这里是这么表征这个“足够准确”的意思,也就是说找到这样的一对(θ,θ1),使J(θ,θ1)的值达到最小

经常也会有人问,这里的函数为什么会有一个1/2,其实这是为了后面求导数,正好可以将其约掉,方便计算。

接下来可以拿起小本本,自己推导一下,这里需要求偏导数。

这里面就需要多次循环,更新这两个值,以求找到最优解。再一个,就是这个梯度值(alpha),也需要我们提前进行设定。所以要注意的是,我们需要提前给定一个(θ,θ1)的初始值,一个步长值(梯度值)。

R语言实现代码

我们这里使用简单的数据为例,构造数据如下:

x

y

x是抽取-5到5均匀分布的随机数,一共100个,y是在x的基础上加了一个正态扰动,可以想象到,这个线性关系应该近似是:y=x+3。原始数据作图如下:

接下来先编写代价函数,也就是J(θ,θ1),后面可以直接用来调用:

cost

sum( (X %*% theta - y)^2 ) / (2*length(y))

}

对照着原始公式比对一下,这里面如果你对“%*%”这个符号不熟悉,可以去看看我以前写的推文《在R语言中含有百分号(%)符号的含义》。

下面就是梯度下降法的主要代码:

# 设定步长和循环次数

alpha

num_iters

# 将下面每一步计算的结果保存在我们定义的变量中

cost_history

theta_history

# 初始化我们要求的参数值,也就是θ和θ1

theta

theta

# 加上一列1,就是说截距的系数都是1

X

# 使用梯度下降法进行循环求解

#cost_history保存的就是每一步求解的代价函数值

#theta_history保存的就是每一步求解的参数值

for (i in 1:num_iters) {

error

delta

theta

cost_history[i]

theta_history[[i]]

}

每一步计算的结果都存在了cost_history和theta_history里面,最新的参数值就是更新到最后的theta这个变量,运行下:

可得我们这个方程为:y=2.9389664+0.9852954*x,是不是跟我们一开始预想的很接近!

当然,也可以使用在R语言里面求线性回归最常用的了lm函数,如下:

两种方法求解的结果非常接近!

最后我们将所有的结果以动态图的形式展现一下,大家来感受下:

本文主要集中分享一下梯度下降法求解的思想,以简单的数据为例,以此类推,当然也可以做多变量的模型撒,在这里暂时就不分享了,感兴趣的可以自己改写一下代码。

虽然咱们不过圣诞节,但是祝福还是要有的,祝大家平安夜快乐,圣诞节快乐^_^

参考资料:

https://www.bilibili.com/video/av9912938/index_10.html#page=1

http://blog.csdn.net/xiazdong/article/details/7950084

https://www.r-bloggers.com/linear-regression-by-gradient-descent/

本人致力于打造一款国内较为实用的数据分析平台(http://www.omicsolution.org/wu-kong-beta-linux/main/),为广大国内有需求的小伙伴提供帮助,也感谢大家关注转发,以求帮助更多的人,谢谢

关注一下又不会怀孕,哈哈。。。

平台目前包含的工具(还在持续更新中...):

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171224G0NYJW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券