dd/PA/code/fyzzy.py
2025-04-25 13:21:46 +04:00

67 lines
2.0 KiB
Python

import numpy as np
import skfuzzy as fuzz
import matplotlib.pyplot as plt
# Ãåíåðèðóåì ïðèìåð âðåìåííîãî ðÿäà ñ òðåíäîì è øóìîì
np.random.seed(42)
time = np.arange(0, 50)
data = 0.5 * time + np.random.normal(0, 2, size=time.shape)
plt.plot(time, data, label='Èñõîäíûé ðÿä')
plt.xlabel('Âðåìÿ')
plt.ylabel('Çíà÷åíèå')
plt.legend()
plt.show()
# Ïðåäïîëîæèì, ÷òî ìû èñïîëüçóåì 1 çàäåðæêó (ïðåäûäóùèé ìîìåíò âðåìåíè)
# Ñîçäàåì ìàññèâ âõîäíûõ äàííûõ
input_data = data[:-1]
target_data = data[1:]
# Îïðåäåëèì äèàïàçîí äëÿ âõîäíûõ äàííûõ
x = np.linspace(min(input_data), max(input_data), 100)
# Ñîçäàåì íå÷åòêèå ìíîæåñòâà äëÿ âõîäíûõ äàííûõ
low = fuzz.trimf(x, [min(input_data), min(input_data), np.mean(input_data)])
medium = fuzz.trimf(x, [np.min(input_data), np.mean(input_data), np.max(input_data)])
high = fuzz.trimf(x, [np.mean(input_data), np.max(input_data), np.max(input_data)])
# Âèçóàëèçèðóåì
plt.figure()
plt.plot(x, low, label='Íèçêèé')
plt.plot(x, medium, label='Ñðåäíèé')
plt.plot(x, high, label='Âûñîêèé')
plt.legend()
plt.title('Ôóíêöèè ïðèíàäëåæíîñòè äëÿ âõîäíûõ äàííûõ')
plt.show()
def fuzzy_predict(prev_value, x, low, medium, high):
# Âû÷èñëÿåì ñòåïåíè ïðèíàäëåæíîñòè
mu_low = fuzz.interp_membership(x, low, prev_value)
mu_medium = fuzz.interp_membership(x, medium, prev_value)
mu_high = fuzz.interp_membership(x, high, prev_value)
# Ïðàâèëà
# Ïðåäïîëîæèì, ÷òî ïðîãíîç — âçâåøåííîå ñðåäíåå
# Äëÿ ïðîñòîòû
forecast = (
mu_low * np.mean(target_data) +
mu_medium * np.mean(target_data) +
mu_high * np.mean(target_data)
) / (mu_low + mu_medium + mu_high + 1e-6) # èçáåãàåì äåëåíèÿ íà íîëü
return forecast
# Ïðîãíîçèðóåì ñëåäóþùèé ðÿä
predicted = []
for val in input_data:
pred = fuzzy_predict(val, x, low, medium, high)
predicted.append(pred)
# Âèçóàëèçàöèÿ
plt.plot(time[1:], target_data, label='Ðåàëüíûå äàííûå')
plt.plot(time[1:], predicted, label='Ïðîãíîç íå÷åòêîé ñèñòåìû')
plt.xlabel('Âðåìÿ')
plt.ylabel('Çíà÷åíèå')
plt.legend()
plt.title('Ïðîãíîçèðîâàíèå ñ ïîìîùüþ íå÷åòêîé ñèñòåìû')
plt.show()