zoukankan      html  css  js  c++  java
  • deep learning 学习笔记(三) 线性回归学习速率优化寻找

    继续学习http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html,上一节课学习速率是固定的,而这里我们的目的是找到一个比较好的学习速率。我们主要是观察 不同的学习速率对应的不同的损失值与迭代次数之间的函数曲线是怎么样的,找到那条最快达到收敛的函数曲线,其对应的学习速率就是我们要找的比较好的学习速率。在这里我们分别取速率值为:0.001,0.01,0.1,1,2,当我们选择完学习速率后,其余的都跟上一节课一样了。本文要解决的问题是给出了47个训练样本,训练样本的y值为房子的价格,x属性有2个,一个是房子的大小,另一个是房子卧室的个数。需要通过这些训练数据来学习系统的函数,从而预测房子大小为1650,且卧室有3个的房子的价格。

    代码如下:

    x = load('ex3x.dat');
    y = load('ex3y.dat');
    
    x = [ones(size(x,1),1) x];%每一行是一个样本,在这里每个样本增加一维1,原因在前面课说了(讲wx+b变成w'x齐次的)
    meanx = mean(x);%求均值           接下来四行是让样本的每一维度(除第一维1外)的值标准化。
    sigmax = std(x);%求标准偏差        但是前面不是说线性的不用进行feature scale吗(第一课讲的)
    x(:,2) = (x(:,2)-meanx(2))./sigmax(2);
    x(:,3) = (x(:,3)-meanx(3))./sigmax(3); 
    
    figure
    itera_num = 100; %尝试的迭代次数
    sample_num = size(x,1); %训练样本的个数
    alpha = [0.01, 0.03, 0.1, 0.3, 1, 1.3];%因为差不多是选取每个3倍的学习率来测试,所以直接枚举出来
    plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'};%建了一个包,每一个值代表画出的曲线样式不同,b是blue蓝色,
    %r是red ,g是green..b--是blue颜色--代表的是虚线,而前面那些不加的是实现。
    
    theta_grad_descent = zeros(size(x(1,:)));
    for alpha_i = 1:length(alpha) %alpha_i是1,2,...6,表示的是学习速率向量和曲线格式向量的坐标:alpha(alpha_i),plotstyle(alpha_i)
        theta = zeros(size(x,2),1); %theta是cost function的参数,初始值赋值为0向量(3*1的向量,x有几维theta就是几维的参数向量)
        Jtheta = zeros(itera_num, 1);%Jthete是个100*1的向量,第n个元素代表第n次迭代cost function的值(预测与真实y的总均方误差)
        for i = 1:itera_num %计算出某个学习速率alpha下迭代itera_num次数后的参数       
            Jtheta(i) = (1/(2*sample_num)).*(x*theta-y)'*(x*theta-y);%Jtheta是个100*1的列向量。(x*theta-y)'*(x*theta-y)代表的就是
            %cost function 公式的那个平方,因为在向量水平上平方没有直接平方,所以就是这种转置后内积的形式。并且得到的是
            %一个标量,所以再与前面的系数相乘可以直接用*,而不用.*  还有一点是前面的系数 我还是不明白为什么
            %是(1/(2*sample_num))
            grad = (1/sample_num).*x'*(x*theta-y);
            theta = theta - alpha(alpha_i).*grad;
        end
        plot(0:49, Jtheta(1:50),char(plotstyle(alpha_i)),'LineWidth', 2)%此处一定要通过char函数来转换因为包用()索引后得到的还是包cell,
        %所以才要用char函数转换,也可以用{}索引,这样就不用转换了。
        %一个学习速率对应的图像画出来以后再画出下一个学习速率对应的图像。    
        hold on
        if(1 == alpha(alpha_i)) %通过实验发现alpha为1时效果最好,则此时的迭代后的theta值为所求的值
            theta_grad_descent = theta
        end
    end
    legend('0.01','0.03','0.1','0.3','1','1.3');
    xlabel('Number of iterations')
    ylabel('Cost function')
    
    %下面是预测公式
    price_grad_descend = theta_grad_descent'*[1 (1650-meanx(2))/sigmax(2) (3-meanx(3)/sigmax(3))]'

    实验结果:

    15205243-e4aa2d2202874f9fb75383a73df7d4b6

  • 相关阅读:
    Mysql学习笔记(十四)备份与恢复
    Mysql学习笔记(十三)权限管理
    docker容器持久化卷讲解
    logstash关于date时间处理的几种方式总结
    ELK收集tomcat状态日志
    ELK收集tomcat访问日志并存取mysql数据库案例
    利用fpm制作rpm包
    Elasticsearch一些常用操作和一些基础概念
    Linux Cluster
    LNMP下动静分离部署phpmyadmin软件包
  • 原文地址:https://www.cnblogs.com/happylion/p/4164584.html
Copyright © 2011-2022 走看看