Codage flou - Fuzzy logic

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Julien Mocq
Messages : 25
Enregistré le : 12 Déc 2008, 15:13

Codage flou - Fuzzy logic

Messagepar Julien Mocq » 07 Oct 2010, 21:34

Bonjour à tous,

Dans ma quête du graal personnel, à savoir travailler sur R et abandonner Matlab, je me suis heurté à un petit problème.

Je travaille sur la méthode de codage flou (fuzzy coding method) sous matlab, et je souhaite passer sous R en modifiant les codes.

Matlab utilise une toolbox, la "Fuzzy logic toolbox". Simple d'utilisation, il convient à l'exercice basique que je réalise en ce moment: définir les bornes des fonctions d'appartenance de mes ensembles(définies par une dizaines d'experts), puis l’édition des regles IF-THEN jusqu'à la défuzzification. Graphiquement, ça ressemble à ça:

ImageImage

Je ne cherche pas un beau GUI ou de belles interfaces, je voudrais juste pouvoir définir mes ensembles flous et les traiter grâce à R.
J'ai eu beau chercher sur le site du CRAN, il ne me semble trouver que des utilisations plus complexes de la méthode de codage flou: compensatory fuzzy logic algorithms, Bonferroni method et autre polygonal fuzzy number... qui dépassent de loin mes connaissances basiques de la choses.
Bref, je ne vois pas quelle package est l'équivalent de la simple toolbox de Matlab.

Donc ma question tout bete est: est-ce que ce package existe? Sinon, quelqu'un aurait-il déjà essayé de le faire " à la main" qui accepterait d'en parler avec moi?

Merci d'avance pour ce coup de main.

Dominique Soudant
Messages : 758
Enregistré le : 23 Avr 2008, 11:12
Contact :

Messagepar Dominique Soudant » 08 Oct 2010, 08:30

Sans doute hors sujet : si j'étais utilisateur de MatLab et que je voulais m'en débarrasser, je me tournerais vers SciLab.

Une recherche Google avec "scilab fuzzy logic" me donne deux toolbox fuzzy logic en premier.

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 08 Oct 2010, 10:08

Salut

Pour avoir longuement creusé la question, il n'y a actuellement pas grand chose sous R.
Les packages que l'on retrouve concerne principalement l'arithmétique des nombres flous et pas réellement la modélisation en "IF-THEN rules".

Heureusement R regorge de possibilités pour arriver à ses fins.

Je suis dispo pour en discuter suivant ce que tu souhaites faire et dans la limite de mes capacités...

[EDIT] J'allais oublier de signaler le package sets qui me semble assez prometteur mais que je n'ai encore que peu utilisé...donc à voir mais il pourrait permettre de faire de l'inférence floue.

Nicolas

Julien Mocq
Messages : 25
Enregistré le : 12 Déc 2008, 15:13

Messagepar Julien Mocq » 08 Oct 2010, 14:33

Merci à vous pour vos réponses.

@Dominique: Je suis un preux croisé, loyal à mon seigneur et maitre R, pour pourfendre Matlab :)
Mais ne connaissant pas SciLab, j'irai voir à quoi ça ressemble.

@Nicolas: J'ai eu peur d’être passé à coté du package et de me faire fustiger, mais visiblement, ce n'est pas le cas.
Je me permettrai de vous contacter par mp. Je vais d'abord jeter un oeil au package sets qui parle en effet d'ensemble flou. Je ne comprends pas pourquoi R ne me l'avait pas proposé quand je lui faisais chercher le mot "fuzzy"..

Merci encore,à très bientôt


[EDIT]: Je confirme que je suis passé à coté du package sets qui fait le travail demandé avec les fonctions fuzzyfuns et fuzzyinference... Je vais travailler dessus, et éventuellement vous revenir ensuite. Merci encore pour la suggestion!

Julien Mocq
Messages : 25
Enregistré le : 12 Déc 2008, 15:13

Messagepar Julien Mocq » 13 Oct 2010, 19:53

Bonjour de nouveau, pour le même sujet.

Merci le package sets! C,est exactement ce que je cherchais, mais j'ai quelques soucis bêtes et méchants… Surtout que ça ne fonctionne pas, au final.

Pour faire simple, je travaille sur la qualité de l’habitat d’un poisson en fonction de 3 variables en utilisant la logique floue, ce qui me fait 4 ensembles flous avec des fonctions trapézoïdales. J’ai bien quelques interrogations à vous soumettre.

