我正在学习一门机器学习课程,并且我正在使用Octave (MatLab应该是相同的)做下面的练习。
该练习与计算梯度下降algoritm的成本函数有关。
在课程幻灯片中,我知道这是我必须使用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是m行的2列矩阵,其第一列的所有元素都设置为值1。
X =
1.0000 6.1101
1.0000 5.5277
1.0000 8.5186
...... ......
...... ......
...... ......y是m元素(作为X)的向量:
y =
17.59200
9.13020
13.66200
........
........
........Finnally theta是一个2列向量,其值为0,如下所示:
theta = zeros(2, 1); % initialize fitting parameters
theta
theta =
0
0好的,回到我的工作解决方案:
J = (1/(2*m))*sum(((X*theta) - y).^2)具体到这个矩阵乘法(矩阵X和向量theta之间的乘法):我知道它是一个有效的矩阵乘法,因为X (2列)的列数等于θ (2行)的行数,所以它是一个完全有效的矩阵乘法。
我的怀疑让我抓狂(可能是一个微不足道的疑问)与以前的课程幻灯片上下文有关:

正如您在用于计算当前h_theta(x)值的第二个方程中所看到的那样,它使用的是转置的θ向量,而不是代码中所做的θ向量。
为什么?!
我怀疑这仅仅取决于如何创建θ向量。它是以这种方式建造的:
theta = zeros(2, 1); % initialize fitting parameters这意味着生成一个2行1列向量,而不是传统的1行2列向量。所以也许我不用把它转过来。但我完全不确定这一说法。
我的直觉是正确的还是我错过了什么?
发布于 2019-04-13 20:43:32
你的直觉是正确的。实际上,作为theta.' * X或X.' * theta执行乘法并不重要,因为这要么生成一个水平向量,要么生成一个代表所有观测的假设垂直向量,接下来您要做的是从每个观测的假设向量中减去y向量,并对结果进行求和。因此,只要y和你的假设有相同的方向,并且你在每个等价点减去,那么和的标量结果就会是一样的。
通常,您会看到X.' * theta版本比theta.' * X更受欢迎,这纯粹是为了方便起见,以避免一次又一次的转换,只是为了与数学表示法保持一致。但这是很好的,因为基本的数学并没有真正改变,只有等价操作的顺序。
我同意这很让人困惑,这是因为当代码看起来像在做其他事情时,就很难遵循公式,也因为它扰乱了通常的惯例,即垂直向量表示“坐标”,而水平向量表示观察。在这种情况下,特别是在像matlab / octave这样的语言中,在变量的类型中没有显式地定义向量的方向,记录您期望输入所表示的内容是双重重要的,最好在代码中应该有assert语句来确认输入是以正确的方向传递的。显然,这里他们认为这是不必要的,因为这段代码无论如何都是在预定义的练习环境中在受控条件下工作的,但是从软件工程的角度来看,这样做是很好的做法。
https://stackoverflow.com/questions/55665231
复制相似问题