2014-08-27 5 views
0

완전히 막혔습니다. 이미 수업을 이해 한 생각 내가 잘못했다 생각 :Python이 내 클래스에 __call__ 메서드가 없음을 말합니다.

class LinearRegression: 

def __init__(self, x, y, full = 0): 
    self.full = full 
    self.x = x 
    self.y = y 

def __call__(self): 
    squared_sum_x = (sum(self.x))**2 
    n = len(self.x) 
    xx = sum([item**2 for item in self.x]) 
    xy = sum([xi*yi for xi, yi in zip(self.x,self.y)]) 
    a = 1.0*((n*xy -(sum(self.y)*sum(self.x)))/(n*xx - squared_sum_x)) 
    b = (sum(self.y) - a*sum(self.x))/n 
    if self.full == 0: 
     return (a,b) 
    elif self.full == 1: 
     squared_sum_y = (sum(self.y))**2 
     yy = sum([item**2 for item in self.y]) 
     R = float((n*xy -(sum(self.y)*sum(self.x)))/(((n*xx - squared_sum_x)*(n*yy - squared_sum_y))**0.5)) 
     S_a = (1/(n-2))*((yy-(a*xy)-(b*sum(self.y)))/(xx-(n*xx))) 
     S_b = S_a * (n*xx) 
     return (a, b, R, S_a, S_b) 
    else: 
     return "full parameter must be 0, 1 or empty" 

lr = LinearRegression(range(10),range(10,30,2),0) 
lr() 

을 그리고 난 다음 오류가 점점 오전 :/어쨌든, 내 코드는 다음과 같습니다

AttributeError: LinearRegression instance has no __call__ method 

질문입니다 : 왜? 왜냐하면이 코드를 분석하는 데 몇 시간을 소비했기 때문에 무엇이 잘못 됐는지 전혀 알지 못하기 때문입니다 ...

+12

형식이 맞습니까? 아시다시피, 들여 쓰기는 Python에서 중요합니다. – Danstahr

+2

그리고'dir (LinearRegression)'show가 클래스의 일부입니까? 아마도 들여 쓰기 문제가있을 것입니다. –

+0

감사합니다. 실제로 포맷이 잘못되었습니다. 초기화가 잘못되었습니다. 선생님이 쓴이 수업의 프로토 타입의 일부 였기 때문에 이전에 확인하지 않았습니다. Ph.D. 컴퓨터 과학에서 그런 에러를 만들지는 않을 것입니다. P –

답변

1

문제는 들여 쓰기에 있다고 생각합니다. 들여 쓰기가 "바깥 쪽"으로 배치하기 때문에 클래스에 실제로 이러한 메서드를 포함하지 않습니다. 대신 다음과 같이 시도하십시오 :

class LinearRegression: 

    def __init__(self, x, y, full = 0): 
     self.full = full 
     self.x = x 
     self.y = y 

    def __call__(self): 
     squared_sum_x = (sum(self.x))**2 
     n = len(self.x) 
     xx = sum([item**2 for item in self.x]) 
     xy = sum([xi*yi for xi, yi in zip(self.x,self.y)]) 
     a = 1.0*((n*xy -(sum(self.y)*sum(self.x)))/(n*xx - squared_sum_x)) 
     b = (sum(self.y) - a*sum(self.x))/n 
     if self.full == 0: 
      return (a,b) 
     elif self.full == 1: 
      squared_sum_y = (sum(self.y))**2 
      yy = sum([item**2 for item in self.y]) 
      R = float((n*xy -(sum(self.y)*sum(self.x)))/(((n*xx - squared_sum_x)*(n*yy - squared_sum_y))**0.5)) 
      S_a = (1/(n-2))*((yy-(a*xy)-(b*sum(self.y)))/(xx-(n*xx))) 
      S_b = S_a * (n*xx) 
      return (a, b, R, S_a, S_b) 
     else: 
      return "full parameter must be 0, 1 or empty" 

이렇게하면 메소드가 독립적으로 정의 된 함수가 아닌 클래스의 "내부"에있게됩니다.

+1

OP가 직접 복사 인 경우 인터프리터는 빈 클래스 (IndentationError : 들여 쓰기 된 블록이 예상 됨)에 대해 불만을 토로합니다. 그래서 그게 유일한 원인은 아니라고 생각합니다. – Danstahr

관련 문제