Je suis dans la deuxième semaine du cours d'apprentissage automatique du professeur Andrew Ng par le biais de Coursera. Nous travaillons sur la régression linéaire et je suis en train de coder la fonction de coût.
Le code que j'ai écrit résout le problème correctement mais ne réussit pas le processus de soumission et échoue au test unitaire, car j'ai codé en dur les valeurs de thêta et je n'ai pas autorisé plus de deux valeurs pour thêta.
Voici le code que j'ai jusqu'à présent
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 ans = 7.0175
J'ai donc besoin d'ajouter une autre boucle for itérant sur thêta, permettant ainsi un nombre quelconque de valeurs pour thêta, mais je serai damné si je peux comprendre comment et où.
Quelqu'un peut-il suggérer un moyen de permettre un nombre quelconque de valeurs pour thêta dans cette fonction?
Si vous avez besoin de plus d'informations pour comprendre ce que j'essaie de demander, je ferai de mon mieux pour vous le fournir.
Vous pouvez utiliser la vectorisation des opérations dans Octave/Matlab . Itérer sur un vecteur entier. C'est une très mauvaise idée si votre langage de programmation vous permet de vectoriser des opérations . R, Octave, Matlab, Python (numpy) autorisent cette opération Par exemple, vous pouvez obtenir une 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 manière suivante:
H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);
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 d'informatique
(theta' * X')'
puis en prenant la transposition, vous pouvez calculer directement
(X * theta)
Ça fonctionne parfaitement.
Cela peut également être fait en ligne M- # ensembles d'entraînement
J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));
J = sum(((X*theta)-y).^2)/(2*m);
ans = 32.073
La réponse ci-dessus est parfaite, j'ai réfléchi profondément au problème pendant un jour et je ne connaissais toujours pas Octave.
Si vous voulez utiliser uniquement la matrice, alors:
temp = (X * theta - y); % h(x) - y
J = ((temp')*temp)/(2 * m);
clear temp;