Perceptron - utilisation de "Do While" et le comptage du nombre de boucles

pascal82

XLDnaute Occasionnel
Bonjour,

J'ai réalisé l'implémentation d'un perceptron neurone simple couche selon l'algorithme de Widrow-Hoff (mise à jour des poids après chaque vecteur)
Mon problème viens de l'utilisation de "Do While" et le comptage du nombre de boucles. En effet prenons 3 exemples pour montrer l'incohérence de ma programmation
Exemple 1 : Vous fixez le nombre max d'itérations >= 12 (J3)=> pas d'alarme, le programme converge avec 12 itérations
Exemple 2 : Vous fixez le nombre max d'itérations à 11 (J3)=> alarme, cependant le programme converge avec 12 itérations
Exemple 3 : Vous fixez le nombre max d'itérations < 11 (J3)=> alarme, le programme ne converge pas, pas de séparation des 2 groupes
Cela fait plusieurs jours que je tourne pour localiser ma bêtise mais je n'arrive pas a la cerner

Merci par avance
 

Pièces jointes

  • PerceptronSimple.xls
    68.5 KB · Affichages: 87

MichD

XLDnaute Impliqué
Re : Perceptron - utilisation de "Do While" et le comptage du nombre de boucles

Bonjour,


à cette ligne de code :

If i > t Then Exit Do 'permet de verifier la convergeance

Si tu la modifies ainsi :
If i >= t Then Exit Do 'permet de vérifier la convergence

Ton message ne s'affiche jamais.

Dans la grande boucle :
'--------------------------
Do While (j > 0)

Loop
'--------------------------

La valeur de J devient 0 seulement si
'--------------------------
If y <> g Then
'Le code
J = J+1
end if
'--------------------------

En fait, ce n'est pas le nombre de boucle indiquée en J3
qui compte, mais si If y <> g Then est au moins vrai pour
une fois dans la seconde boucle.
 

pascal82

XLDnaute Occasionnel
Re : Perceptron - utilisation de "Do While" et le comptage du nombre de boucles

Bonsoir,

@ MichD: Merci pour tes explications. N'arrivant pas a me dépatouiller pour résoudre mon problème, j'ai modifié le programme afin que s'il ne converge pas avant le nombre d'itérations max autorisés (situé en J3) alors je force les poids "wi" et le biais "b" à "0" pour cacher la misère.
Je pense que mon problème vient de la structure mais je n'ai plus d'idée.

Cordialement

Code:
Sub EnTest()
Dim b!, w1!, w2!, t%, alpha!, y!
Dim g%, i%, j%, k%
Application.ScreenUpdating = False

w1 = 0.1
w2 = 0.1
alpha = Range("f3")          'coef apprentissage
b = 0                        'valeur du biais
t = Range("j3")              'Nombre maximum d'iterations autorisés
Sheets("B").Select
j = 1

'boucle itération tant que j>0
Do While (j > 0)
j = 0

'boucle sur les données
    For k = 0 To 7                           'lignes d'apprentissage
    g = Range("c3").Offset(k, 0)             'défini la classe

'vecteur apprentissage
        y = (Range("a3").Offset(k, 0) * w1) + (Range("b3").Offset(k, 0) * w2) + b
        If y > 0 Then y = 1 Else y = -1      'Fonction seuil, renvoie 1 si y > 0 sinon -1
               
'test pour mise à jour des poids
        If y <> g Then
        w1 = w1 + (Range("a3").Offset(k, 0) * alpha * g)
        w2 = w2 + (Range("b3").Offset(k, 0) * alpha * g)
        b = b + g * alpha
        j = j + 1              'compte si mise a jour pour boucle do while
        End If

    Next
    
    i = i + 1                 'compte le nombre de cycle avec mise à jour
    If i > t Then Exit Do     'permet de verifier la convergence
Loop

If i > t Then
MsgBox "Pas de convergence, augmentez le nombre en J3 " ' affichage
w1 = 0
w2 = 0
b = 0
End If
'affichage des résultats
Range("g3") = w1
Range("h3") = w2
Range("i3") = b
Range("K3") = i
Application.ScreenUpdating = True
End Sub
 

MichD

XLDnaute Impliqué
Re : Perceptron - utilisation de "Do While" et le comptage du nombre de boucles

Comme je n'ai aucune idée de ce que la procédure doit effectuer
comme travail, je peux expliquer le pourquoi mais je ne peux pas
modifier ce qu'il y a à l'intérieur de la boucle ne connaissant pas
les fins de la procédure.

Tant mieux si tu as trouvé un moyen de contournement.
 

pascal82

XLDnaute Occasionnel
Re : Perceptron - utilisation de "Do While" et le comptage du nombre de boucles

Bonsoir,

Je peux tenter de t'expliquer le but du programme.
Le perceptron est un apprentissage supervisé, et il va donc apprendre petit a petit en corrigeant ces erreurs.
Dans cette exemple, j'ai affecté 1 série de données composé de 2 groupes (A et B)dont la position de chaque point a son abscisse en Ai et son ordonné en Bi, pour différencier les groupes j'ai affecté en colonne C, 1 pour le groupe A et -1 pour le groupe B. Il y a donc 8 éléments a séparer en 2 groupes.
Chaque élément est passer par le vecteur d'apprentissage (boucle k) pour calculer y. pour chaque élément, nous faisons y =(x1*w1)+(x2*w2)+b .Il faut donc que k boucle de 0 à 7 pour passer tous les éléments
Si y est positif alors je fixe y =1 et -1 si y<0
Comme y = 1 ou y- 1,alors je le compare à g qui est le choix du groupe d'appartenance(A ou B). Si y est différent de g alors j'ajuste les coef w1,w2 et b.
Sur le passage des 8 éléments j'incrémente un compteur (j) uniquement dans le cas d'une modification de coefficient. je fais repasser ces 8 éléments tant qu'il y aura a minima une modif de coef
Si lors du passage des 8 éléments aucun coefficient (w1,w2,b) n'est modifié (j=0 ) alors j'arrête la boucle (l'intérêt du do while)
Pour éviter une boucle infinie, je fixe un nombre de boucle maximum (en j3) a ne pas dépasser. Si le programme converge (plus de modification de coef) avec un nombre de boucle < a J3 => RAS. Par contre si on atteint la valeur en J3 et qu'il y a toujours une modif de coef alors MsgBox sur la non convergence.
Explication de texte longue et fastidieuse il faut le reconnaitre.

Cordialement
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 070
Membres
103 453
dernier inscrit
Choupi