线性回归——梯度下降法_实例

  上篇文章介绍了梯度下降法在线性回归中的相关理论与证明,这里使用程序实例代码方式看梯度下降法是怎样一步一步下降求出最优解的;

X = [1 4;2 5;5 1;4 2];
y = [19;26;19;20]; 

m = length(y);
alpha = 0.002;   %步长
num_iters = 200;

% Init Theta
theta = zeros(2, 1);

% 数据集大小
m = length(y);  
% 损失函数记录
J_history = zeros(num_iters, 1);

for iter = 1:num_iters   

   h= zeros(m,1);
   h = X*theta;     

   J_history(iter) = (1/(2*m))*sum((h-y).^2);    %计算每次迭代的损失

   tmp1 = zeros(size(X,2),1); 
   for i=1:m
      tmp1= tmp1+(h(i)-y(i)).*X(i,:)';        %等同于公式中累加中的计算结果
   end; 
   theta = theta - (alpha/m)*tmp1;            %每次迭代计算theta的值
   %disp(J_history(iter));
   %disp(theta);
end;

% 绘制图形
figure;
plot(1:numel(J_history), J_history, '-b', 'LineWidth', 2);       %绘制迭代次数于损失值关系图
xlabel('Number of iterations');
ylabel('Cost J');

numel(J_history);

fprintf('Theta computed from gradient descent: \n');
fprintf(' %f \n', theta);
fprintf('\n');


expect = 0;  
X_p=[4 2];     %预测

expect = theta'*X_p';   %预测结果

Expect

enter image description here

  X坐标为迭代次数,Y坐标为损失函数的值,从图中可以看到损失函数下降得很块几乎时线性的,在迭代大约60次的时候损失值已经接近0;这里说的是批量梯度下降法所以数据集有多大也就迭代了多少次;如果数据比较大还是会影响性能,下次有机会再讲讲随机梯度下降法;

线性回归——梯度下降法

  前面的文章讲了使用最小二乘法来求线性回归损失函数的最优解,最小二乘法为直接对梯度求导找出极值,为非迭代法;而本篇文章了使用一个新的方法来求损失函数的极值:梯度下降法(Gradient Descendent, GD),梯度下降法为最优化算法通常用于求解函数的极值,梯度下降法为迭代法,给定一个β在梯度下降最快方向调整β,经过N次迭代后找到极值,也就是局部最小值或全局最小值
  梯度下降法又分为批量梯度下降法随机梯度下降法,通常随机梯度下降法性能会好点;不过我们这里讲的为批量梯度下降法;

梯度

  梯度为微积分中的概念,梯度所指方向为方向导数最大的量,梯度指出了全局或局部范围内哪个方向函数增长最快,可用于求函数极大值或极小值
  梯度求法为:对函数每个自变量求偏导数,将该偏导数作为其自变量方向的坐标;
▽表示梯度
  例如:函数enter image description here的梯度为:

  enter image description here

梯度下降法

  下面先通过一个简单的示例来了解梯度下降法的使用,我们使用梯度下降法来求enter image description here的极小值:

  enter image description here
  enter image description here

  enter image description here
        函数的图形

  当X=3为时f(x)=27,关于X的偏导数值为27也就是梯度为27;当X沿着+27方向变化f(X)将会增大,如X沿着相反方向也就是-27方向变化f(X)值将会减小,即增大时为梯度上升,减少为梯度下降;我们可以通过这种方式来求f(X)的极小值与极大值,求极小值的方法也称为梯度下降法;
  已上述enter image description here为例,使用梯度下降法求极小值;选择一个自变量初始点(种子点),计算该梯度值,然后自变量沿着梯度相反方向下降(负方向),下降步长通常根据经验值指定,用α表示;通过以下几点来判断是否已经找到极小值:

  1、达到指定迭代次数
  2、当前的函数值大于上次函数值
  3、函数值非常接近于0

  enter image description here梯度为enter image description here,初始点选择3,步长设置为:0.1
  迭代方式为:enter image description here,i为迭代的次数;
  迭代过程:

x = 3,梯度为:27,降下方向为-27方向  
x = 3-0.1*27=0.3,梯度为:3*0.3^2=0.27  
x = 0.3-0.1*0.27=0.273,梯度为:3*0.273^2=0.223587  
x = 0.273-0.1*0.223587= 0.2506413,梯度为:3*0.2506413^2=0.18846318379707  
x = 0.2506413-0.1*0.18846318= 0.23179498,梯度为:3*0.231794982^2=0.1611867410  

  迭代了五次,假设最大迭代次数为5,已经求出极小值;为当x=0.23179498时,函数enter image description here的极小值为:0.01245409225705;

线性回归

  上篇文章中说过,拟合函数为:enter image description here 线性回归的损失函数为:

  enter image description here
  enter image description here

  损失函数关于W的偏导数为:
   enter image description here
  则有:

  enter image description here

  N为数据集的大小,w , x , y 为向量;

  enter image description here
  enter image description here
  enter image description here
  enter image description here

  w向量中每个标量的偏导数为:

  enter image description here
  enter image description here
  enter image description here

  设α为步长,求w的迭代公式为:

  enter image description here

参考资料:
http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6
a first course in machine learning