>

처음부터 퍼셉트론 학습 알고리즘을 작성하는 것은 처음입니다. 전에 ML ML 솔루션을 사용했지만 실제로 이해하고 직접 작성하고 싶었습니다. 어떤 이유로 든 내 오류율이 감소하는 대신 계속 증가합니다. 그래서 내 알고리즘이 수렴하는 대신 분기되는 것처럼 보입니다. 공차 범위에 글씨를 썼는데, 때로는 가까워 지지만 결코 점수에 미치지 못하기 때문입니다.

저는 3 개의 무게가 있습니다;바이어스의 경우 1, X 및 Y의 경우 2입니다.

저의 판별자를 찾았습니다. D = (weight0 + weight1 * Xi) + (weight2 * Yi)

구별자가 예상 출력과 일치하지 않으면 다음을 사용하여 가중치를 업데이트합니다. 참고 : c와 k가 미리 정의 된 상수이고 d = 예상 출력이라고 가정합니다. w0 = w0 + cdk w1 = w1 + cdXi w2 = w2 + cdYi

아래는 파이썬에서 구현 한 것입니다 :

def weightsUpdate(weights, constantC, constantK, classificationd, x, y):
     weights[0] = weights[0] + constantC * classificationd * constantK # w0 = w0 + cdk
     weights[1] = weights[1] + constantC * classificationd * x #w1 = w1 + cdx
     weights[2] = weights[2] + constantC * classificationd * y #w2 = w2 + cdy
     return weights
def trainModel(df, weights, constantC, constantK, maxIter, threshHold):
     #grab the values in a list
     x = df['X'].values
     y = df['Y'].values
     d = df['Class'].values
     #define some variables to keep track
     numTurns = 0
     while numTurns < maxIter:
          errorRate = 0
          falsePosNeg = 0
          truePosNeg = 0
          '''assign som threshhold values. must accomodate for slight variance.'''
          posThreshHoldCeiling = 1 + threshHold
          posThreshHoldFloor = 1 - threshHold
          negThreshHoldFloor = -1 - threshHold
          negThreshHoldCeiling = -1 + threshHold
          for i in range(len(x)):
              ''' calculate the discriminant D = w0 + w1*xi + w2*yi '''
              discriminant = weights[0] + (weights[1] * x[i]) + (weights[2] * y[i])
              '''if the discriminant is not correct when compared to the correct output'''
              if ((discriminant >= posThreshHoldFloor and discriminant <= posThreshHoldCeiling) or
                (discriminant >= negThreshHoldFloor and discriminant <= negThreshHoldCeiling)):
                  truePosNeg += 1
                 #weights = weightsUpdate(weights, constantC, constantK, d[i], x[i], y[i])
        else:
                 '''update the weights'''
                 weights = weightsUpdate(weights, constantC, constantK, d[i], x[i], y[i])
                 falsePosNeg += 1

          numTurns += 1 #increase number of turns by 1 iteration
          print("Number of False Positive/Negative: " + str(falsePosNeg))
          print("Number of True Positive/Negative: " + str(truePosNeg))
          errorRate = falsePosNeg / len(x) * 100
          print("Error rate: " + str(errorRate) + "%")

         '''add stop conditions'''
         if (errorRate < 25):
             break
         else:
             continue

도움과 도움을 주셔서 감사합니다.

  • 답변 # 1

    Perceptron Learning Algorithm (PLA)에는 임계 값이 필요하지 않습니다. 또한 PLA는 판별 및 예상 출력의 부호 만 일치해야합니다 (예 : sign(Discriminant) == d ) 따라서 실제 출력에 수렴 할 필요가 없습니다. 아래는 trainModel() 의 수정 된 버전입니다. .

    def trainModel(df, weights, constantC, constantK, maxIter):
    #grab the values in a list
    x = df['X'].values
    y = df['Y'].values
    d = df['Class'].values
    globalErrorRate = 0
    #define some variables to keep track
    numTurns = 0
    while numTurns < maxIter:
        localErrorRate = 0
        successRate = 0
        falsePosNeg = 0
        truePosNeg = 0
        for i in range(len(x)):
            #calculate the discriminant
            discriminant = weights[0] + (weights[1] * x[i]) + (weights[2] * y[i])
            if(isPos(discriminant) and d[i] == 1):
                truePosNeg += 1
            elif(isPos(discriminant) == False and d[i] == -1):
                truePosNeg += 1
            else:
                falsePosNeg += 1
                weights = weightsUpdate(weights, constantC, constantK, d[i], x[i], y[i])
        numTurns += 1 #increase number of turns by 1 iteration
        print("Number of False Positive/Negative: " + str(falsePosNeg))
        print("Number of True Positive/Negative: " + str(truePosNeg))
        localErrorRate = falsePosNeg / len(x) * 100
        successRate = truePosNeg / len(x) * 100
        print("Error rate: " + str(localErrorRate) + "%")
        print("Success rate: " + str(successRate) + "%")
        if successRate == 100:
            print("Trained Weight Values: " + str(weights))
            break
        else:
            continue
    
    

관련 자료

  • 이전 php - SQL 문을 MySQL에 저장하고 실행하십시오
  • 다음 android - "onChildChildClick"3 단계 확장 가능 목록보기