Como aplicar Lógica Difusa com R

Veja como criar um sistema de inferência difuso utilizando programação em R. Criamos um exemplo fictício para alertas de inundações com Lógica Difusa, veja como criar o seu.

Já publicamos uma postagem explicando o que é lógica difusa e alguns exemplos de seu uso (veja postagens clicando aquiaqui), agora, vamos praticar um pouco dela utilizando o software de estatística R e o pacote FuzzyToolkitUoN.

Faremos um exemplo pensando numa bacia hidrográfica fictícia, onde temos problemas de inundação e gostaríamos de criar um sistema para alertar a população de determinados bairros alvos.

Para tal sistema, simplificaremos as coisas usando apenas duas variáveis, 1) Precipitação e 2) Distância do Rio.

A partir delas, iremos desenvolver nosso sistema de inferência difusa.

Criaremos nosso sistema no software R, sendo que apresentaremos os códigos e suas explicações ao longo da postagem.

Lógica Difusa com R

Iniciaremos instalando os pacotes necessários (comando install.packages), ou seja, FuzzyToolkitUoN e splines, e carregando eles no nosso sistema (comando library).


install.packages("splines")

install.packages("FuzzyToolkitUoN")

library(splines)

library(FuzzyToolkitUoN)

Agora que já instalamos e carregamos os pacotes, iremos importar nossa tabela de dados (comando read.csv) com os dados de precipitação e distância do rio e dividi-los em 2 variáveis.

Clique aqui > dados < para baixar um exemplo e seguir nosso tutorial (você terá que converter o arquivo xls para csv – e para isso basta abrir o arquivo no Excel e clicar em Arquivo > Salvar como e salvar como csv).


dados &lt;- read.csv("[diretório]/dados.csv", head=TRUE, sep=",")

prec &lt;- dados$precipitacao_mm

dist_rio &lt;- dados$dist_rio_m

Vale lembrar que o R também importa outros tipos de tabela (e.g. csv), mas prefiro trabalhar com csv (que também pode ser criada e manipulada no Calc ou no Excel).

E lembre-se de substituir [diretório] pelo caminho onde você salvou o arquivo.

Agora, vamos utilizar as funções do pacote de lógica difusa, criaremos o sistema de inferência difusa (comando newFIS), adicionaremos variáveis de entrada (inputs) e suas funções de pertinência (comandos addVar e addMF, respectivamente).


SIF_chuva <- newFIS("SIF_chuva", FISType="mamdani", andMethod="min", defuzzMethod="centroid")

SIF_chuva <- addVar(SIF_chuva, "input", "Precipitação", 0:50)

prec_alerta <- trapMF("prec_alerta", 0:50, c(0, 25, 50, 50, 1))

prec_ok <- trapMF("prec_ok", 0:50, c(0, 0, 25, 50, 1))

SIF_chuva <- addMF(SIF_chuva, "input", 1, prec_alerta)

SIF_chuva <- addMF(SIF_chuva, "input", 1, prec_ok)

SIF_chuva <- addVar(SIF_chuva, "input", "Distância do Rio", 0:100)

dist_alerta <- trapMF("dist_alerta", 0:100, c(0, 0, 25, 50, 1))

dist_ok <- trapMF("dist_ok", 0:100, c(25, 50, 100, 100, 1))

SIF_chuva <- addMF(SIF_chuva, "input", 2, dist_alerta)

SIF_chuva <- addMF(SIF_chuva, "input", 2, dist_ok)

Definimos assim duas funções de pertinência do tipo trapezoidal (comando trapMF) para cada variável, ou seja, uma função para dizer quando vai inundar e quando não vai inundar (lembrando que os parâmetros adotados são fictícios, sendo que em casos reais eles devem ser definidos por especialistas e dados concretos).

Agora, vamos seguir os mesmos procedimentos anteriores, só que para criar os parâmetros de saída (outputs).


SIF_chuva <- addVar(SIF_chuva, "output", "Nível de Alerta", 0:10)

N_Alto <- trapMF("Alto", 0:10, c(6, 7, 10, 10, 1))

