【问题标题】:Octave Matrices: Why are these two costfunctions acting differently?八度矩阵:为什么这两个成本函数的行为不同?
【发布时间】:2021-10-11 08:25:41
【问题描述】:

知道X是mx3矩阵,theta是3x1矩阵,我计算逻辑回归的代价函数如下:

h = sigmoid(theta'*X');
J = ((-y)*log(h)-(1-y)*log(1-h))/m;

grad(1) = (h'-y)'*X(:,1);
grad(2) = (h'-y)'*X(:,2);
grad(3) = (h'-y)'*X(:,3);

输出是附上的图片:

这显然不是正确的结果。

当我这样做时

h = sigmoid(X*theta);
J = ((-y)'*log(h)-(1-y)'*log(1-h))/m;

grad = (X'*(h - y))/m;

我得到了正确的结果:

对我来说,这两个代码是相同的 - 是的,我检查了第一个代码中的矩阵大小。

有人可以帮助我理解一个输入一个输入而另一个输出不同的情况吗?不知何故,第一个代码在 theta 值上付出了很多代价......

【问题讨论】:

  • 这里的y 是什么?请edit您的问题将您的示例转换为minimal reproducible example,以便我们可以重现此结果。我敢肯定,通过调试,您会在某处看到转置的各个阶段在某处不再等效 - 尝试创建中间变量而不是内联进行所有数学运算,然后您可以确定差异发生的精确点。

标签: matlab machine-learning octave


【解决方案1】:

这是因为您没有注意输入和输出的维度。 (这反过来又是因为您的代码没有正确注释/结构化。)。假设 y 在观察方面与 X 具有相同的方向,则:

在第一种情况下,您有:

h = sigmoid(theta'*X');               # h is a 1xm horizontal vector
J = ((-y)*log(h)-(1-y)*log(1-h))/m;   # J is an mxm matrix

在第二种情况下,您有:

h = sigmoid(X*theta);                   # h is an mx1 vector
J = ((-y)'*log(h)-(1-y)'*log(1-h))/m;   # J is a 1xm horizontal vector

这也是您获得“测试 theta 成本”打印输出的多个打印输出的原因。我的猜测是你在某处调用“sum”,以对 m 个观察值求和,但因为 J 是一个 mxm 矩阵而不是一个向量,你最终在 fprintf 语句中得到一个向量,它具有打印的效果该语句的次数与向量中的元素一样多。 m=12 有没有机会?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多