web-dev-qa-db-fra.com

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

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.

39
Faulty

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);
63
Simplex

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.

23
caped114

La ligne ci-dessous renvoie la valeur de coût requise 32.07 pendant l'exécution de computeCost une fois à l'aide de θ initialisé à zéros:

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

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

 enter image description here

6
user3352632

Cela peut également être fait en ligne M- # ensembles d'entraînement

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));
1
prajnan2k
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.

0
Jessica

Si vous voulez utiliser uniquement la matrice, alors:

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