J'ai essayé d'implémenter le perceptron artificiel avec python

Le livre que j'ai lu

"[2e édition] Python Machine Learning Programming Expert Data Scientist Theory and Practice (impress top gear)"

↑ Je joue avec différentes données, mais en gros, je viens de faire le chapitre 2 de ce livre.


2. Formation aux problèmes de classification d'algorithmes d'apprentissage automatique simples

fig1 Ceci est un schéma simple du concept de base de Perceptron (cité dans le chapitre 2 de "Théorie et pratique par des experts en programmation d'apprentissage machine Python")

Règles d'apprentissage précoce de Perceptron

  1. Initialisez le poids $ \ mathbf {w} $ avec 0 ou un petit nombre aléatoire

  2. Pour chaque exemple d'apprentissage $ \ mathbf {x} ^ {(i)} $, procédez comme suit:

  3. Calculez la valeur de sortie $ \ hat {y} $

  4. Mettez à jour le poids

w_j := w_j + \Delta w_j
\Delta w_j = \eta (y^{(i)} - \hat{y}^{(i)}) x^{(i)}_j

$ \ eta $ est le taux d'apprentissage (généralement une constante supérieure à 0,0 et inférieure à 1,0) $ y ^ {(i)} $ est le vrai label de classe du i-ème échantillon d'apprentissage, $ \ hat {y} ^ {(i)} $ est l'étiquette de classe prédite.

La valeur prédite $ \ hat {y} ^ {(i)} $ est

z = w_0 x_0 + w_1 x_1 + ... + w_m x_m = \mathbf{w^T x}

et

fig1

Est déterminé par.

Perceptron est linéairement séparable et la convergence n'est garantie que lorsque le taux d'apprentissage est suffisamment faible.

2.2 Implémenter l'algorithme d'apprentissage de Perceptron en Python

2.2.1 API Perceptron orientée objet

import numpy as np
class Perceptron(object):
    """Classificateur Perceptron
    
Paramètres
    -----------
    eta : float
Taux d'apprentissage(0.Supérieur à 0 1.Valeur inférieure ou égale à 0)
    n_iter : int
Nombre de formations dans les données de formation
    random_state : int
Graine aléatoire pour l'initialisation du poids
attribut
    -----------
    w_ :Tableau à 1 dimension
Poids après conformité
    errors_ :liste
Nombre d'erreurs de classification (mises à jour) à chaque époque
    """
    def __init__(self, eta=0.01, n_iter=50, random_state=1):
        self.eta = eta
        self.n_iter = n_iter
        self.random_state = random_state
        
    def fit(self, X, y):
        """S'adapte aux données d'entraînement
        
Paramètres
        ------------
        X : {Structure de données de type tableau}, shape = [n_samples, n_features]
Données d'entraînement
            n_samples est le nombre d'échantillons, n_fonctionnalités est le nombre de fonctionnalités
        y :Structure de données de type tableau, shape = [n_samples]
Variable objective
            
Valeur de retour
        ------------
        self : object
        """
        rgen = np.random.RandomState(self.random_state)
        self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1])
        self.errors_ = []

        for _ in range(self.n_iter): #Répétez les données d'entraînement pour le nombre de formations
            errors = 0
            for xi, target in zip(X, y): #Mettre à jour les poids dans chaque échantillon
                #Poids w_1, ..., w_m mise à jour
                # Δw_j = η (y^(i)vraie valeur- y^(i)Prévoir) x_j (j = 1, ..., m)
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                #Poids w_Mettre à jour 0 Δw_0 = η (y^(i)vraie valeur- y^(i)Prévoir)
                self.w_[0] += update
                #Si la mise à jour du poids n'est pas 0, elle est considérée comme une erreur de classification.
                errors += int(update != 0.0)
            #Erreur de stockage pour chaque itération
            self.errors_.append(errors)
        return self

    def net_input(self, X):
        """Calculer l'entrée totale"""
        return np.dot(X, self.w_[1:]) + self.w_[0]
    
    def predict(self, X):
        """Renvoie le libellé de la classe après une étape"""
        return np.where(self.net_input(X) >= 0.0, 1, -1)

2.3 Formation du modèle Perceptron avec le jeu de données Iris

from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
# df.loc[df['target'] == 0, 'target'] = "setosa"
# df.loc[df['target'] == 1, 'target'] = "versicolor"
# df.loc[df['target'] == 2, 'target'] = "virginica"
df.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0
import seaborn as sns
sns.pairplot(df, hue='target')

output_6_1.png

Puisqu'il s'agit d'une classification binaire, nous nous limiterons à deux types qui peuvent être séparés linéairement.

De plus, les caractéristiques sont réalisées en deux dimensions afin qu'elles puissent être vues visuellement.

Les étiquettes 0 et 2 doivent être appropriées et peuvent être grossièrement séparées. (Je veux utiliser quelque chose de différent du livre)

