diff --git a/PA/code/fyzzy rules.py b/PA/code/fyzzy rules.py new file mode 100644 index 0000000..998f2f6 --- /dev/null +++ b/PA/code/fyzzy rules.py @@ -0,0 +1,190 @@ +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from sklearn.preprocessing import MinMaxScaler +from skfuzzy import cmeans, defuzz +from sklearn.linear_model import LinearRegression + +# Загрузка данных (пример с данными о температуре) +url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv" +data = pd.read_csv(url, header=0, index_col=0, parse_dates=True) +ts_data = data['Temp'].values.reshape(-1, 1) + +# Нормализация данных +scaler = MinMaxScaler() +scaled_data = scaler.fit_transform(ts_data).flatten() + +# Параметры нечеткой системы +n_clusters = 3 # Количество нечетких множеств +m = 2.0 # Параметр нечеткости (обычно между 1.5 и 3.0) +max_iter = 100 # Максимальное число итераций +error = 0.005 # Критерий останова + +# Применение нечеткой c-средней кластеризации +cntr, u, u0, d, jm, p, fpc = cmeans( + data=scaled_data.reshape(1, -1), + c=n_clusters, + m=m, + error=error, + maxiter=max_iter +) + +# Визуализация функций принадлежности +x = np.linspace(0, 1, 100) +plt.figure(figsize=(10, 6)) +for i in range(n_clusters): + membership = np.exp(-(x - cntr[i])**2 / (2 * 0.1**2)) # Гауссова функция принадлежности + plt.plot(x, membership, label=f'Кластер {i+1}') +plt.title('Функции принадлежности нечетких множеств') +plt.xlabel('Нормализованное значение температуры') +plt.ylabel('Степень принадлежности') +plt.legend() +plt.show() + + +# Функция для определения принадлежности к кластерам +def get_cluster_membership(x, cntr): + distances = [np.abs(x - c) for c in cntr] + memberships = [1 / (1 + d ** 2) for d in distances] # Используем обратное расстояние + return memberships / np.sum(memberships) # Нормализация + + +# Создание обучающего набора для правил +window_size = 3 # Размер окна для временных паттернов +X = [] +y = [] + +for i in range(window_size, len(scaled_data)): + # Получаем окно данных + window = scaled_data[i - window_size:i] + + # Вычисляем принадлежности для каждого элемента окна + memberships = np.array([get_cluster_membership(x, cntr) for x in window]) + + # Находим доминирующий кластер для каждого элемента + dominant_clusters = np.argmax(memberships, axis=1) + + # Формируем правило и целевую переменную + X.append(dominant_clusters) + y.append(scaled_data[i]) + +X = np.array(X) +y = np.array(y) + +# Извлечение частых правил +from collections import defaultdict + +rule_counts = defaultdict(int) +rule_consequences = defaultdict(list) + +for pattern, consequence in zip(X, y): + #rule_key = tuple(pattern) + rule_key = tuple(tuple(row) for row in pattern) + rule_counts[rule_key] += 1 + rule_consequences[rule_key].append(consequence) + +# Вывод наиболее частых правил +print("Топ-5 наиболее частых правил:") +sorted_rules = sorted(rule_counts.items(), key=lambda x: -x[1])[:5] +for rule, count in sorted_rules: + avg_consequence = np.mean(rule_consequences[rule]) + print(f"Если {rule} то y={avg_consequence:.3f} (встречается {count} раз)") + + +class FuzzyTSKSystem: + def __init__(self, n_clusters, window_size, cntr): + self.n_clusters = n_clusters + self.window_size = window_size + self.cntr = cntr + self.rules = {} + self.rule_weights = {} + + def add_rule(self, antecedent, consequent_func): + self.rules[antecedent] = consequent_func + self.rule_weights[antecedent] = 1.0 # Начальный вес правила + + def predict(self, window): + # Вычисляем принадлежности для каждого элемента окна + memberships = np.array([get_cluster_membership(x, self.cntr) for x in window]) + + # Вычисляем активацию каждого правила + rule_activations = {} + total_activation = 0.0 + + for rule_antecedent in self.rules: + # Вычисляем степень соответствия окна правилу + activation = 1.0 + for i in range(self.window_size): + cluster = rule_antecedent[i] + activation *= memberships[i, cluster] + + rule_activations[rule_antecedent] = activation * self.rule_weights[rule_antecedent] + total_activation += rule_activations[rule_antecedent] + + # Если ни одно правило не активировано, возвращаем среднее + if total_activation == 0: + return np.mean(window) + + # Вычисляем взвешенный вывод + weighted_output = 0.0 + for rule_antecedent, activation in rule_activations.items(): + # Получаем вывод правила (линейная функция от входа) + consequent = self.rules[rule_antecedent](window) + weighted_output += activation * consequent + + return weighted_output / total_activation + + +# Создаем и обучаем нечеткую систему +fuzzy_system = FuzzyTSKSystem(n_clusters, window_size, cntr) + +# Добавляем правила на основе данных +for rule_antecedent in rule_counts: + # Для каждого правила создаем линейную модель + X_rule = [] + y_rule = [] + + for i in range(len(X)): + if tuple(X[i]) == rule_antecedent: + X_rule.append(scaled_data[i - window_size:i]) + y_rule.append(y[i]) +""" + if len(X_rule) > 0: + X_rule = np.array(X_rule) + y_rule = np.array(y_rule) + + # Обучаем линейную регрессию для этого правила + model = LinearRegression() + model.fit(X_rule, y_rule) + + # Добавляем правило в систему + fuzzy_system.add_rule( + rule_antecedent, + lambda x, m=model: m.predict([x])[0] + ) +""" + +# Прогнозирование на тестовых данных +test_size = 100 +train_data = scaled_data[:-test_size] +test_data = scaled_data[-test_size:] + +predictions = [] +for i in range(window_size, len(test_data)): + window = test_data[i - window_size:i] + pred = fuzzy_system.predict(window) + predictions.append(pred) + +# Визуализация результатов +plt.figure(figsize=(12, 6)) +plt.plot(test_data[window_size:], label='Фактические значения') +plt.plot(predictions, label='Прогноз нечеткой системы') +plt.title('Сравнение фактических и прогнозируемых значений') +plt.legend() +plt.show() + +# Оценка качества прогноза +from sklearn.metrics import mean_squared_error + +mse = mean_squared_error(test_data[window_size:], predictions) +print(f"Среднеквадратичная ошибка (MSE): {mse:.5f}") \ No newline at end of file diff --git a/PA/code/fyzzy tendency.py b/PA/code/fyzzy tendency.py new file mode 100644 index 0000000..99c376c --- /dev/null +++ b/PA/code/fyzzy tendency.py @@ -0,0 +1,86 @@ +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() \ No newline at end of file diff --git a/PA/code/fyzzy.py b/PA/code/fyzzy.py new file mode 100644 index 0000000..4f09503 --- /dev/null +++ b/PA/code/fyzzy.py @@ -0,0 +1,67 @@ +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() \ No newline at end of file diff --git a/PA/РџРђ 1 Process mining.pptx b/PA/РџРђ 1 Process mining.pptx new file mode 100644 index 0000000..3c6f801 Binary files /dev/null and b/PA/РџРђ 1 Process mining.pptx differ diff --git a/PA/РџРђ 2 хранение данных.pptx b/PA/РџРђ 2 хранение данных.pptx new file mode 100644 index 0000000..37b0c94 Binary files /dev/null and b/PA/РџРђ 2 хранение данных.pptx differ diff --git a/PA/РџРђ 3 управление Рё инструменты.pptx b/PA/РџРђ 3 управление Рё инструменты.pptx new file mode 100644 index 0000000..e8f4768 Binary files /dev/null and b/PA/РџРђ 3 управление Рё инструменты.pptx differ diff --git a/PA/РџРђ 4 мониторинг.pptx b/PA/РџРђ 4 мониторинг.pptx new file mode 100644 index 0000000..a425bb3 Binary files /dev/null and b/PA/РџРђ 4 мониторинг.pptx differ diff --git a/PA/РџРђ 5 извлечение.pptx b/PA/РџРђ 5 извлечение.pptx new file mode 100644 index 0000000..cf0e0bd Binary files /dev/null and b/PA/РџРђ 5 извлечение.pptx differ diff --git a/PA/РџРђ 6 сглаживание.pptx b/PA/РџРђ 6 сглаживание.pptx new file mode 100644 index 0000000..6917911 Binary files /dev/null and b/PA/РџРђ 6 сглаживание.pptx differ diff --git a/PA/РџРђ 7 прогнозирование.pptx b/PA/РџРђ 7 прогнозирование.pptx new file mode 100644 index 0000000..117d6df Binary files /dev/null and b/PA/РџРђ 7 прогнозирование.pptx differ diff --git a/PA/РџРђ 8 оценка качества.pptx b/PA/РџРђ 8 оценка качества.pptx new file mode 100644 index 0000000..2a3db19 Binary files /dev/null and b/PA/РџРђ 8 оценка качества.pptx differ