使用Octave \ MatLab的ML梯度下降成本函数的这种简单演算如何工作?

时间:2019-04-13 12:04:42

标签: matlab machine-learning octave linear-regression gradient-descent

我正在Coursera上学习机器学习课程,并且正在使用 Octave (MatLab应该是相同的)进行以下练习。

该练习与梯度下降算法的成本函数的计算有关。

在课程幻灯片中,我认为这是我必须使用Octave实现的成本函数:

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

enter image description here

因此,J是由THETA矩阵表示的某些THETA变量的函数(在前面的第二个等式中)。

这是用于J(THETA)计算的正确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

其中:

X 是2列的 m 行矩阵,其中第一列的所有元素均设置为值 1

X =

1.0000    6.1101
1.0000    5.5277
1.0000    8.5186
......    ......
......    ......
......    ......

y m 个元素(作为 X )的向量:

y =

   17.59200
    9.13020
   13.66200
   ........
   ........
   ........

最后一个 theta 是一个2列向量,具有0个这样的asvalue:

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

   0
   0

好,回到我的工作解决方案:

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

专门针对此矩阵乘法(矩阵 X 与矢量 theta 之间的乘法):我知道这是有效的矩阵乘法,因为< strong> X (2列)等于 theta (2行)的行数,因此它是完全有效的矩阵乘法。

让我发疯的疑问(可能是一个琐碎的疑问)与先前的课程幻灯片上下文有关:

enter image description here

正如您在用于计算当前 h_theta(x)的第二个方程式中所看到的,它使用的是转置的theta向量,而不是像代码。

为什么?!?!

我怀疑这仅取决于 theta 向量的创建方式。它是通过这种方式构建的:

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

生成2行1列向量,而不是经典的1行2列向量。所以也许我不必移调它。但是我绝对不确定这个说法。

我的直觉是正确的还是我想念的是什么?

1 个答案:

答案 0 :(得分:1)

您的直觉是正确的。实际上,以theta.' * XX.' * theta的形式进行乘法都没有关系,因为这会生成表示所有观测值的假设的水平向量或垂直向量,以及您期望执行的操作接下来是在每次观察时从假设向量中减去y向量,并对结果求和。因此,只要y与假设的方向相同,并且在每个等效点处减去,则求和的标量最终结果将相同。

通常,纯粹是为了方便起见,您会看到X.' * theta优于theta.' * X的版本,这是为了避免与数学符号保持一致而反复进行转置。但这很好,因为底层数学并没有真正改变,仅等效操作的顺序即可。

我同意这是令人困惑的,这不仅是因为当代码看起来像是在做其他事情时,它使遵循公式变得更加困难,而且因为它与垂直向量代表“坐标”的惯常惯例相混淆,并且水平向量代表观测值。在这种情况下,尤其是在诸如matlab / octave之类的语言中,矢量的方向未在变量的类型中明确定义时,记录期望输入表示的内容至关重要,而且最好是{{1代码中的}}语句确认输入已按正确的方向传递。显然,他们在这里感觉到没有必要,因为该代码无论如何都在预定义的锻炼环境中的受控条件下起作用,但是从软件工程的角度来看,这样做是一种好习惯。