Perfilado de sección

  • Implementación en Python


    Descripción

    Esta sección proporciona una breve introducción al algoritmo de perceptrón y al conjunto de datos de la compuerta lógica AND que usaremos en este tutorial. NOTA: Se sugiere modificar el algoritmo para obtener el conjunto de datos de entrenamiento en forma estocástica.


    Inicialización

    import pandas as pd
    import numpy as np
    
    data = [[-1,-1, 1,-1],
            [-1, 1, 1,-1],
            [ 1,-1, 1,-1],
            [ 1, 1, 1, 1]]
    
    pd.DataFrame(data, index=list(range(len(data))), columns=['X1', 'X2','bias','Y'])

    Cálculo de la salida

    ### Ver sección "2.2 Evolución del perceptrón"###
    prediction = sign(np.dot(weight, training))
    

    Función de activación

    ### Ver sección "2.2 Evolución del perceptrón"###
    def sign(x):
        if x > 0:
            return 1.0
        elif x < 0:
            return -1.0
        else:
            return 1.0

    Cálculo del error

    ### Ver sección "2.4 Función de pérdida"###
    error = desired - prediction
    sse += error**2

    Actualización de los pesos

    ### Ver sección "2.3 Enseñar para que aprenda"###
    weight = weight + error * training
    

    Algoritmo Completo

    
    def sign(x):
        if x > 0:
            return 1.0
        elif x < 0:
            return -1.0
        else:
            return 1.0
        
    import pandas as pd
    import numpy as np
    
    data = [[-1,-1, 1,-1],
            [-1, 1, 1,-1],
            [ 1,-1, 1,-1],
            [ 1, 1, 1, 1]]
    
    pd.DataFrame(data, index=list(range(len(data))), columns=['X1', 'X2','bias','Y'])
    train_data = pd.DataFrame(data, index=list(range(len(data))), columns=['X1', 'X2','bias','Y'])
    train_Y = train_data.Y
    train_data = train_data[['X1', 'X2','bias']]
    train_data.head()
    
    weight = np.zeros(train_data.shape[1])
    
    for epoch in range(100):
        sse = 0.0
        for sample in range(train_data.shape[0]):
            training = train_data.loc[sample].values
            desired = train_Y.loc[sample]
            prediction = sign(np.dot(weight, training))
            error = desired - prediction
            sse += error**2
            weight = weight + error * training
        print(f'SSE: {sse}')
        if sse == 0:
            break
    print(f'Weights: {weight}, Epoch: {epoch+1}')