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)