[英]Why theta*X not theta'*X in practical?
在 Andrew Ng 对 ML 进行 MOOC 时,他在理论上解释了theta'*X
给了我们假设,而在做课程时我们使用theta*X
。 为什么会这样?
theta'*X用于计算X 为向量时单个训练示例的假设。 然后你必须计算theta'以获得 h(x) 定义。
在实践中,由于您有多个训练示例,因此X 是一个矩阵(您的训练集),其维度为“mxn”,其中m 是您的训练示例的数量,n 是您的特征数量。
现在,您想用您的 theta 参数一步计算所有训练示例的 h(x) 对吗?
这是诀窍: theta 必须是 anx 1 向量,然后当您进行矩阵向量乘法 (X*theta) 时,您将获得一个 mx 1 向量,其中包含训练集(X 矩阵)中所有 h(x) 的训练示例)。 矩阵乘法将逐行创建向量 h(x) 进行相应的数学运算,这将等于每个训练示例中的 h(x) 定义。
你可以手工计算,我已经做到了,现在很清楚了。 希望我能帮助别人。 :)
在数学中,“向量”始终定义为垂直堆叠的数组,例如 ,并且表示在一个3维空间中的单个点。
“水平”向量,通常表示一系列观察,例如是 3 个标量观测值的元组。
同样,矩阵可以被认为是向量的集合。 例如,以下是四个 3 维向量的集合:
标量可以被认为是一个大小为 1x1 的矩阵,因此它的转置与原始矩阵相同。
更一般地说,n×m 矩阵W
也可以被认为是从 m 维向量x
到 n 维向量y
变换,因为将该矩阵与 m 维向量相乘将产生一个新的 n-维度一。 如果您的“矩阵” W
是“1xn”,则这表示从 n 维向量到标量的转换。
因此,在符号上,习惯上从数学符号的角度来介绍问题,例如y = Wx
。
但是,出于计算原因,有时将计算作为“向量乘以矩阵”而不是“矩阵乘以向量”来执行更有意义。 由于(Wx)' === x'W'
,有时我们会这样解决问题,并将x'
视为水平向量。 此外,如果W
不是矩阵,而是标量,则Wx
表示标量乘法,因此在这种情况下Wx === xW
。
我不知道你说的练习,但我的假设是在课程中他引入了theta
作为一个适当的垂直向量,但随后将其转置以执行适当的计算,即从 n 维向量到标量(这是您的预测)。
然后在练习,想必你要么标“THETA”,所以没有点处理移调了,就留给THETA为了方便或THETA是现在被定义为水平(即移位的)向量与开始一段原因(例如打印方便),然后在执行必要的转换时保持该状态。
我不知道你的theta
和X
的维度是什么(你没有提供任何东西)但实际上这一切都取决于X
、 theta
和假设维度。 假设m
是特征数, n
是示例数。 然后,如果theta
是一个mx1
向量并且X
是一个nxm
矩阵,那么X*theta
是一个nx1
假设向量。
但是如果计算
theta'*X
您将得到相同的结果。
如果
theta
为
1xm
且
X
-
mxn
您也可以使用
theta*X
获得相同的结果
编辑:
正如@Tasos Papastylianou 指出的那样,如果X
是mxn
然后(theta.'*X).'
将获得相同的结果(theta.'*X).'
或X.'*theta
是答案。 如果假设应该是一个1xn
向量,那么theta.'*X
就是一个答案。 如果theta
是1xm
, X
- mxn
并且假设是1xn
那么theta*X
也是正确答案。
我有同样的问题。 (ML 课程,线性回归)在花时间研究之后,这是我的看法:x(i) 向量和 X 矩阵之间存在混淆。
关于 xi 向量(xi 属于 R3x1)的假设 h(xi),theta 属于 R3x1 theta = [to;t1;t2] #R(3x1) theta' = [to t1 t2] #R(1x3) xi = [1 ; xi1 ; xi2] #(R3x1) theta' * xi => to + t1.xi,1 +t2.xi,2
theta = [to;t1;t2] #R(3x1) theta' = [to t1 t2] #R(1x3) xi = [1 ; xi1 ; xi2] #(R3x1) theta' * xi => to + t1.xi,1 +t2.xi,2
到 theta'*xi 在这里工作
关于这种情况下的矢量化方程 X 与 x(矢量)不同。 它是一个具有 m 行和 n+1 列的矩阵(m = 示例的数量和我们在其上添加 to 项的 n 个特征)
因此,从前面 n= 2 的示例中,矩阵 X 是 amx 3 矩阵 X = [1 xo,1 xo,2 ; 1 x1,1 x1,2 ; ....; 1 xi,1 xi,2 ; ...; 1 xm,1 xm,2]
如果你想对算法的方程进行矢量化,你需要考虑每一行 i,你将有 h(xi)(一个实数),所以你需要实现 X * theta
这将为您提供每一行 i [ 1 xi,1 xi,2] * [to ; t1 ; t2] = to + t1.xi,1 + t2.xi,2
[ 1 xi,1 xi,2] * [to ; t1 ; t2] = to + t1.xi,1 + t2.xi,2
希望能帮助到你
我已经使用八度符号和语法来编写矩阵:“逗号”用于分隔列项目,“分号”用于分隔行项目,“单引号”用于转置。
在所讨论的课程理论中, theta =
[theta 0 ; θ 1 ; θ 2 ; θ 3 ; .... θ f ]。
因此,'theta' 是一个列向量或 '(f+1) x 1' 矩阵。 这里的“f”是特征的数量。 theta 0是截距项。
仅在一个训练示例中,x 是一个 '(f+1) x 1' 矩阵或列向量。 特别是x =
[x 0 ; × 1 ; × 2 ; × 3 ; .... x f ] x 0总是“1”。
在这种特殊情况下,通过取 theta '和 x 形成的 '1 x (f+1)' 矩阵可以相乘以给出正确的 '1x1' 假设矩阵或实数。
h = theta' * x
是一个有效的表达式。
但课程作业涉及多个训练示例。 如果有 'm' 个训练示例,则X是一个 'mx (f+1)' 矩阵。
为简化起见,假设有两个训练示例,每个示例都具有“f”特征。
X = [ x 1 ; × 2 ]。
(请注意括号内的 1 和 2 不是指数项,而是训练示例的索引)。
这里,x 1 = [ x 0 1 , x 1 1 , x 2 1 , x 3 1 , .... x f 1 ] 和 x 2 = [ x 0 2 , x 1 2 , x 2 2 , x 3 2 , .... x f 2 ]。
所以 X 是一个 '2 x (f+1)' 矩阵。
现在回答这个问题,theta '是一个 '1 x (f+1)' 矩阵, X 是一个 '2 x (f+1)' 矩阵。 因此,以下表达式无效。
theta' * X
theta * X
预期假设矩阵“ h ”应该有两个预测值(两个实数),两个训练示例中的每一个都有一个。 ' h ' 是一个 '2 x 1' 矩阵或列向量。
该假设只能通过使用有效且代数正确的表达式X * theta
来获得。 将一个 '2 x (f+1)' 矩阵与一个 '(f+1) x 1' 矩阵相乘得到一个 '2 x 1' 假设矩阵。
这是因为计算机的坐标 (0,0) 位于左上角,而几何体的坐标 (0,0) 位于左下角。
当 Andrew Ng 首次在成本函数 J(theta) 中引入 x 时,x 是一个列向量,又名
[x0; x1; ... ; xn]
i.e.
x0;
x1;
...;
xn
然而,在第一个编程任务中,我们得到了 X,它是一个 (m * n) 矩阵,(# 个训练示例 * 每个训练示例的特征)。 差异来自这样一个事实,即从文件中,单个 x 向量(训练样本)存储为水平行向量而不是垂直列向量!!
这意味着你看到的 X 矩阵实际上是一个 X'(X 转置)矩阵!!
由于我们有 X',我们需要让我们的代码工作,因为我们的方程正在寻找 h(theta) = theta' * X(当矩阵 X 中的向量是列向量时)
我们有矩阵和向量乘法的线性代数恒等式:
(A*B)' == (B') * (A')如此处所示转置的属性
let t = theta,
given, h(t) = t' * X
h(t)' = (t' X)'
= X' * t
现在我们的变量采用了实际提供给我们的格式。 我的意思是我们的输入文件确实包含 X' 并且 theta 是正常的,因此按照上面指定的顺序将它们相乘将给出与他教我们使用 which is theta' * X 的输出实际上等效。因为我们正在总结所有h(t)' 的元素在最后它被转置以用于最终计算并不重要。 但是,如果你想要 h(t),而不是 h(t)',你总是可以取你的计算结果并转置它,因为
(A')' == A
然而,对于coursera机器学习编程作业1,这是不必要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.