单值函数梯度下降法总结

拟合的代价函数

目标:

用直线把一组数据拟合到最好(虽然已经有成熟的最小二乘法,但是这里不用)。首先要有一组训练数据,M代表训练数据的总数,假设为47。

data

这里需要有一个假设函数(Hypothesis),也就是用来拟合的函数形式,这里因为要用直线线性拟合,故假设函数为:

h θ ( x ) = θ 0 + θ 1 x h_{\theta}(x) = \theta_0 + \theta_1 x hθ(x)=θ0+θ1x

其中 θ i \theta_i θi被称为模型参数。目标就是确定这些参数的值。

梯度下降算法

问题描述

  • 有一个目标函数 J ( θ 0 , θ 1 ) J(\theta_0, \theta_1) J(θ0,θ1)
  • 目标:求使得J取到最小值的 θ 0 , θ 1 \theta_0, \theta_1 θ0,θ1的值

梯度下降法

首先初始化向量 θ \bf{\theta} θ,并沿梯度方向更新向量 θ \bf{\theta} θ(改变 θ \theta θ的值使得代价函数最快的变小),直到达到了预期的最小值。如图所示:

图示

注意 梯度下降法找到的是局部最优解,而不是全局最优。具体是哪一个局部最优取决于初始值,如下图:

图示

梯度下降法的核心算法伪代码所示如下:

for j = 0 and j = 1:
repeat until convergence { θ j = θ j − α ∂ ∂ θ j J ( θ 0 , θ 1 ) \theta_j = \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta_0, \theta_1) θj=θjαθjJ(θ0,θ1) }

另外注意 在循环过程中必须同时更新向量 θ \theta θ中的每一个分量,不能先更新某一个分量再来计算更新另一个分量,即每一次更新计算都必须使用上一个点出的值。

循环内的算法

更新 θ \theta θ向量的两个式子如下:

θ 0 = θ 0 − α ∗ ∂ ∂ θ 0 J ( θ 0 , θ 1 ) \theta_0 = \theta_0 - \alpha*\frac{\partial}{\partial\theta_0}J(\theta_0,\theta_1) θ0=θ0αθ0J(θ0,θ1)

θ 1 = θ 1 − α ∗ ∂ ∂ θ 1 J ( θ 0 , θ 1 ) \theta_1 = \theta_1 - \alpha*\frac{\partial}{\partial\theta_1}J(\theta_0,\theta_1) θ1=θ1αθ1J(θ0,θ1)

其中 J ( θ 0 , θ 1 ) J(\theta_0,\theta_1) J(θ0,θ1)为代价函数,为:

J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta_0,\theta_1) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})^2 J(θ0,θ1)=2m1i=1m(hθ(x(i))y(i))2

对于线性回归的代价函数(如上)来说,它是一个弓形函数(convex function),它只存在一个局部最优,就是全局最优。所以对于这个函数使用梯度下降法并不会像最开始说梯度下降一样陷入某个局部最优。

下面将偏导数计算出结果来,迭代表达式如下:

θ 0 = θ 0 − α ∗ 1 m ∗ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) \theta_0 = \theta_0 - \alpha*\frac{1}{m}*\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)}) θ0=θ0αm1i=1m(hθ(x(i))y(i))

θ 1 = θ 1 − α ∗ 1 m ∗ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) ∗ x ( i ) \theta_1 = \theta_1 - \alpha*\frac{1}{m}*\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})*x^{(i)} θ1=θ1αm1i=1m(hθ(x(i))y(i))x(i)

MATLAB代码实现

使用MATLAB代码实现,若假设样本数据 ( x ( i ) , y ( i ) ) (x^{(i)},y^{(i)}) (x(i),y(i))存在向量x和y中,代码如下:

自己写代码运行发现,若数据点过少(10个左右)的时候可能导致算法发散;当数据点数目改成100个时才能看到明显收敛现象(数据点数目,步长$\alpha$、迭代次数等相关量都对结果有影响。

%先随机产生样本,存在x和y中
x = rand(1,100);
y = 13 + 7*x;
m = 100;
alpha = 0.1;
n = 601; %迭代次数

%初始化theta向量和假设函数的句柄函数
theta0 = 0;
theta1 = 0;
h = @(x)(theta0 + theta1*x);

%开始迭代
for i = 1:n
    sum0 = 0;
    sum1 = 0;
    for j = 1:m
        sum0 = sum0 + h(x(j))-y(j);
        sum1 = sum1 + (h(x(j))-y(j))*x(j);
    end
    theta0 = theta0 - alpha*(1/m)*sum0;
    theta1 = theta1 - alpha*(1/m)*sum1;
    h = @(x)(theta0+theta1*x); %重置句柄假设函数
    if mod(i,20) == 0
        fprintf('(%d,%d)\n',theta0,theta1);
    end
end

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值