吴恩达机器学习(一)批量梯度下降算法练习

吴恩达机器学习(一)批量梯度下降算法练习

  • 批量梯度学习算法理论推导
  • 实例
  • 总结

批量梯度学习算法理论推导

吴恩达机器学习课程的第一课中介绍了批量梯度下降算法,本节首先对该算法进行一定的数学推导。为便于分析,首先仅考虑一维的情况,涉及的公式符号与课程讲义一致。

m m m:训练集数量
x 1 ( i ) x^{(i)}_1 x1(i) :第 i i i个训练样本的输入
y ( i ) y^{(i)} y(i) :第 i i i个训练样本的输出
h ( x 1 ( i ) ) h(x^{(i)}_1) h(x1(i)):预测函数,定义为线性函数: h ( x 1 ( i ) ) = θ 0 + θ 1 x 1 ( i ) h(x^{(i)}_1)=\theta_0+\theta_1x^{(i)}_1 h(x1(i))=θ0+θ1x1(i)
如何评价一个预测函数的好坏呢?常用的办法是用以下目标函数来定义:
J ( θ 0 , θ 1 ) = 1 2 ∑ i = 1 m ( y ( i ) − h ( x 1 ( i ) ) ) 2 J(\theta_0,\theta_1) = \frac{1}{2}\sum_{i=1}^m(y^{(i)}-h(x^{(i)}_1))^2 J(θ0,θ1)=21i=1m(y(i)h(x1(i)))2
梯度下降算法的核心是下面这个式子:
θ j = θ j − α ∂ J ( θ 0 , θ 1 ) ∂ θ j j = 0 , 1 \theta_j = \theta_j-\alpha\frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_j}}\quad j=0,1 θj=θjαθjJ(θ0,θ1)j=0,1
α \alpha α表示学习速率,需要取一个小的正数,否则不收敛。
上式的难点在于求 ∂ J ( θ 0 , θ 1 ) ∂ θ j \frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_j}} θjJ(θ0,θ1)

  1. ∂ J ( θ 0 , θ 1 ) ∂ θ 0 \frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_0}} θ0J(θ0,θ1)
    ∂ J ( θ 0 , θ 1 ) ∂ θ 0 = ∂ ∂ θ 0 ( 1 2 ∑ i = 1 m ( y ( i ) − h ( x 1 ( i ) ) ) 2 ) = − ∑ i = 1 m ( y ( i ) − h ( x 1 ( i ) ) ) \frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_0}}=\frac{\partial}{\partial{\theta_0}}( \frac{1}{2}\sum_{i=1}^m(y^{(i)}-h(x^{(i)}_1))^2)=-\sum_{i=1}^m(y^{(i)}-h(x^{(i)}_1)) θ0J(θ0,θ1)=θ0(21i=1m(y(i)h(x1(i)))2)=i=1m(y(i)h(x1(i)))
  2. ∂ J ( θ 0 , θ 1 ) ∂ θ 1 \frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_1}} θ1J(θ0,θ1)
    ∂ J ( θ 0 , θ 1 ) ∂ θ 1 = ∂ ∂ θ 1 ( 1 2 ∑ i = 1 m ( y ( i ) − h ( x 1 ( i ) ) ) 2 ) = − ∑ i = 1 m ( y ( i ) − h ( x 1 ( i ) ) ) x 1 ( i ) \frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_1}}=\frac{\partial}{\partial{\theta_1}}( \frac{1}{2}\sum_{i=1}^m(y^{(i)}-h(x^{(i)}_1))^2)=-\sum_{i=1}^m(y^{(i)}-h(x^{(i)}_1))x^{(i)}_1 θ1J(θ0,θ1)=θ1(21i=1m(y(i)h(x1(i)))2)=i=1m(y(i)h(x1(i)))x1(i)
    h ( x ) h(x) h(x)代入上面的计算式中,即可得到结果,计算并不复杂。
    对上面的式子进行一定的推广,就能得到多维下的梯度下降算法,即:
    θ j : = θ j − α ( − ∑ i = 1 m ( y ( i ) − h ( x j ( i ) ) ) x j ( i ) ) \theta_j := \theta_j-\alpha(-\sum_{i=1}^m(y^{(i)}-h(x^{(i)}_j))x^{(i)}_j) θj:=θjα(i=1m(y(i)h(xj(i)))xj(i))
    辨别清楚 i i i j j j的含义,将求和符号展开,多维情况是一维情况的简单推广。

实例

数据来源https://blog.csdn.net/weixin_43084928/article/details/82529596

%% 批量梯度下降算法
% 作者:sddfsAv
% 日期:20190221
% Matlab版本:2018b
% 简介:吴恩达机器学习课程练习,数据集来源于https://blog.csdn.net/weixin_43084928/article/details/82529596
clear
clc

%% 导入原始数据
Data=csvread('Salary_Data.csv',1,0);    % 读取csv数据文件
scatter(Data(:,1),Data(:,2),40,'MarkerEdgeColor',[0 .5 .5],...
              'MarkerFaceColor',[0 .7 .7],...
              'LineWidth',1.5);         % 绘制散点图
title("Experience and Salary");         % 图表标题
xlabel("Experience(years)");            % x轴标题
ylabel("Salary(dollar)");               % y轴标题
hold on;
%% batch gradient descnt,
theta0=0;   % 赋予theta0初值
theta1=0;   % 赋予theta1初值
alpha=0.0005;  % 学习速率,过大会造成不收敛
theta=[theta0 theta1]';
for j=1:50000
    theta0=theta(1,j);
    theta1=theta(2,j);
    theta(1,j+1)=theta0-alpha*(-sum(Data(:,2)-(theta0+theta1*Data(:,1))));
    theta(2,j+1)=theta1-alpha*(-sum((Data(:,2)-(theta0+theta1*Data(:,1))).*Data(:,1)));
    if abs(theta(:,j+1)-theta(:,j))<1e-8
        break;
    end
end
plot(Data(:,1),theta0+theta1*Data(:,1))

在for循环的前两行就是梯度下降算法的核心。
算法迭代了7160次,拟合结果:
吴恩达机器学习(一)批量梯度下降算法练习_第1张图片
θ 0 \theta_0 θ0的变化情况
吴恩达机器学习(一)批量梯度下降算法练习_第2张图片
θ 1 \theta_1 θ1的变化情况
吴恩达机器学习(一)批量梯度下降算法练习_第3张图片
可以看到,大概在1500次左右, θ 0 \theta_0 θ0 θ 1 \theta_1 θ1的值基本就不再发生变化了。

总结

线性回归的例子还是比较简单易懂。

你可能感兴趣的:(机器学习)