Función de costo, Regresión Lineal, tratando de evitar la codificación dura theta. Octava.


Estoy en la segunda semana del curso de Aprendizaje Automático del profesor Andrew Ng a través de Coursera. Estamos trabajando en regresión lineal y ahora mismo estoy tratando con la codificación de la función de costo.

El código que he escrito resuelve el problema correctamente, pero no pasa el proceso de envío y falla la prueba unitaria porque he codificado los valores de theta y no he permitido más de dos valores para theta.

Aquí está el código que tengo hasta ahora

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

La prueba unitaria es

computeCost( [1 2 3; 1 3 4; 1 4 5; 1 5 6], [7;6;5;4], [0.1;0.2;0.3])

Y debería producir ans = 7.0175

Así que necesito agregar otro bucle for para iterar sobre theta, por lo tanto permitiendo cualquier número de valores para theta, pero seré condenado si puedo envolver mi cabeza alrededor de cómo/dónde.

¿Puede alguien sugerir una forma en que puedo permitir cualquier número de valores para theta dentro de esta función?

Si necesita más información para entender lo que estoy tratando de preguntar, haré todo lo posible para proporcionarla.

Author: Faulty, 2014-03-25

6 answers

Puede usar vectorizar operaciones en Octave/Matlab. Iterar sobre todo el vector-es realmente mala idea, si su lenguaje de programación le permite vectorizar las operaciones. R, Octave, Matlab, Python (numpy) permiten esta operación. Por ejemplo, puede obtener la producción escalar, si theta = (t0, t1, t2, t3) y X = (x0, x1, x2, x3) de la siguiente manera: theta * X' = (t0, t1, t2, t3) * (x0, x1, x2, x3)' = t0*x0 + t1*x1 + t2*x2 + c3*x3 El resultado será escalar.

Por ejemplo, puede vectorizar h en su código de la siguiente manera:

H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);
 60
Author: Simplex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-25 07:47:53

La respuesta anterior es perfecta, pero también puedes hacer

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

En lugar de computar

(theta' * X')'

Y luego tomando la transposición se puede calcular directamente

(X * theta)

Funciona perfectamente.

 23
Author: caped114,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-30 00:03:47

La siguiente línea devuelve el valor de costo requerido de 32.07 mientras ejecutamos computeCost una vez usando θ inicializado a ceros:

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

Y es similar a las fórmulas originales que se dan a continuación.

introduzca la descripción de la imagen aquí

 6
Author: user3352632,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-08 21:02:12

También se puede hacer en una línea- m - # conjuntos de entrenamiento

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));
 1
Author: prajnan2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-05 21:52:49
J = sum(((X*theta)-y).^2)/(2*m);
ans =  32.073

La respuesta anterior es perfecta, pensé que el problema profundamente por un día y todavía no está familiarizado con Octave, así que, Solo estudiar juntos!

 0
Author: Jessica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 07:49:28

Creo que necesitábamos usar la iteración para mucha solución general para el costo en lugar de una iteración, también el resultado muestra en el PDF 32.07 puede no ser la respuesta correcta que el calificador está buscando la razón de ser su un caso de muchos datos de entrenamiento.

Creo que debería recorrer así

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

  j = (1/(2*m))(theta'*x-y)^2
 -3
Author: Gautam Karmakar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-08 05:15:06