문제

다음 코드를 더 피스닉으로 만드는 방법을 알려 주시겠습니까?

코드가 정확합니다. 전체 공개 - 유인물 #4의 문제 1B입니다. 이것 기계 학습 과정. 물류 가설을 장착하기 위해 두 데이터 세트에서 Newton의 알고리즘을 사용해야합니다. 그러나 그들은 Matlab을 사용하고 있으며 Scipy를 사용하고 있습니다

예를 들어, 내가 가진 한 가지 질문은 하나의 값을 0.0으로 초기화 할 때까지 정수로 계속 반올림하는 행렬입니다. 더 좋은 방법이 있습니까?

감사

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
도움이 되었습니까?

해결책

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

다른 팁

명백한 변경 사항 중 하나는 "I For I In in Range (1, 100)을 제거하고 파일 줄을 반복하는 것입니다. 두 파일 (xfile 및 yfile)을 모두 반복하려면 지퍼를 집어 넣으십시오. 즉, 해당 블록을 다음과 같은 것으로 바꾸십시오.

 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)
    ...

(파일이 100 줄이라고 가정합니다. (예 : 전체 파일을 원합니다) 의도적으로 의도적으로 제한하는 경우 첫 번째 100 줄, 다음과 같은 것을 사용할 수 있습니다.

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

그러나 동일한 파일을 6 번 반복하는 것은 비효율적입니다. 사전에 메모리에로드하고 그 위에 루프하는 것이 좋습니다. 루프 밖에서 :

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

그리고 단지 내부 :

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

매트릭스는 하나의 값을 0.0으로 초기화 할 때까지 정수로 반올림했습니다. 더 좋은 방법이 있습니까?

코드 상단에서 :

from __future__ import division

Python 2.6 이상에서 정수 부서는 적어도 하나의 부동 소수점 번호가 없으면 항상 정수를 반환합니다. Python 3.0에서 (및 IN 미래 2.6)의 부서에서, 부서는 우리 인간이 기대할 수있는 방식을 더 많이 작동시킵니다.

만약 너라면 원하다 정수를 반환하기위한 정수 부서, 그리고 당신은 미래, 이중 //를 사용하십시오. 그건

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

당신은 그것을 사용할 수 있습니다 ~와 함께 성명.

파일을 목록으로 읽는 코드는 크게 더 간단 할 수 있습니다.

for line in open("q1x.dat", "r"):
    x = map(float,line.split("  ")[1:])
y = map(float, open("q1y.dat", "r").readlines())
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top