• 深度学习——练习


    对于深度学习的基础,线性回归以及逻辑回归,下面针对这两个方面做一个练习。

    例子主要参考http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=DeepLearning

    一、线性回归

    下载数据http://openclassroom.stanford.edu/MainFolder/courses/DeepLearning/exercises/ex2materials/ex2Data.zip

    数据中给出了2-8岁小孩的升高数据,y中代表的是测量的升高(米),x对应的年龄

    这样每一个对应的(x,y)构成一个训练集,在这个数据中共有50个训练集,我们的目标就是利用这50个数据构建线性模型。

    解决这个问题我们使用梯度下降法,这个在前面已经有介绍。

    初始准备:

    1、导入数据

    x = load('ex2x.dat');

    y = load('ex2y.dat');

    这个问题的输入变量就只有年龄,也就是这个问题是一个一维线性问题,具体的表达h=ax+b,规范化了也就是为下面可以方便的转向量矩阵计算表达式如下:

    clip_image002[5]

    这里clip_image004

    这样,上述表达式可以写成clip_image006,这里的x为clip_image008

    为了形象性的了解整个数据的分别,将怎么数据的分别画出来,

    clip_image009

    在解决这个问题之前,我们先把所有样本计算模型时的clip_image011设为1,具体操作如下:

    m = length(y);

    x = [ones(m,1),x];

    具体解决过程

    下面针对这个问题实现线性回归。线性回归的模型:

    clip_image012

    批量梯度下降迭代规则是:

    clip_image013

    在我们目前这个问题当中,j=0或者1,theta的初始值为0,即clip_image014clip_image015

    在这里我们对于学习率clip_image016,在Matlab中,索引是从1开始的,因此我们写的时候要通过theta(1) and theta(2) 来代表clip_image017clip_image018.

    重复上述迭代规则,直到收敛,这样最终求得的 clip_image017[1]clip_image018[1]就是我们要求得的值,这边迭代次数设为1500。

    这边说一下代价函数:

    clip_image019

    前面加了1/2为了方便计算,便于求导.通过对代价函数求到计算梯度,得到上述过程。

    具体代码:

    >> theta = zeros(size(x(1,:)))';
    
    >> theta
    
    theta =
    
    0
    
    0
    
    >> MAX_ITR = 1500;
    
    >> alpha = 0.07;
    
    >> for num_iterations = 1:MAX_ITR
    
    grad = (1/m).* x' * ((x * theta) - y);
    
    theta = theta - alpha .* grad;
    
    end
    
    >> theta
    
    theta =
    
    0.7502
    
    0.0639
    
    >> plot(x(:,2),y,'o');
    
    >> hold on
    
    >> plot(x(:,2), x*theta, '-')
    
    >> legend('Training data', 'Linear regression')
    

    最终结果如下图:

    clip_image020

    最后根据得到的模型来预测3.5岁和7岁小孩的身高,则代码如下:

    >> predict1 = [1,3.5] * theta

    predict1 =

    0.9737

    >> predict2 = [1, 7] * theta

    predict2 =

    1.1973

    为了更形象的理解整个线性回归,对代价函数进行可视化分析,具体代码如下:

    >> J_vals = zeros(100, 100); % initialize Jvals to 100x100 matrix of 0's
    
    >> theta0_vals = linspace(-3, 3, 100);
    
    >> theta1_vals = linspace(-1, 1, 100);
    
    >> for i = 1:length(theta0_vals)
    
    for j = 1:length(theta1_vals)
    
    t = [theta0_vals(i); theta1_vals(j)];
    
    J_vals(i,j) = (0.5/m) .* (x * t - y)' * (x * t - y);
    
    end
    
    end
    
    >> J_vals = J_vals';
    
    >>figure;
    
    >> surf(theta0_vals, theta1_vals, J_vals);
    
    >>xlabel('	heta_0');
    
    >> ylabel('	heta_1')
    

    得到如下图:

    clip_image021

    通过这个图,我们可以看出最小J值得时候,theta0跟theta1的大小。

    另外我们可以绘制等高线,通过等高线也可以很好的理解一下。

    具体效果如下图:

    clip_image022

    具体代码:

    contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 2, 15))

    xlabel(' heta_0'); ylabel(' heta_1')

    等高线不好理解的话,可以考虑一个简单的圆的方程,令半径从1开始慢慢变大,可以画出类似等高线,这样就可以清楚越往中间,代价函数值越小。

    这样基本的线性回归就解决了。下面开始学习多变量的线性回归。

  • 相关阅读:
    典型的 C++ 程序员成长经历
    C语言中的常用文件操作
    sscanf与正则表达式
    黑莓8700 常用快捷键
    [分享]《张靓颖个人资源汇集.九月二日更新》
    [分享]【★超级女声★】【★张靓颖★】【推荐】
    [原创]根据TreeView中节点的不同,来绑定不同的dropdownlist
    [转贴]用Vs.net制作安装程序,在安装包中自动为客户创建数据库
    [转贴]在Asp.Net中的几种事务处理的方法
    冻结DataGrid中的列的比较简单的实现方法!
  • 原文地址:https://www.cnblogs.com/fengbing/p/3716621.html
Copyright © 2020-2023  润新知