Machine learning 成本函数,线性回归,尽量避免硬编码θ。八度

Machine learning 成本函数,线性回归,尽量避免硬编码θ。八度,machine-learning,octave,linear-regression,Machine Learning,Octave,Linear Regression,我正在上Andrew Ng教授的机器学习课程的第二周。我们正在研究线性回归,现在我正在处理成本函数的编码 我编写的代码正确地解决了问题,但没有通过提交过程,也没有通过单元测试,因为我硬编码了θ的值,并且不允许θ的值超过两个 这是我目前掌握的密码 function J = computeCost(X, y, theta) m = length(y); J = 0; for i = 1:m, h = theta(1) + theta(2) * X(i) a = h - y(i);

我正在上Andrew Ng教授的机器学习课程的第二周。我们正在研究线性回归,现在我正在处理成本函数的编码

我编写的代码正确地解决了问题,但没有通过提交过程,也没有通过单元测试,因为我硬编码了θ的值,并且不允许θ的值超过两个

这是我目前掌握的密码

function J = computeCost(X, y, theta)

m = length(y);
J = 0;

for i = 1:m,
    h = theta(1) + theta(2) * X(i)
    a = h - y(i);
    b = a^2;
    J = J + b;
    end;
J = J * (1 / (2 * m));

end
单元测试是

computeCost( [1 2 3; 1 3 4; 1 4 5; 1 5 6], [7;6;5;4], [0.1;0.2;0.3])
应产生ans=7.0175

因此,我需要添加另一个for循环来迭代θ,因此允许θ有任意数量的值,但是如果我能围绕how/where来思考,我会被诅咒的

有谁能建议一种方法,在这个函数中允许θ有任意数量的值吗


如果您需要更多信息来理解我想问的问题,我会尽力提供。

您可以使用Octave/Matlab中的操作矢量化。 迭代整个向量-如果您的编程语言允许您对操作进行向量化,这真的是个坏主意。 R、 Octave、Matlab、Python(numpy)允许此操作。 例如,如果θ=(t0、t1、t2、t3)和X=(x0、x1、x2、x3),则可以通过下一种方式获得标量生成: θ*X'=(t0,t1,t2,t3)*(x0,x1,x2,x3)'=t0*x0+t1*x1+t2*x2+t3*x3 结果将是标量

例如,您可以通过以下方式在代码中对h进行矢量化:

H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);

以上答案是完美的,但你也可以做到

H = (X*theta);
S = sum((H - y) .^ 2);
J = S / (2*m);
而不是计算

(theta' * X')'
然后进行转置,您可以直接计算

(X * theta)

它工作得很好。

也可以在一行中完成- m-#训练集

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));

当我们使用初始化为零的θ运行computeCost一次时,下一行返回所需的32.07成本值:

J = (1/(2*m)) * (sum(((X * theta) - y).^2));
与下面给出的原始公式类似


我认为我们需要使用迭代来解决很多一般性的成本问题,而不是一次迭代,而且PDF 32.07中的结果可能不是正确的答案,评分员正在寻找原因,因为这是许多培训数据中的一个案例

我想它应该像这样循环

  for i in 1:iteration
  theta = theta - alpha*(1/m)(theta'*x-y)*x

  j = (1/(2*m))(theta'*x-y)^2

以上答案是完美的,我思考了一天的问题,仍然不熟悉八度,所以,一起学习吧

如果只想使用矩阵,那么:

temp = (X * theta - y);        % h(x) - y
J = ((temp')*temp)/(2 * m);
clear temp;

这对你来说很好-

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

这直接来自成本函数方程

相同的Python代码:

def computeCost(X, y, theta):
    m = y.size  # number of training examples
    J = 0
    H = (X.dot(theta))
    S = sum((H - y)**2);
    J = S / (2*m);
    return J

你取消了那里的for循环了吗?如果我读对了,你已经写了(θ转置*X转置)转置。是的,这三行代码替换了整个循环!所以,它是转置(我使用八度语法),我想你已经用大写字母作为变量,作为命名矩阵变量的惯例,所以谢谢你提醒我这一点。我不明白的是在“S=sum((H-y)。^2);“那是什么?”?我知道我以前见过它,但我记不起它的用途。矩阵中的点拟真用于元素对元素的运算。例如:A=[12;34]B=[34;12]所以,A*B=[58;1320](即通常是矩阵乘法)A*B=[38;38](即逐元素乘法-[1*32*4;3*14*2]类似地:A.^2=[1^2^2;3^2^4^2]=[1 4;9 16]好的,我花了相当长的时间才理解为什么这个代码是有效的,但它确实有效。谢谢。为什么你需要在
X*theta
周围使用paren呢?你不需要。我有一个习惯,就是在大表达式的情况下放括号,以避免混淆。需要明确的是,上面的等式X*theta=(theta'*X')之所以成立,是因为有两个恒等式:(a')“=A和A'*B'=(BA)”。所以只要取(θ'*X')=(X*theta)'这个,转置,就得到了((X*theta)',它等于X*theta。我困惑的是,在H(X)的方程中,我们有H(X)=theta'*X,但在代码中实现它时,我们似乎必须采用它的转置,但是why@rasen58如果还有人关心这个问题,我在尝试实现这个问题时也遇到了同样的问题。基本上,我发现,在成本函数方程中,我们有θ'*x。当我们实现这个函数时,我们没有x,我们有fe矩阵X.X是一个向量,X是一个矩阵,其中每行是一个向量X的转置。所以,这就是额外转置操作的来源。是否需要与1相乘(m,1)?矢量化代码是解决矩阵运算的更好方法,而不是在for循环上迭代矩阵。当然,我很乐意。它基于代价函数,使用矩阵乘法,而不是显式求和或循环。我不确定是谁给了你“-”但这也是我提出的解决方案。它更干净,我相信效率更高。获得100%。请不要仅将代码作为答案发布。这没有帮助。请花时间提供高质量的答案。注意:“此答案因其长度和内容而被标记为低质量。”。如果你不提高答案的质量,这篇文章可能会被删除。@Zoe怎么了?我刚刚通知作者他的文章被标记为低质量,可能会被删除。没有任何解释的发布代码不是一个好答案。但我没有标记它。这只是一个很好的建议。
J =  sum((X*theta - y).^2)*(1/(2*m))
def computeCost(X, y, theta):
    m = y.size  # number of training examples
    J = 0
    H = (X.dot(theta))
    S = sum((H - y)**2);
    J = S / (2*m);
    return J