代码之家  ›  专栏  ›  技术社区  ›  AndreaNobili

如何使用Octave\MatLab精确计算ML梯度下降代价函数的简单演算?

  •  0
  • AndreaNobili  · 技术社区  · 7 年前

    我在跟踪一个 我正在使用 倍频程 (MatLab应相同)。

    这个练习与计算一个项目的成本函数有关 梯度下降算法

    在课程幻灯片中,我知道这是我必须使用倍频程实现的成本函数:

    这是课程幻灯片中的公式:

    enter image description here

    所以J是θ矩阵表示的θ变量的函数(在前面的第二个方程中)。

    这是J(θ)计算的正确MatLab\Octave实现:

    function J = computeCost(X, y, theta)
    %COMPUTECOST Compute cost for linear regression
    %   J = COMPUTECOST(X, y, theta) computes the cost of using theta as the
    %   parameter for linear regression to fit the data points in X and y
    
    % Initialize some useful values
    m = length(y); % number of training examples
    
    % You need to return the following variables correctly 
    J = 0;
    
    % ====================== YOUR CODE HERE ======================
    % Instructions: Compute the cost of a particular choice of theta
    %               You should set J to the cost.
    
    J = (1/(2*m))*sum(((X*theta) - y).^2)
    
    % =========================================================================
    
    end
    

    哪里:

    是一个2列的矩阵 将第一列的所有元素都设置为值的行 1 :

    X =
    
    1.0000    6.1101
    1.0000    5.5277
    1.0000    8.5186
    ......    ......
    ......    ......
    ......    ......
    

    y 是一个向量 元素(如

    y =
    
       17.59200
        9.13020
       13.66200
       ........
       ........
       ........
    

    最后 θ 是一个2列向量,其值为0,如下所示:

    theta = zeros(2, 1); % initialize fitting parameters
    theta
    theta =
    
       0
       0
    

    好,回到我的工作方案:

    J = (1/(2*m))*sum(((X*theta) - y).^2)
    

    具体到这个矩阵乘法(矩阵之间的乘法 θ ):我知道这是一个有效的矩阵乘法,因为 (2列)等于 θ

    令我发疯的疑问(可能是一个微不足道的疑问)与上一张课程幻灯片的内容有关:

    enter image description here

    正如你在计算电流的第二个方程式中所看到的 它使用的值 而不是代码中的θ向量。

    为什么?

    我怀疑这只取决于 矢量。它是这样建造的:

    theta = zeros(2, 1); % initialize fitting parameters
    

    即生成一个2行1列向量,而不是一个经典的1行2列向量。所以也许我不必转置它。但我绝对不能肯定这个断言。

    我的直觉是正确的还是我遗漏了什么?

    0 回复  |  直到 7 年前
        1
  •  2
  •   Tasos Papastylianou    7 年前

    你的直觉是正确的。实际上,你是否按要求执行乘法并不重要 theta.' * X X.' * theta ,因为这要么产生一个水平向量,要么产生一个垂直向量,代表所有的观测值,接下来你要做的就是减去 y 从假设向量中得到每次观测向量,并对结果求和。所以只要 y 与你的假设方向相同,你在每个等价点上减去,那么求和的最终结果将是相同的。

    版本优先于 纯粹为了方便起见,避免反复换位只是为了与数学符号保持一致。但这很好,因为基本的数学并没有真正改变,只有等价运算的顺序。

    我同意这是令人困惑的,因为当代码看起来像是在做其他事情时,很难遵循公式,也因为它破坏了通常的惯例,垂直向量表示“坐标”,水平向量表示观察值。在这种情况下,尤其是在像matlab/octave这样的语言中,在变量的类型中没有明确定义向量的方向,记录您期望输入表示什么是非常重要的,最好是应该有 assert