Domanda

I am trying to implement the perceptron algorithm but am getting inconsistent results; I have noticed that the initialization of the weights is having a big impact. Is there anything I am blatantly doing wrong? Thanks!

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
È stato utile?

Soluzione

Perceptron is not globally optimized, so training results won't be consistent (they can vary each time you run your algorithm), and it depends on (among others) on weights initialization. This is the characteristics of gradient optimization of non-convex functions (which trianing a perceptron is an example of), not an implementation issue.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top