吴恩达机器学习(一)批量梯度下降算法练习
批量梯度学习算法理论推导
吴恩达机器学习课程的第一课中介绍了批量梯度下降算法,本节首先对该算法进行一定的数学推导。为便于分析,首先仅考虑一维的情况,涉及的公式符号与课程讲义一致。
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=1∑m(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−α∂θj∂J(θ0,θ1)j=0,1
α
\alpha
α表示学习速率,需要取一个小的正数,否则不收敛。
上式的难点在于求
∂
J
(
θ
0
,
θ
1
)
∂
θ
j
\frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_j}}
∂θj∂J(θ0,θ1)。
-
∂
J
(
θ
0
,
θ
1
)
∂
θ
0
\frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_0}}
∂θ0∂J(θ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)) ∂θ0∂J(θ0,θ1)=∂θ0∂(21i=1∑m(y(i)−h(x1(i)))2)=−i=1∑m(y(i)−h(x1(i))) -
∂
J
(
θ
0
,
θ
1
)
∂
θ
1
\frac{\partial{J(\theta_0,\theta_1) }}{\partial{\theta_1}}
∂θ1∂J(θ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 ∂θ1∂J(θ0,θ1)=∂θ1∂(21i=1∑m(y(i)−h(x1(i)))2)=−i=1∑m(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=1∑m(y(i)−h(xj(i)))xj(i))
辨别清楚 i i i和 j j j的含义,将求和符号展开,多维情况是一维情况的简单推广。
实例
数据来源https://blog.youkuaiyun.com/weixin_43084928/article/details/82529596
%% 批量梯度下降算法
% 作者:sddfsAv
% 日期:20190221
% Matlab版本:2018b
% 简介:吴恩达机器学习课程练习,数据集来源于https://blog.youkuaiyun.com/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次,拟合结果:
θ
0
\theta_0
θ0的变化情况
θ
1
\theta_1
θ1的变化情况
可以看到,大概在1500次左右,
θ
0
\theta_0
θ0和
θ
1
\theta_1
θ1的值基本就不再发生变化了。
总结
线性回归的例子还是比较简单易懂。