N_Medio <- trapMF("Médio", 0:10, c(3, 5, 6, 7, 1))

N_Baixo <- trapMF("Baixo", 0:10, c(0, 0, 3, 5, 1))

SIF_chuva <- addMF(SIF_chuva, "output", 1, N_Alto)

SIF_chuva <- addMF(SIF_chuva, "output", 1, N_Medio)

SIF_chuva <- addMF(SIF_chuva, "output", 1, N_Baixo)

A partir dos nossos parâmetros de entrada e de saída, criaremos um sistema de regras das situações possíveis, conferindo para cada situação diferentes níveis de alerta.

SE Precipitação = Alerta E Distância do Rio = Alerta ENTÃO Nível de Alerta = Alto

SE Precipitação = Alerta E Distância do Rio = Ok ENTÃO Nível de Alerta = Médio

SE Precipitação = Ok E Distância do Rio = Alerta ENTÃO Nível de Alerta = Médio

SE Precipitação = Ok E Distância do Rio = Ok ENTÃO Nível de Alerta = Baixo

Para utilizarmos esse sistema de regras, precisamos converte-lo para uma tabela, logo, teremos na primeira coluna as possibilidades da precipitação (1 = Alerta; 2 = Ok); na segunda as possíveis distâncias do rio (1 e 2); na terceira os níveis de alerta (1 = Alto, 2 = Médio, 3 = Baixo).

É possível também colocar pesos (quarta coluna) e alterar o operador da regra (E = 1, OU = 2) (quinta coluna), no nosso caso, vamos atribuir pesos iguais a 1 para todas as regras e como estamos utilizando o operador E, na quinta coluna utilizaremos o valor 1.

Você pode baixar a planilha clicando em > regras < (não esqueça de converte-lo para csv).

Da mesma que importamos nossa tabela de dados, iremos importar nosso sistema de regras, transformando ele posteriormente em matriz (comando as.matrix) e adicionaremos as regras ao nosso sistema de inferência difusa (comando addRule).


regras <- read.csv(file="[diretório]/regras.csv", header=FALSE, stringsAsFactors = FALSE, colClasses="numeric")

regras <- as.matrix(regras)

SIF_chuva <- addRule(SIF_chuva, regras)

Por fim, temos nosso sistema de inferência difusa completo.

Agora iremos criar uma variável com nossos dados de entrada e vamos submete-los ao nosso sistema (comando evalFIS) e verificar se algum bairro esta com nível de alerta alto.


saida <- matrix(c(cbind(prec), cbind(dist_rio)), 9, 2)

resultados <- evalFIS(saida, SIF_chuva)

Nossos resultados

Analisando a variável resultados, temos três níveis de alerta (7,09; 6,29 e 3,36), onde o primeiro é paras locais a 15 metros do rio, ou seja, nessa situação (precipitação de 30 mm) temos um alerta de nível alto (7,09), locais a 30 metros também apresentam um certo nível de alerta (6,29); enquanto locais a 50 metros do rio apresentam risco baixo (3,36). Lembrando que definimos que os níveis de alerta variam entre 0 e 10.

Embora tenha sido uma aplicação simples, sistemas de inferência difusa podem tornarem-se complexos quando há um maior número de variáveis e regras.

Porém, nessa simples aplicação, é possível verificar o seu grande potencial em diversas áreas.

Caso você tenha dificuldades ou algo não ficou claro, não hesite em perguntar, use nossos comentários e responderemos assim que possível.



Clique na figura abaixo e responda nosso questionário para receber nosso ebook "Como criar mapas de localização com ArcGIS 10.x".


Author: Fernando BS

Engenheiro Ambiental e de Segurança do Trabalho. Atua nas áreas de recuperação ambiental, geoprocessamento e ciência do solo. Busca soluções utilizando softwares como ArcGIS, R e MATLAB.

One thought on “Como aplicar Lógica Difusa com R”

  1. Muito legal! Como sempre tenho dito, o conhecimento não é propriedade exclusiva minha ou sua, ele é de propriedade humana e, portanto, deve ser compartilhado. Parabéns pela iniciativa e continue nessa linha! Sucesso Sempre!!!!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *