梯度下降是这么认为的,首先随机取一个点,然后按梯度方向去迭代点,让点越来越趋近、直至收敛于最低点。oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
原理很简单,但是这个迭代公式该如何求呢?-单变量线性回归算法
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
答案也不难,就是按照梯度的概念来:-单变量线性回归算法
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
(偏导部分在前缀知识部分有说明)-单变量线性回归算法
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
几何意义大抵是点(θ0,θ1)以α为速率,梯度为步长,按梯度方向(函数变化最快的方向)向最低点移动。-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
伪代码:-单变量线性回归算法
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
① 随机初始化点-单变量线性回归算法
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
② 按照一定的比例/步伐(学习率),往梯度向下的方向迭代-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
③ 收敛或精度足够时停止-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
可能有的人不太懂收敛的原因,这部分涉及到微积分的知识,大致是这样:-单变量线性回归算法
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
当点越趋近最低点时,偏导会越来越小,直至为0,此时收敛。可以认为在接近最低点的过程中,切向量的值逐渐减小(碗状曲面逐渐平缓),抵达最低点时,切平面平行于xoy面,切向量为0,此时不论如何迭代,θ的值都不再变化。-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
我们知道,前面的原理部分并没有涉及到α学习率(learning rate)这个概念,那么这个东西是要干什么呢?-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
看过吴教授课程的同学可能知道,在下降的过程中,如果步伐太大的话,是无法收敛到最低点的,如果不加上α来控制步伐大小,在很多情况下,都可能导致无法找到最低点。-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
为了解决这个问题,梯度下降引入了α来控制下降的步伐大小,确保能够收敛。但同时,α太小的话,也会导致收敛过慢。-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
需要着重说明的是θ1和θ2应该严格同步更新,按我的理解来,这是因为梯度是基于当前点的最大变化值,如果异步更新的话,比方说我们先更新θ1,然后再遍历更新θ0,此时更新θ0是基于新的θ1,所以不满足梯度的要求。-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
顺带一提,梯度下降总会收敛于局部最小值。不过在单变量线性回归中,局部最小值即是全局最小值。-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
以上就是单变量线性回归的内容,接下来我们将尝试应用于数据集:-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
给出一个数据集(工作经验与年薪)如下:-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
YearsExperience
|
Salary
|
1.1
|
39343.00
|
1.3
|
46205.00
|
1.5
|
37731.00
|
.... |
.... |
-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
文末将给出下载地址。-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
首先对数据进行归一化,提高收敛速度。然后我们简单地设置θ初始值为(0,0),α为0.01,精度为1e-4,最大迭代次数为1e4。-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
拟合效果如下:-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理

.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
可以看到效果还是比较理想的,接下来是cost的变化图像:-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理

.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
可以看到大致迭代3000次的时候基本收敛了,由于收敛值大于精度,所以迭代次数为设置的最大次数。-单变量线性回归基本原理
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
总结:-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
这部分内容应该说相当好上手,主要把握好梯度这个概念,理解好迭代(逐渐趋于cost局部最小),之后就都不难了。并且梯度下降在机器学习中有比较广泛的应用,所以对它的学习必不可少。-单变量线性回归基本原理
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
数据集和代码我都推到github上了,有需要请点击:https://github.com/foolishkylin/workspace/tree/master/machine_learning/getting_started/gradient_descent/liner_regression_single**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
-单变量线性回归算法
**Createanewinstance.**@paramnThreadsthenumberofthreadsthatwillbeusedbythisinstance.*@paramexecutort-单变量线性回归算法
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
.config().setOption((ChannelOption<Object>)e.getKey(),e.getValue())){logger.warn("Unknownchann-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
oinPool,不是一个线程大池子并发等待一条任务队列,而是每条线程都有一个任务队列。而且Netty的线程,并不只是简单的阻塞地拉取任务,而是在每个循环中做三件事情:先SelectKeys()处理NI-单变量线性回归基本原理
还没有评论,来说两句吧...