la descente de gradient à l'aide de python et numpy
def gradient(X_norm,y,theta,alpha,m,n,num_it):
temp=np.array(np.zeros_like(theta,float))
for i in range(0,num_it):
h=np.dot(X_norm,theta)
#temp[j]=theta[j]-(alpha/m)*( np.sum( (h-y)*X_norm[:,j][np.newaxis,:] ) )
temp[0]=theta[0]-(alpha/m)*(np.sum(h-y))
temp[1]=theta[1]-(alpha/m)*(np.sum((h-y)*X_norm[:,1]))
theta=temp
return theta
X_norm,mean,std=featureScale(X)
#length of X (number of rows)
m=len(X)
X_norm=np.array([np.ones(m),X_norm])
n,m=np.shape(X_norm)
num_it=1500
alpha=0.01
theta=np.zeros(n,float)[:,np.newaxis]
X_norm=X_norm.transpose()
theta=gradient(X_norm,y,theta,alpha,m,n,num_it)
print theta
Mon thêta du code ci-dessus est 100.2 100.2
, mais il devrait être 100.2 61.09
dans matlab qui est correct.
- point-virgule sont ignorés en python et de l'indentation si fondamental.
Vous devez vous connecter pour publier un commentaire.
Je pense que ton code est un peu trop compliqué et il a besoin de plus de structure, car sinon vous serez perdu dans toutes les équations et les opérations. À la fin de cette régression se résume à quatre opérations:
Dans votre cas, je suppose que vous avez confondu
m
avecn
. Icim
désigne le nombre d'exemples dans votre entraînement, pas le nombre de fonctionnalités.Nous allons jeter un oeil à mon variation de votre code:
Au début, j'ai créer un petit aléatoire dataset qui devrait ressembler à ceci:
Comme vous pouvez le voir j'ai aussi ajouté le générés ligne de régression et de la formule qui a été calculée par excel.
Vous devez prendre soin sur l'intuition de la régression à l'aide de la descente de gradient. Comme vous le faites complet lot de passer au-dessus de vos données X, vous avez besoin pour réduire le m-pertes de chaque exemple, pour un poids unique de mise à jour. Dans ce cas, c'est la moyenne de la somme des gradients, ainsi que la division par
m
.La prochaine chose que vous devez prendre soin de est la voie de la convergence et de régler le taux d'apprentissage. Pour cette question, vous devriez toujours suivre votre coût à chaque itération, peut-être même de l'intrigue elle.
Si vous exécutez mon exemple, le thêta retourné devra ressembler à ceci:
Qui est en fait assez proche de l'équation qui a été calculé par excel (y = x + 30). Notez que, comme nous l'avons adopté le parti pris dans la première colonne, la première thêta valeur indique le biais de poids.
/ 2 * m
censé être/ (2 * m)
?loss
pour la valeur absolue de la différence n'est pas une très bonne idée que de "perte" est généralement synonyme de "coût". Vous n'avez pas besoin de passerm
à tous, tableaux NumPy connaître leur propre forme.Ci-dessous vous pouvez trouver mes de mise en œuvre de la descente de gradient pour la régression linéaire problème.
Au premier abord, le calcul de gradient comme
X.T * (X * w - y) /N
et à mettre à jour vos thêta avec ce dégradé simultanément.Voici le code python:
gradient = x.T * error / N
Quelle est la logique derrière cela?Je sais que cette question a déjà été répondu, mais j'ai fait une mise à jour de la déclaration de la fonction :
Cette fonction de réduire l'alpha au cours de l'itération de prise de fonction trop convergent plus rapidement voir L'estimation de la régression linéaire avec une pente de Descente (Descente la plus raide) pour un exemple dans l'arrêt R. j'applique la même logique, mais en Python.
Suivant @thomas jungblut mise en œuvre en python, j'ai fait de même pour Octave. Si vous trouvez quelque chose de mal, s'il vous plaît laissez-moi savoir et je vais le corriger+mise à jour.
Des données à partir d'un fichier txt avec les lignes suivantes:
penser à cela comme une très approximative de l'échantillon pour les fonctions de [nombre de chambres] [mts2] et la dernière colonne [loyer] qui est ce que nous voulons prédire.
Ici est l'Octave de la mise en œuvre: