机器学习:梯度下降算法

假如我们有一个数据集: (xi1,xi2,yi)
其中,i是从1到m。数据集总共有m组。

前两个是自变量,最后一个是因变量。我们可以这样理解,存在某种关系,使得y会随着x1和x2的变化而变化。这种理解跟函数是不是很像?实际上,我们确实可以假设存在这样一个函数,它跟数据集很拟合。所以即使数据集里没有的它也可以预测出结果。现在假设有一个线性的函数可以拟合:

hθ(x(i))=θ0+θ1x(i)1+θ2x(i)2

我们希望能得到一组 θ ,使得 hθ(x(i)) 所表示的函数图像跟数据集拟合得很好。那么,如何刻画它们的拟合程度呢?

最直接的想法就是利用h(x)与y之间的差异来衡量,即定义一个代价(cost)函数:

J(θ)=12mi=1m(hθ(x(i))y(i))2=12mi=1m(θ0+θ1x(i)1+θ2x(i)2y(i))2

而我们的目标就是,想办法在这个已知的数据集下,得到一组 θ ,使得 J(θ) 的值最小。如果把 J(θ) θ 在坐标轴上画出来,它就是一个曲面,要找它的最小值,我们当然会想到最低点,要找到最低点,就是对 θ 求导,并且让导数为0,这样就找到最低点了。即令:

θjJ(θ)=θj12mi=1m(hθ(x(i))y(i))2=1mi=1m[(hθ(x(i))y(i))x(i)j]=0

这样我们就可以找出最低点了。

梯度下降算法

在计算机的计算中,我们如何才能找到 θ0 θ1 使得 J(θ) 最小呢?
1 先随便给 θ0 θ1 初始化。比如都赋值为0。
2 改变 θ0 θ1 ,使得 J(θ) 的值慢慢变小,最终收敛到最小。这时候 θ0 θ1 的值就是我们要的。
伪代码如下:
while()
{
temp0= θ0 - αθ0J(θ0,θ1)
temp1= θ1 - αθ1J(θ0,θ1)
θ0 =temp0
θ1 =temp1
}
由于每一次的 θ0 θ1 都是一个具体的数值,所以 αθ0J(θ0,θ1) 每一次都可以算出来的。

梯度下降算法的细节改进

特征缩放(Feature Scaling)

比如有数据集 (x(i)1,x(i)2,y(i))
其中有两个变量,x1和x2,假如x1的变化范围大概是0~2000,而x2的变换范围大概是1~5。显然x1和x2的取值范围差距很大,在画代价(cost)函数的时候图像会很奇怪,利用梯度下降算法找最小值的时候,下降的速度就会很慢,而且容易振荡。为了解决这个问题,可以使用归一化。即:

x1=x110002000x2=x225

学习速率α的选择

α太小,收敛速度就会变慢,太大又有可能不会收敛。只能慢慢尝试了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值