- Déjà, au départ, on définit l’univers avec sets_options("universe", seq(from = 0, to = 10, by = 0.1)) . Mes variables ont des univers différents : la variable Sub va de 0 à 1000cm, alors que Vit ne dépasse pas 7, et HSI est compris de 0 à 1. Dois-je prendre l’Univers le plus grand, ou celui de ma variable expliquée… Ou ça n’a pas d’importance? J’ai bien vu une influence du pas de 0.01 (qui m’a induit quelques erreurs au début), mais pour la grandeur de l’Univers, je me demande ce que je dois mettre (sachant qu'un Univers jusqu'à 1000 me ruine les graphiques des valeurs ne dépassant pas 1)

- Ensuite, j’ai défini mes ensembles. Là encore, je ne sais pas si je dois borner mes fonctions dans le négatif comme dans l'exemple, en dehors de l’Univers (ex : fuzzy_trapezoid(corners = c(-1, 0, 20, 50)) ) ou si je peux me permettre d’utiliser –Inf avec une fonction triangulaire. Visiblement, on ne peut avoir les bornes c( 0, 0,20, 50) parce qu’une valeur de x aurait plusieurs valeurs associées.

- Mes règles sont les 27 combinaisons possibles des 3 catégories des 3 variables Sub, Vit et Dep qui expliquent les valeurs de HSI.
J’imagine, selon l’exemple, que le symbole || signifie ET (ou OU… je ne suis pas sur)… C’est problématique, puisque je me persuade que mon souci vient de là : plot(fi) me donne toujours le même graphique en M et en faisant tourner la fin du script, j’obtiens systématiquement la valeur 0.5, quelques soient les valeurs de départ pour mes 3 variables… Un vrai casse-tête….
J’ai beau regardé, il n’y a pas d’erreur dans les définitions des règles, et remplacer les || par « AND » ne fonctionne pas.

Je m'excuse d'avance: cela fait pas mal de questions, peut-être des erreurs basiques, mais merci pour les aides appportées

Pour information, mon code est le suivant:


Code : Tout sélectionner

## set universe
sets_options("universe", seq(from = 0, to = 200, by = 0.1))

## set up fu
Sub=fuzzy_variable(SF = fuzzy_trapezoid(corners = c(-1, 0, 20, 50)),  SM = fuzzy_trapezoid(corners = c(20, 50, 120, 150)),   SG = fuzzy_trapezoid(corners = c(120, 150, 1000,1001)))
Vit=fuzzy_variable(VL = fuzzy_trapezoid(corners = c(-1, 0, 0.2, 0.4)),VM = fuzzy_trapezoid(corners = c(0.2, 0.4, 1.0, 1.5)), VF = fuzzy_trapezoid(corners = c(1.0, 1.5, 2, 7)))
Dep=fuzzy_variable(DS = fuzzy_trapezoid(corners = c(-1, 0, 0.5, 1)),  DM = fuzzy_trapezoid(corners = c(0.5, 1, 1.5, 2)),     DD = fuzzy_trapezoid(corners = c(1.5, 2, 10, 11)))
HSI=fuzzy_variable(HP = fuzzy_trapezoid(corners = c(-1, 0, 0.3, 0.5)),HM = fuzzy_triangular(corners = c(0.3, 0.5, 0.7)),     HH = fuzzy_trapezoid(corners = c(0.5, 0.7, 1, 1.01)))


variables <- set(Sub, Vit, Dep, HSI)


## set up rules
rules <-
set(
fuzzy_rule(Sub %is% SF || Vit %is% VL || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VL || Dep %is% DM, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VL || Dep %is% DD, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VM || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VM || Dep %is% DM, HSI %is% HM),
fuzzy_rule(Sub %is% SF || Vit %is% VM || Dep %is% DD, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VF || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VF || Dep %is% DM, HSI %is% HP),
fuzzy_rule(Sub %is% SF || Vit %is% VF || Dep %is% DD, HSI %is% HP),
fuzzy_rule(Sub %is% SM || Vit %is% VL || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SM || Vit %is% VL || Dep %is% DM, HSI %is% HM),
fuzzy_rule(Sub %is% SM || Vit %is% VL || Dep %is% DD, HSI %is% HM),
fuzzy_rule(Sub %is% SM || Vit %is% VM || Dep %is% DS, HSI %is% HM),
fuzzy_rule(Sub %is% SM || Vit %is% VM || Dep %is% DM, HSI %is% HH),
fuzzy_rule(Sub %is% SM || Vit %is% VM || Dep %is% DD, HSI %is% HM),
fuzzy_rule(Sub %is% SM || Vit %is% VF || Dep %is% DS, HSI %is% HM),
fuzzy_rule(Sub %is% SM || Vit %is% VF || Dep %is% DM, HSI %is% HH),
fuzzy_rule(Sub %is% SM || Vit %is% VF || Dep %is% DD, HSI %is% HH),
fuzzy_rule(Sub %is% SG || Vit %is% VL || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VL || Dep %is% DM, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VL || Dep %is% DD, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VM || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VM || Dep %is% DM, HSI %is% HM),
fuzzy_rule(Sub %is% SG || Vit %is% VM || Dep %is% DD, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VF || Dep %is% DS, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VF || Dep %is% DM, HSI %is% HP),
fuzzy_rule(Sub %is% SG || Vit %is% VF || Dep %is% DD, HSI %is% HP)
)


