数学从来都不是玄学~~
个人认为,理解一个模型,最好的办法就是看懂其公式推导过程,数学从来都不是玄学,任何一个好的方法或者模型,都必然有其严谨的推导或者证明过程!如果可以,还是建议多看看公式推导,虽然有不少超出了我们的理解范围,但如果可以,还是看一看,至少你可以慢慢鉴别出,别人在跟你聊(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/),为广大国内有需求的小伙伴提供帮助,也感谢大家关注转发,以求帮助更多的人,谢谢
关注一下又不会怀孕,哈哈。。。
平台目前包含的工具(还在持续更新中...):
领取专属 10元无门槛券
私享最新 技术干货