import numpy as np import skfuzzy as fuzz import matplotlib.pyplot as plt # Określenie dziedziny dla zmiennych:wejściowej i wyjściowej temp = np.arange(-10, 40, 1) customers = np.arange(0, 35, 1) # Przyjęto 3 wartości lingwistyczne dla temperatury: hot, mederate, cool # Funkcja przynależności dla temperatury t_hot = fuzz.trimf(temp, [25, 40, 40]) #funkcja trójkątna t_moderate = fuzz.trimf(temp, [10, 25, 40]) #funkcja trójkątna t_cool = fuzz.trapmf(temp, [-10, -10, 10, 25]) #funkcja trapezoidalna # Użycie innego rodzaju f. przynalżności: gaussa # t_hot = fuzz.gauss2mf(temp, 30, 5, 40, 5) # t_moderate = fuzz.gaussmf(temp, 20, 5) # t_cool = fuzz.gauss2mf(temp, -10, 5, 0, 5) # Przyjęto 3 wartości lingwistyczne dla liczby klientów: crowded, busy, quiet # Funkcja przynależności dla dla liczby klientów c_crowded = fuzz.trimf(customers, [24, 35, 35]) c_busy = fuzz.trimf(customers, [0, 24, 35]) c_quiet = fuzz.trimf(customers, [0, 0, 24]) # Wizualizacja przynależności dla temperatury fig, [ax1, ax2] = plt.subplots(nrows=2, ncols=1) ax1.plot(temp, t_hot, 'r', temp, t_moderate, 'm', temp, t_cool, 'b') ax1.set_ylabel('Przynależność') ax1.set_xlabel('Temperatura (Celsius)') ax1.set_ylim(-0.1, 1.1) # Wizualizacja przynależności dla liczby klientów ax2.plot(customers, c_quiet, 'c', customers, c_busy, 'm', customers, c_crowded, 'ForestGreen') ax2.set_ylabel('Przynależność') ax2.set_xlabel('Liczba klientów') ax2.set_ylim(-0.1, 1.1) plt.show() # Reguły rozmyte iloczyn (nie ma znaczenia, bo na wejściu jest 1 zmienna) # R1 - Jeżeli gorąco, to tłoczno R1 = fuzz.relation_product(t_hot, c_crowded) # R2 - Jeżeli umiarkowanie, to normalne zainteresowanie R2 = fuzz.relation_product(t_moderate, c_busy) # R3 - Jeżeli zimno, to pusto R3 = fuzz.relation_product(t_cool, c_quiet) # R1 = fuzz.relation_min(t_hot, c_crowded) # R2 = fuzz.relation_min(t_moderate, c_busy) # R3 = fuzz.relation_min(t_cool, c_quiet) # Złożenie reguł (agregacja) z użyciem operatora max R_combined = np.fmax(R1, np.fmax(R2, R3)) # Wizualizacja w postaci powierzchni decyzyjnej/modelu/prognostycznej plt.figure(2) plt.imshow(R_combined) cbar = plt.colorbar() cbar.set_label('Przynależność') plt.yticks([i * 10 for i in range(6)], [str(i * 10 - 10) for i in range(6)]) plt.ylabel('Temperatura') plt.xlabel('Liczba klientów') plt.show() # Wysotrzanie by uzyskać wartości ostre # fuzz.defuzz Wyostrzanie metodą środka ciężkości 'centroid' print("Liczba klientów przy temp. 35 st. Celsiusza:", fuzz.defuzz(customers, R_combined[temp == 35], 'centroid').round()) #Wyniki dla całej przestrzeni wejść predicted_customers = np.zeros_like(temp) for i in range(len(temp)): predicted_customers[i] = fuzz.defuzz(customers, R_combined[i, :], 'centroid') # Wizualizacja plt.figure(3) plt.subplot(1, 2, 1) # Liczba klientów dla temp. 35 st C plt.plot(temp, predicted_customers, 'k') plt.vlines(35, 5, predicted_customers[temp == 35], color='DarkOrange', linestyle='dashed', lw=2) plt.hlines(predicted_customers[temp == 35], -10, 35, color='DarkOrange', linestyle='dashed', lw=2) plt.xlabel('Temp') plt.ylabel('Liczba klientów') plt.subplot(1, 2, 2) # Liczba klientów dla temp. -1 st C plt.plot(temp, predicted_customers, 'k') plt.vlines(-1, 5, predicted_customers[temp == -1], color='DarkOrange', linestyle='dashed', lw=2) plt.hlines(predicted_customers[temp == -1], -10, -1, color='DarkOrange', linestyle='dashed', lw=2) plt.xlabel('Temp') plt.ylabel('Liczba klientów') plt.show()