Home › Fóruns › Fórum Lógica Fuzzy com Python: O Guia para Iniciantes › Ausência do Arquivo Colab da Gorjeta!
- Este tópico contém 3 respostas, 4 vozes e foi atualizado pela última vez 6 meses, 4 semanas atrás por Jones Granatyr.
- AutorPosts
- 17 de fevereiro de 2023 às 23:00 #39647
Prezados(as),
O arquivo do google colab do exemplo de gorjetas não está disponível. O arquivo que está lá é do aspirador de pó.
Podem disponibilizar o arquivo da gorjeta, por gentileza?
Grato!
13 de março de 2023 às 09:44 #39913bom dia Ronald,
Segue em código aqui um exemplo. Não tenho a opção de anexar arquivo pra você.
#installs
pip install -U scikit-fuzzy#imports
import numpy as np
import skfuzzy as fuzz
import matplotlib.pyplot as plt# Gerarando as variáveis do problema
# * varáveis de Qualidade e serviço em faixas de [0, 10]
# * a variável “x_tip” que traz o resultado com um intervalo de [0, 25]. Em unidades de pontos percentuais.
x_qual = np.arange(0, 11, 1)
x_serv = np.arange(0, 11, 1)
x_tip = np.arange(0, 26, 1)# Gera as variáveis para as funções de associação difusas
qual_lo = fuzz.trimf(x_qual, [0, 0, 5])
qual_md = fuzz.trimf(x_qual, [0, 5, 10])
qual_hi = fuzz.trimf(x_qual, [5, 10, 10])
serv_lo = fuzz.trimf(x_serv, [0, 0, 5])
serv_md = fuzz.trimf(x_serv, [0, 5, 10])
serv_hi = fuzz.trimf(x_serv, [5, 10, 10])
tip_lo = fuzz.trimf(x_tip, [0, 0, 13])
tip_md = fuzz.trimf(x_tip, [0, 13, 25])
tip_hi = fuzz.trimf(x_tip, [13, 25, 25])# Interliga as variáveis para a criação das funções de associação do problema.
#Cria o ambiente gráfico onde será cruzado os valores para a defuzzificação.
fig, (ax0, ax1, ax2) = plt.subplots(nrows=3, figsize=(8, 9))ax0.plot(x_qual, qual_lo, ‘b’, linewidth=1.5, label=’Mau’)
ax0.plot(x_qual, qual_md, ‘g’, linewidth=1.5, label=’Decente’)
ax0.plot(x_qual, qual_hi, ‘r’, linewidth=1.5, label=’Ótimo’)
ax0.set_title(‘Qualidade da comida’)
ax0.legend()ax1.plot(x_serv, serv_lo, ‘b’, linewidth=1.5, label=’Pobre’)
ax1.plot(x_serv, serv_md, ‘g’, linewidth=1.5, label=’Aceitável’)
ax1.plot(x_serv, serv_hi, ‘r’, linewidth=1.5, label=’Surpreendente’)
ax1.set_title(‘Qualidade do serviço’)
ax1.legend()ax2.plot(x_tip, tip_lo, ‘b’, linewidth=1.5, label=’Baixo’)
ax2.plot(x_tip, tip_md, ‘g’, linewidth=1.5, label=’Medio’)
ax2.plot(x_tip, tip_hi, ‘r’, linewidth=1.5, label=’Alto’)
ax2.set_title(‘Valor de gorjeta’)
ax2.legend()# Desliga os eixos superior/direito
for ax in (ax0, ax1, ax2):
ax.spines[‘top’].set_visible(False)
ax.spines[‘right’].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()plt.tight_layout()
(
Regras difusas
Agora, para tornar essa triângulação gráfica útil, definimos a relação difusa entre as variáveis de entrada e saída. Em nosso exemplo, considere três regras simples:
Se a comida for ruim OU o serviço for ruim, a gorjeta será baixa
Se o serviço for aceitável, a gorjeta será média
Se a comida for ótima OU o serviço for incrível, a gorjeta será alta.)
# Aqui configuramos as funções de associação difusa nos valores escolhidos:
# (Nesse caso) Os valores 8.0 (qualidade) e 6.5 (serviço).
# Para isso se utiliza o “fuzz.interp_membership”.qual_level_lo = fuzz.interp_membership(x_qual, qual_lo, 8.0)
qual_level_md = fuzz.interp_membership(x_qual, qual_md, 8.0)
qual_level_hi = fuzz.interp_membership(x_qual, qual_hi, 8.0)serv_level_lo = fuzz.interp_membership(x_serv, serv_lo, 6.5)
serv_level_md = fuzz.interp_membership(x_serv, serv_md, 6.5)
serv_level_hi = fuzz.interp_membership(x_serv, serv_hi, 6.5)# Agora se aplica as regras.
#Regra 1: diz respeito a comida OU serviço ruim.
active_rule1 = np.fmax(qual_level_lo, serv_level_lo)# função de associação “np.fmin” elimina o topo da saída correspondente. Removendo inteiramento para 0.
tip_activation_lo = np.fmin(active_rule1, tip_lo)# Regra 2, se conecta serviço aceitável à gorjeta média.
tip_activation_md = np.fmin(serv_level_md, tip_md)#Regra 3, se conecta serviço Surpreendente OU Ótima comida com alta gorjeta.
active_rule3 = np.fmax(qual_level_hi, serv_level_hi)
tip_activation_hi = np.fmin(active_rule3, tip_hi)
tip0 = np.zeros_like(x_tip)#Visualizando após a construção das regras
fig, ax0 = plt.subplots(figsize=(8, 3))ax0.fill_between(x_tip, tip0, tip_activation_lo, facecolor=’b’, alpha=0.7)
ax0.plot(x_tip, tip_lo, ‘b’, linewidth=0.5, linestyle=’–‘, )
ax0.fill_between(x_tip, tip0, tip_activation_md, facecolor=’g’, alpha=0.7)
ax0.plot(x_tip, tip_md, ‘g’, linewidth=0.5, linestyle=’–‘)
ax0.fill_between(x_tip, tip0, tip_activation_hi, facecolor=’r’, alpha=0.7)
ax0.plot(x_tip, tip_hi, ‘r’, linewidth=0.5, linestyle=’–‘)
ax0.set_title(‘Saída das atividades interligadas’)# Desliga os eixos superior/direito
for ax in (ax0,):
ax.spines[‘top’].set_visible(False)
ax.spines[‘right’].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()plt.tight_layout()
(
Agregação da Regra
Com a atividade de cada função de associação de saída conhecida, todas as funções de associação de saída devem ser combinadas.
Defuzzificação
Esse método é importante, pois ele estabelece um retorno ao usuário, que se encaixa na lógica anteriormente configurada. Porém o retorno vem de forma única e exata, depois de já ter tratado a questão da difusão. Ou seja, na perspectiva fuzzy que a comida % meio boa e % meio ruim. Em uma escala de 1-10. A comida está com 6.9 exatos de qualidade. E com isso definimos um valor de gorjeta!
A defuzzificação pode ser calculada com fórmulas diferentes, sendo elas:
centroid (centroid)
bisector (bisector)
mean of maximum (mom)
min of maximum (som)
max of maximum (lom))
#Agrega todas as três funções de associação de saída juntas
aggregated = np.fmax(tip_activation_lo, np.fmax(tip_activation_md, tip_activation_hi))# Calcula o resultado da defuzzificação.
tip = fuzz.defuzz(x_tip, aggregated, ‘centroid’)
#tip = fuzz.defuzz(x_tip, aggregated, ‘bisector’)
#tip = fuzz.defuzz(x_tip, aggregated, ‘mom’)
#tip = fuzz.defuzz(x_tip, aggregated, ‘som’)
#tip = fuzz.defuzz(x_tip, aggregated, ‘lom’)
tip_activation = fuzz.interp_membership(x_tip, aggregated, tip)# Visualização após aplicação dos conjuntos e defuzzificação
fig, ax0 = plt.subplots(figsize=(8, 3))ax0.plot(x_tip, tip_lo, ‘b’, linewidth=0.5, linestyle=’–‘, )
ax0.plot(x_tip, tip_md, ‘g’, linewidth=0.5, linestyle=’–‘)
ax0.plot(x_tip, tip_hi, ‘r’, linewidth=0.5, linestyle=’–‘)
ax0.fill_between(x_tip, tip0, aggregated, facecolor=’purple’, alpha=0.7)
ax0.plot([tip, tip], [0, tip_activation], ‘k’, linewidth=1.5, alpha=0.9)
ax0.set_title(‘Resutado agregado após a defuzzificação (LINHA)’)# Desliga os eixos superior/direito
for ax in (ax0,):
ax.spines[‘top’].set_visible(False)
ax.spines[‘right’].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()plt.tight_layout()
#Visualização do número calculado pela defuzzificação (LINHA)
print(“(Valor gorjeta) (LINHA) – Resultado: “, tip)31 de outubro de 2023 às 18:20 #42587Boa noite.
Ao invés de postar o código, poderia corrigir no link do material. Tive o mesmo problema.
22 de junho de 2024 às 10:13 #45485Checamos aqui e está corrigido 🙂
- AutorPosts
- Você deve fazer login para responder a este tópico.