Responder a: Ausência do Arquivo Colab da Gorjeta!

Home Fóruns Fórum Lógica Fuzzy com Python: O Guia para Iniciantes Ausência do Arquivo Colab da Gorjeta! Responder a: Ausência do Arquivo Colab da Gorjeta!

#39913

bom 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)