es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MLPClassifier de scikit no pudo ajustar el problema xor

Mi profesor nos pidió que usáramos MLPClassifier de scikit para resolver el problema xor, y nos pidió que usáramos 2 capas ocultas, la primera con 4 unidades y la segunda con 2 unidades, y que utilizáramos la función de activación identidad y el solver lbfgs.

x = [[0, 0], [0, 1], [1, 0], [1, 1]]
y = [0, 1, 1, 0]
clf = MLPClassifier(hidden_layer_sizes=(4, 2), activation='identity', solver='lbfgs')
clf.fit(x, y)
clf.predict(x)
# output: array([1, 0, 0, 0])

No entiendo por qué no predice correctamente, pensé que cualquier combinación de funciones lineales podría resolver un problema no lineal.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Aunque es cierto que cualquier combinación de funciones lineales puede Resolver un problema no lineal, puede que no sea la forma más eficiente de hacerlo. El problema con el código proporcionado es que la función de activación utilizada es la identidad, que es una función lineal. Para el problema XOR, que es no lineal, se debe utilizar una función de activación no lineal como la sigmoidal o relu. Aquí está el código actualizado:

    from sklearn.neural_network import MLPClassifier
    import numpy as np
    
    # Definir los datos de entrada y salida
    X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
    y = np.array([0, 1, 1, 0])
    
    # Definir el MLPClassifier con 2 capas ocultas, la primera con 4 unidades
    # y la segunda con 2 unidades, y relu como función de activación
    clf = MLPClassifier(hidden_layer_sizes=(4, 2), activation='relu', solver='lbfgs')
    
    # Entrenar el modelo
    clf.fit(X, y)
    
    # Predecir utilizando el modelo entrenado
    print(clf.predict(X))
    

    Cuando se ejecuta el código con la función de activación actualizada, predice correctamente las salidas de XOR:

    [0 1 1 0]
    

    Por lo tanto, el problema con el código inicial fue el uso de una función de activación lineal, y actualizarla a una función de activación no lineal resolvió el problema.

Comments are closed.