zoukankan      html  css  js  c++  java
  • 机器学习(Machine Learning)- 吴恩达(Andrew Ng) 学习笔记(五)

    Octave Tutorial

    Basic Operations 基本操作

    基本操作

    1. 基本运算:+、-、*、/、^(指数)
    2. 逻辑运算:==、~=、&&、||、xor(a, b),0为False、1为True
    3. 注释:%注释内容
    4. 等待命令样式可使用PS1命令更改:PS1('>>')

    变量

    1. 赋值:变量名 = 内容(数字、字符串、布尔值…)
      在赋值语句后加上;语句执行完后不会输出结果。

    2. 查看变量:输入变量名或者使用语句disp(变量名)

    3. format的用法:

      format long:输出字符串的默认的位数。

      format short: 输出少量小数点后位数。

    4. 格式化输出:用类似C语言风格的格式化字符串来控制打印结果。disp(sprintf('%.6f', tem))

    向量与矩阵

    直接创建

    A = [1 2; 3 4; 5 6] %三行两列
    B = [1 2;
    3 4;
    5 6]  %三行两列
    V1 = [1 2 3] %一行三列
    V2 = [1; 2; 3] %三行一列
    

    使用增量

    V3 = 1:0.1:2 %一个从0开始,增量为0.1,到2为止的行向量
    V4 = 1:6 %不写增量,默认为1
    

    使用内置函数

    ones(n, m) %生成一个元素全为1的n行m列的矩阵
    zeros(n, m) %生成一个元素全为0的n行m列的矩阵
    eye(n) %生成一个n阶单位矩阵
    rand(n, m) %生成一个元素符合高斯分布的n行m列矩阵
    

    使用直方图演示高斯分布。

    W = rand(1, 10000)
    hist(W)
    hist(W, 50)
    

    查看帮助

    使用方法:help 方法名

    help eye
    help help
    

    退出命令

    quitexit

    Moving Data Around

    如果你有一个机器学习问题,你怎样把数据加载到Octave中?怎样把数据存入一个矩阵?如何对矩阵进行相乘?如何保存计算结果?如何移动这些数据并用数据进行操作?

    矩阵大小

    size():返回矩阵的行数和列数

    A = [1 2; 3 4; 5 6]
    sz = size(A) %3 2
    size(sz) %1 2
    

    length():返回矩阵最大维度的大小

    V = [1 2 3 4]
    length(V) %4
    length(A) %3
    length([1;2;3;4;5]) %5
    

    Octave路径

    pwd %查看当前所处路径
    cd 'C:UsersaDesktop' %更改路径
    

    载入数据

    load featuresX.dat
    load ('featuresX.dat') %效果同上
    load priceY.dat
    

    查看&删除

    who %显示出当前Octave存储的变量
    whos %更详细的查看Octave存储的变量的内容
    clear featuresX %删除变量featuresX
    clear all %删除所有变量
    

    储存矩阵

    v = priceY(1:10) %截取矩阵
    save hello.mat v %按照二进制(或者说是更压缩的二进制)形式存储
    save hello.txt v -ascii %存为一个文档
    

    矩阵进阶操作

    索引

    A = [1 2;3 4; 5 6]
    A(3, 2) %返回A_32
    A(2,:) %返回第二行所有元素
    A(:,2) %返回第二列所有元素
    A([1, 3], :) %返回第一、三行所有元素
    A(:) %将A中所有元素按照一列输出
    

    修改值/增广

    A(:,2) = [10; 11; 12] %更改第二列元素的值
    A = [A, [101; 102; 102]] %在原有基础上增加一列
    

    矩阵间操作

    A = [1 2; 3 4; 5 6]
    B = [11 12; 13 14; 15 16]
    C = [A B] %形成A左B右的新矩阵
    C = [A, B] %同上
    C = [A, B] %形成A上B下的新矩阵
    

    Computing on Data 对数据的运算

    A = [1 2; 3 4; 5 6]
    B = [11 12; 13 14; 15 16]
    C = [1 1; 2 2]
    V = [1; 2; 3]
    

    矩阵相乘

    A * C %矩阵乘法
    

    矩阵中元素的运算

    A .* B %A中的每个元素与B中对应元素相乘
    A .^ 2 %A中的每个元素的平方
    1 ./ A %A中每个元素的倒数
    

    内置函数

    log()
    exp()
    abs()
    floor()
    ceil()
    

    加法

    V + ones(length(V), 1)
    V + 1 %功能同上
    

    转置

    A'
    (A')' %A
    

    求最大值

    a = [1 15 2 0.5]
    val = max(a) %返回最大值
    [val, ind] = max(a) %返回最大值及最大值的位置
    max(A) %返回每一列的最大值
    
    D = magic(3)
    max(D,[],1) %求D中每一列的最大值
    max(D,[],2) %求D中每一行的最大值
    

    比较

    a < 3 %返回每个值与3比较的结果
    find(a < 3) %返回<3的值的元素下标
    [r, c] = find(A >= 4) %返回值>=4的元素的位置
    

    求和求积

    sum(a) %a中元素求和
    prod(a) %a中元素求积(仅适用于一行或一列的矩阵)
    sum(A) %A中每一列元素求和
    
    D = magic(9)
    sum(D,1) %D中每一列的和
    sum(D,2) %D中每一行的和
    
    %求对角线元素的和
    E = eye(9) %构造一个9阶单位矩阵
    D .* E %保留对角线元素
    sum(ans(:)) %求对角线元素的和
    
    %求副对角线元素的和
    P = flipud(E) %9阶反对交矩阵
    D .* P %保留副对角线元素
    sum(ans(:)) %求副对角线元素的和
    

    矩阵求逆

    pinv(A) 对矩阵A求逆

    magic()

    magic(n)会生成一个所有行和列加起来都等于相同的值的n阶方阵。

    rand()

    rand(n)会生成一个n阶矩阵,矩阵中的每个元素大小都在0~1之间。

    Plotting Data 绘制数据

    绘制图线

    t = [0 : 0.01 : 0.98]
    y1 = sin(2 * pi * 4 * t)
    plot(t, y1)
    y2 = cos(2 * pi * 4 * t) ;
    plot(t, y2)
    

    同时绘制两个曲线

    plot(t, y1)
    hold on
    plot(t, y2, 'r')
    

    添加其他信息

    xlabel('time')
    ylabel('value')
    legend('sin','cos') %曲线说明
    title('my plot')
    

    保存图像

    print -dpng 'myPlot.png'
    

    清除/关闭图像

    clf %清除图像内容
    close %关闭打开的图像
    

    同时绘制两幅图

    figure 1; plot(t, y1)
    figure 2; plot(t, y2)
    

    在一个绘画框内绘制两幅图

    subplot(1, 2, 1)
    plot(t, y1)
    subplot(1, 2, 2)
    plot(t, y2)
    axis([0.5 1 -1 1]) %修改x轴和y轴的范围
    

    矩阵可视化

    imagesc(A) %生成的图像中不同颜色代表不同数值
    
    imagesc(A), colorbar, colormap gray; %生成一个灰度分布图
    imagesc(magic(15)), colorbar, colormap gray;
    

    Control Statements 控制语句

    for

    V = zeros(10, 1) %初始化
    for i = 1:10
      V(i) = 2 ^ i;
    end;
    disp(V) %V[i]成为了2的i次方
    
    indices = 1:10
    for i = indices %i:1->10
      disp(i)
    end
    

    while

    i = 1
    while i <= 5
      V(i) = 100;
      i += 1;
    end
    

    break

    i = 1;
    while true,
      V(i) = 999;
      i += 1;
      if i == 6,
        break;
      end;
    end;
    

    if else

    V(1) = 2
    if V(1) == 1.
      disp('The value is one');
    elseif V(1) == 2,
      disp('The value is two');
    else
      disp('The value is not one or two');
    end;
    

    函数

    1. 在对应路径下定义一个函数名.m的文件,文件内容是函数功能。如squareThisNumber.m,文件内容:

      function y = squareThisNumber(x)
      
      y = x^2;
      

      运行函数及结果:

      squareThisNumber(5)
      ans =  25
      
    2. 函数可有多个返回值

      squareAndCubeThisNumber.m文件内容:

      function [y1, y2] = squareAndCubeThisNumber(x)
      
      y1 = x^2;
      y2 = x^3;
      

      运行函数及结果:

      [a, b] = squareAndCubeThisNumber(3)
      a =  9
      b =  27
      

    尝试编写代价函数

    costFunctionJ.m文件内容:

    function J = costFunctionJ(X, y, theta)
    
    % X is the "design matrix" containing our training examples.
    % y is the class labels
    
    m = size(X, 1); %number of training examples
    predictions = X * theta; %predictions of hypothesis on all m examples
    sqrErrors = (predictions - y) .^ 2; % squared errors
    
    J = 1 / (2 * m) * sum(sqrErrors);
    

    找组样例试试:

    X = [1 1; 1 2; 1 3];
    y = [1; 2; 3]
    theta = [0; 1];
    j = costFunctionJ(X, y, theta)
    

    另一组样例:

    X = [1 1; 1 2; 1 3];
    y = [1; 2; 3]
    theta = [0; 0];
    j = costFunctionJ(X, y, theta)
    

    Vectorization 向量化

    Vectorization example

    (h_ heta(x) = sum_{j = 0}^{n} heta_jx_j)

    Unvectorized implemention

    prediction = 0.0
    for j = 1 : n+1,
      prediction = prediction + theta(j) * x(j)
    end;
    

    上式 = ( heta^Tx)

    Vectorized implementation

    prediction = theta' * x
    

    Gradient descent

    梯度下降算法公式:

    [ heta_j := heta_j - alphafrac{1}{m}sum_{i = 1}^m(h_ heta(x^{(i)}) - y^{(i)})x_j^{(i)} ]

    n = 3时的情况:

    [left{ egin{aligned} heta_0 := heta_0 - alphafrac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})x_0^{(i)} \ heta_1 := heta_1 - alphafrac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})x_1^{(i)} \ heta_2 := heta_2 - alphafrac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})x_2^{(i)} end{aligned} ight. ag1 ]

    将上式向量化后的结果为:

    [ heta := heta - alphadelta ag2 ]

    上式中( heta、delta)都为向量,(alpha)是实数,其中

    [delta = frac{1}{m}sum_{i=1}^m(h_ heta(x^{(i)}) - y^{(i)})X^{(i)} ag3 ]

    推导一下:

    一、将公式(1)进行整体向量化操作:

    [egin{pmatrix} heta _0 \ heta_1 \ heta_2 end{pmatrix} := egin{pmatrix} heta_0 - alpha frac{1}{m} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_0^{(i)} \ heta_1 - alpha frac{1}{m} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_1^{(i)} \ heta_2 - alpha frac{1}{m} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_2^{(i)} end{pmatrix} ]

    二、拆分、提取公因式:

    [egin{pmatrix} heta _0 \ heta_1 \ heta_2 end{pmatrix} := egin{pmatrix} heta _0 \ heta_1 \ heta_2 end{pmatrix} - alpha frac{1}{m} egin{pmatrix} sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_0^{(i)} \ sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_1^{(i)} \ sum_{i=1}^{m} (h_ heta (x^{(i)}) - y^{(i)})x_2^{(i)} end{pmatrix} ]

    三、将后一个矩阵展开:

    [ heta := heta - alpha frac{1}{m} egin{pmatrix} (h_ heta (x^{(1)}) - y^{(1)})x_0^{(1)} + (h_ heta (x^{(2)}) - y^{(2)})x_0^{(2)} + ldots + (h_ heta (x^{(m)}) - y^{(m)})x_0^{(m)} \ (h_ heta (x^{(1)}) - y^{(1)})x_1^{(1)} + (h_ heta (x^{(2)}) - y^{(2)})x_1^{(2)} + ldots + (h_ heta (x^{(m)}) - y^{(m)})x_1^{(m)} \ (h_ heta (x^{(1)}) - y^{(1)})x_2^{(1)} + (h_ heta (x^{(2)}) - y^{(2)})x_2^{(2)} + ldots + (h_ heta (x^{(m)}) - y^{(m)})x_2^{(m)} end{pmatrix} ]

    四、展开后的矩阵拆分:

    [ heta := heta - alpha frac{1}{m} left[ egin{pmatrix} (h_ heta (x^{(1)}) - y^{(1)})x_0^{(1)} \ (h_ heta (x^{(1)}) - y^{(1)})x_1^{(1)} \ (h_ heta (x^{(1)}) - y^{(1)})x_2^{(1)} end{pmatrix} + egin{pmatrix} (h_ heta (x^{(2)}) - y^{(2)})x_0^{(2)} \ (h_ heta (x^{(2)}) - y^{(2)})x_1^{(2)} \ (h_ heta (x^{(2)}) - y^{(2)})x_2^{(2)} end{pmatrix} + ldots + egin{pmatrix} (h_ heta (x^{(m)}) - y^{(m)})x_0^{(m)} \ (h_ heta (x^{(m)}) - y^{(m)})x_1^{(m)} \ (h_ heta (x^{(m)}) - y^{(m)})x_2^{(m)} end{pmatrix} ight] ]

    五、提取公因式:

    [ heta := heta - alpha frac{1}{m} left[ left( h_ heta (x^{(1)}) - y^{(1)} ight) egin{pmatrix} x_0^{(1)} \ x_1^{(1)} \ x_2^{(1)} end{pmatrix} + left( h_ heta (x^{(2)}) - y^{(2)} ight) egin{pmatrix} x_0^{(2)} \ x_1^{(2)} \ x_2^{(2)} end{pmatrix} + ldots + left( h_ heta (x^{(m)}) - y^{(m)} ight) egin{pmatrix} x_0^{(m)} \ x_1^{(m)} \ x_2^{(m)} end{pmatrix} ight] ]

    六、将(x)写为向量形式:

    [ heta := heta - alpha frac{1}{m} left[ left( h_ heta (x^{(1)}) - y^{(1)} ight) X^{(1)} + left( h_ heta (x^{(2)}) - y^{(2)} ight) X^{(2)} + ldots + left( h_ heta (x^{(m)}) - y^{(m)} ight) X^{(m)} ight] ]

    七、写成求和形式:

    [ heta := heta - alpha frac{1}{m} sum_{i=1}^m(h_ heta (x^{(i)}) - y^{(i)})X^i ]

    推导完毕。

    Review

    编程作业

    1. warmUpExercise.m

      A = eye(5);
      
    2. plotData.m

      plot(x, y, 'rx', 'MarkerSize', 10);
      ylabel('Profit in $10,000s');
      xlabel('Population of Coty in 10,000s');
      
    3. computeCost.m

      predictions = X * theta;
      sqrErrors = (predictions - y) .^ 2;
      J = 1 / (2 * m) * sum(sqrErrors);
      
    4. gradientDescent.m

      delta = 1 / m * X' * (X * theta - y);
      theta = theta - alpha * delta;
      
  • 相关阅读:
    C++标准库vector以及迭代器
    (转)单链表的逆置
    (六)通过solr7的API实现商品的列表查询
    (八)solr7实现搜索框的自动提示并统计词频
    (四)DIH导入结构化数据
    (三)Solrj4到Solrj5的升级之路
    easyui validatebox 验证类型
    一、docker临时记录
    vip视频网站爬虫
    Intellij IDEA 4种配置热部署的方法
  • 原文地址:https://www.cnblogs.com/songjy11611/p/12195521.html
Copyright © 2011-2022 走看看