Fonction de coût, régression linéaire, en essayant d'éviter thêta codage dur. Octave.
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.
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);
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.
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.
Il peut aussi être fait dans une 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 pensé le problème profondément pour une journée et toujours pas familier avec Octave,donc,il suffit d'étudier ensemble!
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