Question

Pourriez-vous me dire comment je peux rendre le code suivant plus pythonique?

Le code est correct. Divulgation complète - le problème 1b est décrit dans le document n ° 4 du cours sur l'apprentissage automatique. Je suis supposé utiliser l'algorithme de Newton sur les deux ensembles de données pour ajuster une hypothèse logistique. Mais ils utilisent matlab & amp; J'utilise scipy

Par exemple, une des questions que je me pose est celle des matrices gardées arrondies aux nombres entiers jusqu'à ce que je initialise une valeur à 0,0. Y a-t-il un meilleur moyen?

Merci

import os.path
import math
from numpy import matrix
from scipy.linalg import inv #, det, eig

x = matrix( '0.0;0;1'  )
y = 11
grad = matrix( '0.0;0;0'  )
hess = matrix('0.0,0,0;0,0,0;0,0,0')
theta = matrix( '0.0;0;0'  ) 


# run until convergence=6or7
for i in range(1, 6):
  #reset
  grad = matrix( '0.0;0;0'  )
  hess = matrix('0.0,0,0;0,0,0;0,0,0')

  xfile = open("q1x.dat", "r")
  yfile = open("q1y.dat", "r")


  #over whole set=99 items  
  for i in range(1, 100):    
    xline = xfile.readline()
    s= xline.split("  ")
    x[0] = float(s[1])
    x[1] = float(s[2])
    y = float(yfile.readline())

    hypoth = 1/ (1+ math.exp(-(theta.transpose() * x)))

    for j in range(0,3):
      grad[j] = grad[j] + (y-hypoth)* x[j]      
      for k in range(0,3):
        hess[j,k] = hess[j,k] - (hypoth *(1-hypoth)*x[j]*x[k])


  theta = theta - inv(hess)*grad #update theta after construction

  xfile.close()
  yfile.close()

print "done"
print theta
Était-ce utile?

La solution

x = matrix([[0.],[0],[1]])
theta = matrix(zeros([3,1]))
for i in range(5):
  grad = matrix(zeros([3,1]))
  hess = matrix(zeros([3,3]))
  [xfile, yfile] = [open('q1'+a+'.dat', 'r') for a in 'xy']
  for xline, yline in zip(xfile, yfile):
    x.transpose()[0,:2] = [map(float, xline.split("  ")[1:3])]
    y = float(yline)
    hypoth = 1 / (1 + math.exp(theta.transpose() * x))
    grad += (y - hypoth) * x
    hess -= hypoth * (1 - hypoth) * x * x.transpose()
  theta += inv(hess) * grad
print "done"
print theta

Autres conseils

Un changement évident consiste à supprimer le "pour i dans la plage (1, 100):" et juste itérer sur les lignes du fichier. Pour parcourir les deux fichiers (xfile et yfile), compressez-les. c'est-à-dire remplacer ce bloc par quelque chose comme:

 import itertools

 for xline, yline in itertools.izip(xfile, yfile):
    s= xline.split("  ")
    x[0] = float(s[1])
    x[1] = float(s[2])
    y = float(yline)
    ...

(En supposant que le fichier compte 100 lignes (c’est-à-dire que vous voulez l’ensemble du fichier). Si vous limitez délibérément les premières 100 lignes, vous pouvez utiliser quelque chose comme:

 for i, xline, yline in itertools.izip(range(100), xfile, yfile):

Cependant, il est également inefficace de parcourir le même fichier 6 fois - il est préférable de le charger en mémoire à l’avance et de le parcourir en boucle, c.-à-d. en dehors de votre boucle, avez:

xfile = open("q1x.dat", "r")
yfile = open("q1y.dat", "r")
data = zip([line.split("  ")[1:3] for line in xfile], map(float, yfile))

Et à l'intérieur juste:

for (x1,x2), y in data:
    x[0] = x1
    x[1] = x2
     ...
  

les matrices ont continué à arrondir aux entiers jusqu'à ce que j'initialise une valeur   à 0.0. Y a-t-il un meilleur moyen?

En haut de votre code:

from __future__ import division

Dans Python 2.6 et les versions antérieures, la division entière renvoyait toujours un entier sauf s'il y avait au moins un nombre à virgule flottante. Dans Python 3.0 (et dans la future division en 2.6), la division fonctionne mieux comme nous le voudrions.

Si vous voulez que la division entière renvoie un entier et que vous importiez de futur , utilisez un double //. C'est

from __future__ import division
print 1//2 # prints 0
print 5//2 # prints 2
print 1/2  # prints 0.5
print 5/2  # prints 2.5

Vous pouvez utiliser le avec déclaration.

le code qui lit les fichiers dans des listes pourrait être radicalement plus simple

for line in open("q1x.dat", "r"):
    x = map(float,line.split("  ")[1:])
y = map(float, open("q1y.dat", "r").readlines())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top