我正在Coursera上学习机器学习课程,并且正在使用 Octave (MatLab应该是相同的)进行以下练习。
该练习与梯度下降算法的成本函数的计算有关。
在课程幻灯片中,我认为这是我必须使用Octave实现的成本函数:
这是课程幻灯片中的公式:
因此,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行)的行数,因此它是完全有效的矩阵乘法。
让我发疯的疑问(可能是一个琐碎的疑问)与先前的课程幻灯片上下文有关:
正如您在用于计算当前 h_theta(x)的第二个方程式中所看到的,它使用的是转置的theta向量,而不是像代码。
为什么?!?!
我怀疑这仅取决于 theta 向量的创建方式。它是通过这种方式构建的:
theta = zeros(2, 1); % initialize fitting parameters
生成2行1列向量,而不是经典的1行2列向量。所以也许我不必移调它。但是我绝对不确定这个说法。
我的直觉是正确的还是我想念的是什么?
答案 0 :(得分:1)
您的直觉是正确的。实际上,以theta.' * X
或X.' * theta
的形式进行乘法都没有关系,因为这会生成表示所有观测值的假设的水平向量或垂直向量,以及您期望执行的操作接下来是在每次观察时从假设向量中减去y
向量,并对结果求和。因此,只要y
与假设的方向相同,并且在每个等效点处减去,则求和的标量最终结果将相同。
通常,纯粹是为了方便起见,您会看到X.' * theta
优于theta.' * X
的版本,这是为了避免与数学符号保持一致而反复进行转置。但这很好,因为底层数学并没有真正改变,仅等效操作的顺序即可。
我同意这是令人困惑的,这不仅是因为当代码看起来像是在做其他事情时,它使遵循公式变得更加困难,而且因为它与垂直向量代表“坐标”的惯常惯例相混淆,并且水平向量代表观测值。在这种情况下,尤其是在诸如matlab / octave之类的语言中,矢量的方向未在变量的类型中明确定义时,记录期望输入表示的内容至关重要,而且最好是{{1代码中的}}语句确认输入已按正确的方向传递。显然,他们在这里感觉到没有必要,因为该代码无论如何都在预定义的锻炼环境中的受控条件下起作用,但是从软件工程的角度来看,这样做是一种好习惯。