import numpy as np
import matplotlib.pyplot as plt
df2 = df.query("target != 1").copy() #Exclure l'étiquette 1
df2["target"] -= 1 #Étiquette 1-Aligner sur 1

plt.scatter(df2.iloc[:50, 3], df2.iloc[:50, 1], color='blue', marker='o', label='setosa')
plt.scatter(df2.iloc[50:, 3], df2.iloc[50:, 1], color='green', marker='o', label='virginica')
plt.xlabel('petal width [cm]')
plt.ylabel('sepal width [cm]')
plt.legend(loc='upper left')
plt.show()

output_8_0.png

Le diagramme de paires ci-dessus a été extrait et tracé de la même manière que le premier à partir de la droite et le second à partir du haut.

Ces données sont utilisées pour entraîner l'algorithme de Perceptron.

X = df2[['petal width (cm)', 'sepal width (cm)']].values
Y = df2['target'].values

ppn = Perceptron(eta=0.1, n_iter=10)
ppn.fit(X, Y)
plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Number of update')
plt.show()

output_10_0.png

On voit que le Perceptron a convergé à la 6e époque.

Implémentez une fonction simple et pratique pour visualiser les limites de décision.

from matplotlib.colors import ListedColormap

def plot_decision_regions(X, y, classifier, resolution=0.02):
    
    #Préparation des marqueurs et des cartes de couleurs
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    
    #Diagramme de la zone de décision
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    #Générer des points de grille
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    #Prédire en convertissant chaque entité en un tableau unidimensionnel
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    #Conversion des résultats de prédiction en taille de données de point de grille d'origine
    Z = Z.reshape(xx1.shape)
    #Tracé de contour de point de grille
    plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap)
    #Réglage de la plage d'axe
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())
    
    #Tracer des échantillons par classe
    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x=X[y == cl, 0],
                    y=X[y == cl, 1],
                    alpha=0.8,
                    c=colors[idx],
                    marker=markers[idx],
                    label=cl,
                    edgecolor='black')
#Diagramme de la zone de décision
plot_decision_regions(X, Y, classifier=ppn)
plt.xlabel('petal width [cm]')
plt.ylabel('sepal width [cm]')
plt.legend(loc='upper left')
plt.show()

output_13_0.png

Si vous ne pouvez pas le diviser, essayez-le.

Prédiction: Elle ne converge pas et s'arrête à la limite du nombre d'époques. l'erreur sera probablement meilleure.

import numpy as np
import matplotlib.pyplot as plt
df3 = df.query("target != 0").copy() #Exclure l'étiquette 0
y = df3.iloc[:, 4].values
y = np.where(y == 1, -1, 1) #étiquette 1-Définissez les autres (étiquette 2) sur 1

plt.scatter(df3.iloc[:50, 1], df3.iloc[:50, 0], color='orange', marker='o', label='versicolor')
plt.scatter(df3.iloc[50:, 1], df3.iloc[50:, 0], color='green', marker='o', label='virginica')
plt.xlabel('sepal width [cm]')
plt.ylabel('sepal length [cm]')
plt.legend(loc='upper left')
plt.show()

output_15_0.png

Le troisième en partant de la droite et le premier en partant du haut du diagramme de paires ci-dessus ont été extraits et tracés de la même manière.

X2 = df3[['sepal width (cm)', 'sepal length (cm)']].values

ppn = Perceptron(eta=0.1, n_iter=100)
ppn.fit(X2, y)
plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Number of update')
plt.show()

#Diagramme de la zone de décision
plot_decision_regions(X2, y, classifier=ppn)
plt.xlabel('sepal width [cm]')
plt.ylabel('sepal length [cm]')
plt.legend(loc='upper left')
plt.show()

output_17_0.png

output_17_1.png

Pas du tout classé. Visuellement, plus y est grand, plus l'étiquette 1 est, donc j'ai pensé qu'elle serait séparée correctement lorsque y = 6, mais il semble que ce ne soit pas le cas.

J'ai une note sur Gist.

Ensuite, je ferai ADALINE.

Recommended Posts

J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'envoyer un email avec SendGrid + Python
J'ai essayé d'implémenter le tri sélectif en python
J'ai essayé de gratter avec Python
J'ai essayé d'implémenter PCANet
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'implémenter StarGAN (1)
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le poker de Drakue en Python
J'ai essayé d'implémenter GA (algorithme génétique) en Python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé d'implémenter SSD avec PyTorch maintenant (Dataset)
J'ai essayé de trouver la classe alternative avec tensorflow
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
J'ai essayé d'implémenter Deep VQE
J'ai essayé de toucher Python (installation)
J'ai essayé webScraping avec python.
J'ai essayé de mettre en place une validation contradictoire
J'ai envoyé un SMS avec Python
J'ai essayé d'implémenter Realness GAN
Je veux déboguer avec Python
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python
J'ai essayé de mettre en œuvre une évasion (type d'évitement de tromperie) avec Quantx
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
Mayungo's Python Learning Episode 3: J'ai essayé d'imprimer des nombres
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python