2014-01-28 8 views
0

퍼셉트론 알고리즘을 구현하려고하지만 일관성없는 결과가 나타납니다. 나는 무게의 초기화가 큰 영향을 끼치고 있음을 알아 챘다. 내가 뻔뻔스럽게 잘못하고있는 것이 있습니까? 감사!퍼셉트론 알고리즘의 일관성없는 결과

import numpy as np 

def train(x,y): 

    lenWeights = len(x[1,:]); 
    weights = np.random.uniform(-1,1,size=lenWeights) 
    bias = np.random.uniform(-1,1); 
    learningRate = 0.01; 
    t = 1; 
    converged = False; 

# Perceptron Algorithm 

while not converged and t < 100000: 
    targets = []; 
    for i in range(len(x)): 

      # Calculate output of the network 
      output = (np.dot(x[i,:],weights)) + bias; 

      # Perceptron threshold decision 
      if (output > 0): 
       target = 1; 
      else: 
       target = 0; 

      # Calculate error and update weights 
      error = target - y[i]; 

      weights = weights + (x[i,:] * (learningRate * error)); 

      bias = bias + (learningRate * error); 

      targets.append(target); 

      t = t + 1; 

    if (list(y) == list(targets)) == True: 
     converged = True; 


return weights,bias 

def test(weights, bias, x): 

    predictions = []; 

    for i in range(len(x)): 

     # Calculate w'x + b 
     output = (np.dot(x[i,:],weights)) + bias; 

     # Get decision from hardlim function 
     if (output > 0): 
      target = 1; 
     else: 
      target = 0; 

     predictions.append(target); 

    return predictions 

if __name__ == '__main__': 

    # Simple Test 

    x = np.array([ [0,1], [1,1] ]); 
    y = np.array([ 0, 1 ]); 

    weights,bias = train(x,y); 
    predictions = test(weights,bias,x); 

    print predictions 
    print y 
+0

어떤 방식으로 결과가 일치하지 않습니까? 당신이 발견 한 가중치에 대한 의존도는 무엇입니까? 나는'while'에도 들여 쓰기 오류가 있다고 생각합니다. – Nabla

+0

때로는 정확한 레이블을 출력하지만 때로는 그렇지 않습니다. 임의 선택입니다. – rahulm

답변

0

퍼셉트론은하지 세계적으로 최적화 , 그래서 훈련 (그들은 당신이 당신의 알고리즘을 실행할 때마다 다를 수 있음) 가 일치하지 않을 것입니다 결과, 그것은 무게 초기화에 (다른 사람의 사이)에 따라 달라집니다. 이것은 구현 문제가 아닌 비 - 볼록 함수의 그라데이션 최적화 (퍼셉트론을 삼각형 화하는 것이 그 예입니다)의 특성입니다.

+0

@lejlot 문제의 코드는 간단한 이진 1 레이어 퍼셉트론입니다. 트레이닝 세트가 선형으로 분리 가능하고 그렇지 않은 경우 전혀 수렴하지 않으면 전 세계적으로 수렴해야한다고 생각합니다. 문제의 코드는 실제로 거의 수렴하지 않습니다. 질문자는 이것을 <100000> 테스트와 함께 숨겼습니다. 나는 또한 훈련 세트가 선형으로 분리 가능하다고 생각한다. 내가 잘못? – Nabla

+0

맞습니다. 좀 더 복잡한 모델 (MLP)을 가정했습니다. 나는 대답을 지우 겠지만, 첫 번째 저자는 그것을 "해답"해야한다. – lejlot

+0

그래,이 코드 줄에 내 체중을 업데이트하는 간단한 버그였다. 'error = target - y [i]'; 다음과 같아야합니다. 'error ='y [i] - target '; 그 문제가 해결되었습니다. 훈련 세트가 선형으로 분리 가능하기 때문에 Nabla가 말했듯이 항상 올바른 결과를 반환합니다. – rahulm