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 aqui e aqui), 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.
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!!!!