## combine to a system
system <- fuzzy_system(variables, rules)
print(system)
plot(system)


## plots variables
## do inference

fi <- fuzzy_inference(system, list(Sub = 10, Vit = 0.6, Dep= 4))


## plot resulting fuzzy set
plot(fi)


## defuzzify
gset_defuzzify(fi, "centroid")


## reset universe
sets_options("universe", NULL)

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 14 Oct 2010, 16:15

Salut,

Je ne peux pas aider directement comme ça sur les erreurs de code car comme je te l'ai indiqué je n'ai pas pratiqué le package sets. Mais comme je dois m'y mettre de toute façon je vais faire ça de mon côté afin de pouvoir te renseigner sur les éventuelles erreurs commises. Déjà il me semble étrange qu'on ne puisse pas introduire l'infini dans la spécification de la fonction d'appartenance.
Sauf erreur de ma part, une variable floue peut bien faire intervenir un nombre flou dont l'une des bornes est l'infinie afin de couvrir les univers de discours infini...Peut être faut il regarder du côté des fonctions permettant la définition des intervalles dans le package sets ?

Désolé de ne pouvoir apporter une aide pus concrète pour le moment.

A+ ici ou par mail.

Nicolas

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 18 Oct 2010, 12:33

J'ai commencer à potasser la doc et les papiers en relation avvec le package sets.

regarde de plus près mais il me semble que tu peux définir les univers pour chaque ensemble et pas seulement globalement (je te donne le code dès que je passe à la pratique :)...si je ne me trompe pas bien sûr !).
sauf dans de rares cas, ça n'a pas de sens de définir un univers global pour tout tes ensembles flous. Tout simplement parce que la fonction d'appartenance propre à chaque ensemble fait une correspondance entre l'univers de départ, qui donne le sens d'interprétation de l'ensemble, vers l'intervalle [0,1]. Il est donc important de définir l'univers de discours selon la définition de l'ensemble auquel tu t'intéresses.
L'univers n'est pas nécessairement borné mais si l'implémentation dans R requiert des valeurs finies alors assure toi de mettre des valeurs suffisament grandes pour ne pas être limité.

Pour la fonction fuzzy_trapezoid, ce n'est pas étonnant car les bornes que tu souhaites établir ne répondent pas strictement à ce qu'est une fonction trapézoidale. Normalement on devrait pouvoir le faire si les auteurs du package ont laissé un peu de souplesse dans la définition de la fonction d'appartenance. Encore une fois, il faudra que tu attendes ma pratique de la chose :)

Pour ton code, évite le signe "=" pour définir tes objets et préfère "<-". Regarde aussi dans le journal "Journal of statistical software", les auteurs y présentent le package sets dans un article intitulé "Generalized and Customizable Sets in R". Je crois que tu trouvera la réponse pour le "ET" et le "OU".

A+

Nicolas

Julien Mocq
Messages : 25
Enregistré le : 12 Déc 2008, 15:13

Messagepar Julien Mocq » 21 Oct 2010, 18:49

Je continue aussi à essayer le package.

je me suis demandé si effectivement, on pouvait utiliser une fonction dont l'une des bornes tend vers l'infini. Dans un tel cas, est ce que le centre de gravité ne vas pas tendre lui aussi vers l'infini?


Merci pour les références (et les conseils!), je vais continuer à potasser tout ça. Des heures de bonheur en perspective ;)

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 21 Oct 2010, 19:00

Salut si tu utilise par exemple la méthode des centroïdes pour defuzzifier tes données ton résultats tendra vers 1 si toutes tes valeurs de ta variables d'origine tendent vers l'infini. C'est à toi de bien spécifier tes bornes afin que les nombres flous obtenus représentent correctement ton univers de discours.

Nicolas

Cyrielle Jac
Messages : 55
Enregistré le : 13 Mar 2017, 08:30

Re: Codage flou - Fuzzy logic

Messagepar Cyrielle Jac » 18 Juin 2018, 08:54

Bonjour,

Désolée de déterrer un vieux sujet mais j'aimerais utiliser la logique floue pour calculer un indice de vulnérabilité pour mes espèces mais je ne trouves aucune informations (enfin que je suis en mesure de comprendre) sur comment faire cela sur R mis à part ce sujet.
Es ce que les questions posées précédemment ont été résolues?

Bonne journée

Cyrielle


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité