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