机器学习(一)梯度下降算法
因为算法最好能应用到实际问题中才会让读者感到它的真实的用处,因此首先我来描述一个实际问题(梯度下降算法用以帮助解决该问题):给定一个指定的数据集,比如由若干某一地区的房屋面积和房屋价格这样的数据对(area, price)组成的集合(吴恩达老师的课程是启蒙课程所以举该例子),我的目标是通过一个学习算法得到一个预测房价和房屋面积之间的函数,然后给定一个新的房屋面积,用这个函数来预测房价。如下图所示:
我的解决思路大致如下:
1、我找了一个很小的数据集,有两个特征X1,X2,一个输出Y;
2、根据我的数据假设我的预测函数是一个线性函数 h(x):
(为什么是线性函数一方面是因为通过我的数据点的分布可以预测我的预测函数模型,另一方面我希望通过一个不是很复杂的函数来帮助我先理解到梯度下降算法到底做了什么,这算一个线性回归问题。)
3、此时我的目标是通过求得函数中的参数来得到预测函数 h (x), 合理的预测函数应该和实际值的差值越小越好,因此如果我能使预测函数值和实际值的差值越小那么说明我的预测函数越好,因此通过求使下面的 cost function J(Θ) 取得最小值的参数组合便能得到我的预测函数 h(x);
4、如何求 J(Θ) 的最小值呢,就是应用阶梯下降算法。对于每一个参数都先设置一个初始点,然后按照下面的原则不断的进行值的更新:
从表达式可以看出,通过对J(Θ) 求导,从Θ的初始点开始,相当于每次都朝着一个下降最快的方向更新值,其中 α 是 learning rate, 相当于求导选定下降方向,learning rate 决定下降步长, 从算法实现的结果你会发现不一样的 α 会产生不一样的结果,合适的步长才能得到最好的结果。通过将求导结果代入后得到:
因此接下来我们要做的就是对每个参数都进行迭代更新,直至收敛得到局部最优解:
接下来就是算法的实现了,通过实现得到参数的值然后得到预测函数最后进行预测。
这是我实现这一小块的算法截图:
其中会涉及到一些向量的计算,给定数据集以后将输入 X 和输出 Y 都用向量表示(这可得好好儿学学!)另外其中的 loss 是用来记录每次迭代后得到的预测函数和实际值的差值,gradient 是用来记录每次下降的梯度,这样能更直观的看到这个算法究竟在干啥!值得注意的还有迭代的次数 maxIteration , 它和 α 一起可以得到参数的最优解。
这是我的测试数据集,输入的是X1和X2:
下面是我用不同的 α 值和 maxIteration 值测试后的结果:
α = 0.05,maxIteration = 10;(因为我这次输出的辅助信息多,所以只选了很少的迭代次数,给大家看一下过程)
你会发现,每次的loss值都在变大,参数值也变得越来越离谱,预测结果更是不敢恭维,仅仅10次就这么大了。我又冒死试了一下迭代1000次只输出预测值,别的信息不输出:
结果就是 nan。
然后我改变了一下我的 α 值,α =0.001 迭代10次输出一些辅助信息:
你会清楚的看见 loss 在逐渐变小,gradient 下降的很合理,结果也令人比较满意。迭代1000次看看结果吧:
嗯,可以接受,如果仔细的看看 上上.....图,你会发现 loss 减小的速度很慢,这很有可能证明你的 α 值 太小了,所以逐渐增大 α 值 然后输出结果:
α = 0.005 ,maxIteration = 1000
α = 0.01 ,maxIteration = 1000
α = 0.01 ,maxIteration = 2000
α = 0.01 ,maxIteration = 5000
到这就发现随着迭代次数的增加,输出已经不再改变了,这你应该能证明什么叫收敛了!
对于大牛们来说这太小儿科了,但是对于新手上路来说,还是很开心的,也觉得很神奇。
最后如果您有什么建议的话我非常乐意接受,也希望可以一起学习!
(奥对,如果你也想要和我一起学习算法、机器学习的内容,如果你也有奇思妙想的话,欢迎扫描下面的二维码关注我的公众号“说疯话的小聋瞎”! 嘻嘻!)
注:原始数据集和测试数据集来自https://www.jianshu.com/p/9bf3017e2487#
微信扫一扫
关注该公众号
原文地址:https://www.cnblogs.com/elsaSong/p/8620129.html