67 lines
2.0 KiB
Python
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() |