Como aplicar Lógica Difusa com R

Confira nosso curso online de QGIS

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 <- read.csv("[diretório]/dados.csv", head=TRUE, sep=",")

prec <- dados$precipitacao_mm

dist_rio <- 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 assine nossa lista de emails para receber nosso ebook "Como criar mapas de localização com ArcGIS 10.x".

Apostila Mapa de Localização Banner

Author: Fernando BS

Engenheiro Ambiental e de Segurança do Trabalho. Atua nas áreas de geoprocessamento, mineração e hidrologia. Busca soluções utilizando softwares como QGIS, R e Python.

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 um comentário

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