Fonction de coût, régression linéaire, en essayant d'éviter thêta codage dur. Octave.

<!-Je suis dans la deuxième semaine du cours D'apprentissage automatique du professeur Andrew Ng à travers Coursera. Nous travaillons sur la régression linéaire et maintenant je m'occupe du codage de la fonction de coût.

le code que j'ai écrit résout le problème correctement mais ne passe pas le processus de soumission et échoue le test de l'unité parce que j'ai codé dur les valeurs de theta et pas autorisé plus de deux valeurs pour theta.

voici le code que j'ai si loin

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

le test unitaire est

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

et devrait produire des ans = 7.0175

donc j'ai besoin d'ajouter une autre boucle pour itérer au-dessus de theta, donc en tenant compte de n'importe quel nombre de valeurs pour theta, mais je serai damné si je peux enrouler ma tête autour de comment/où.

est-ce que quelqu'un peut suggérer un moyen que je peux permettre un certain nombre de valeurs pour thêta dans cette fonction?

si vous avez besoin de plus d'information pour comprendre ce que j'essaie de demander, je vais essayer de mon mieux pour fournir.

38
demandé sur Faulty 2014-03-25 08:22:57

6 réponses

Vous pouvez utiliser vectorize des opérations dans Octave / Matlab. Iterate over entire vector - c'est vraiment une mauvaise idée, si votre langage de programme vous permet de vectoriser des opérations. R, Octave, Matlab, Python (numpy) permettent cette opération. Par exemple, vous pouvez obtenir la production scalaire, si theta = (t0, t1, t2, t3) et X = (x0, x1, x2, x3) de la manière suivante: theta * X' = (t0, t1, t2, t3) * (x0, x1, x2, x3)' = t0*x0 + t1*x1 + t2*x2 + t3*X3 Le résultat sera scalaire.

Par exemple, vous pouvez vectoriser h dans votre code de la façon suivante:

H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);
60
répondu Simplex 2014-03-25 07:47:53

la réponse ci-dessus est parfaite mais vous pouvez aussi faire

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

plutôt que de calculer

(theta' * X')'

et puis en prenant la transposer, vous pouvez calculer directement

(X * theta)

cela fonctionne parfaitement.

23
répondu caped114 2015-06-30 00:03:47

la ligne ci-dessous renvoie la valeur de coût 32.07 requise pendant que nous exécutons computeCost une fois en utilisant θ initialisé à zéros:

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

et est similaire aux formules originales qui sont données ci-dessous.

enter image description here

6
répondu user3352632 2018-08-08 21:02:12

Il peut aussi être fait dans une ligne- M - # Ensembles d'entraînement

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));
1
répondu prajnan2k 2015-08-05 21:52:49
J = sum(((X*theta)-y).^2)/(2*m);
ans =  32.073

la réponse ci-dessus est parfaite,j'ai pensé le problème profondément pour une journée et toujours pas familier avec Octave,donc,il suffit d'étudier ensemble!

0
répondu Jessica 2017-02-28 07:49:28

je pense que nous avons dû utiliser itération pour beaucoup de solution générale pour le coût plutôt qu'une itération, aussi le résultat montre dans le PDF 32.07 peut ne pas être la réponse correcte que grader cherche la raison étant son un cas sur de nombreuses données de formation.

je pense qu'il devrait en boucle comme ceci

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

  j = (1/(2*m))(theta'*x-y)^2
-3
répondu Gautam Karmakar 2015-12-08 05:15:06