import numpy as np import skfuzzy as fuzz import matplotlib.pyplot as plt # Генерируем синтетический временной ряд с тенденцией np.random.seed(42) time = np.arange(0, 50) trend = 0.5 * time + np.random.normal(0, 2, size=time.shape) plt.plot(time, trend, label='Данные временного ряда') plt.xlabel('Время') plt.ylabel('Значение') plt.title('Пример временного ряда') plt.legend() plt.show() # Определение универсальных множеств для текущих значений value_range = np.linspace(min(trend), max(trend), 100) # Нечеткие множества (термы): 'низкий', 'средний', 'высокий' low = fuzz.trimf(value_range, [min(trend), min(trend), np.median(trend)]) medium = fuzz.trimf(value_range, [min(trend), np.median(trend), max(trend)]) high = fuzz.trimf(value_range, [np.median(trend), max(trend), max(trend)]) # Визуализация plt.figure() plt.plot(value_range, low, label='Низкий') plt.plot(value_range, medium, label='Средний') plt.plot(value_range, high, label='Высокий') plt.title('Нечеткие множества значений') plt.xlabel('Значение') plt.ylabel('Принадлежность') plt.legend() plt.show() def fuzzy_rule(value): # Вычисляем принадлежности low_level = fuzz.interp_membership(value_range, low, value) medium_level = fuzz.interp_membership(value_range, medium, value) high_level = fuzz.interp_membership(value_range, high, value) # Определяем выводные множества для тенденции # Для простоты, назначим вероятностные веса decline_weight = low_level stable_weight = medium_level increase_weight = high_level # Находим центр масс для каждого вывода # Здесь можно применить более сложные методы # Для примера используем простое взвешенное среднее trend_centers = {'понижение': -1, 'стабилизация': 0, 'повышение': 1} numerator = (decline_weight * trend_centers['понижение'] + stable_weight * trend_centers['стабилизация'] + increase_weight * trend_centers['повышение']) denominator = decline_weight + stable_weight + increase_weight if denominator == 0: return 0 return numerator / denominator # Анализ последнего значения last_value = trend[-1] predicted_trend = fuzzy_rule(last_value) # Масштабируем прогноз # Предположим, что тенденция влияет на следующий уровень # Можно добавить более сложную модель next_value = last_value + predicted_trend # простая модель print(f'Последнее значение: {last_value:.2f}') print(f'Прогнозируемое изменение: {predicted_trend:.2f}') print(f'Следующее значение: {next_value:.2f}') predictions = [] current_value = trend[-1] for _ in range(10): # прогноз на 10 шагов вперед trend_estimate = fuzzy_rule(current_value) current_value = current_value + trend_estimate predictions.append(current_value) # Визуализация plt.plot(range(len(trend)), trend, label='Исходные данные') plt.plot(range(len(trend), len(trend) + len(predictions)), predictions, label='Прогноз') plt.xlabel('Время') plt.ylabel('Значение') plt.legend() plt.title('Прогнозирование с помощью нечеткой модели') plt.show()