From 72f29dd5c21541cb9d7338453e166d2e37de1fe6 Mon Sep 17 00:00:00 2001 From: AnikeevAnA Date: Fri, 17 Oct 2025 14:57:12 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'labworks/LW2/LW2=5Fvariant2.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- labworks/LW2/LW2_variant2.md | 326 ++++++++++++++++++++++++++++++++++- 1 file changed, 325 insertions(+), 1 deletion(-) diff --git a/labworks/LW2/LW2_variant2.md b/labworks/LW2/LW2_variant2.md index 2f9bb77..ffbc729 100644 --- a/labworks/LW2/LW2_variant2.md +++ b/labworks/LW2/LW2_variant2.md @@ -573,5 +573,329 @@ AE2 (улучшенная архитектура [2-3-2-1-2-3-2]): **Описание:** AE2 после улучшения стал значительно лучше по основным метрикам аппроксимации. -### Пункт №7. Создание тестовой выборки. +### Пункт №8. Создание тестовой выборки. + +```python +print("="*70) +print("СОЗДАНИЕ ТЕСТОВОЙ ВЫБОРКИ И ТЕСТИРОВАНИЕ AE1 И AE2") +print("="*70) + + +print("\nСТРАТЕГИЯ СОЗДАНИЯ ТЕСТОВОЙ ВЫБОРКИ:") +print("Выбираем точки, которые:") +print("1. Находятся ЗА пределами области AE1 (но близко к данным)") +print("2. Находятся ВНУТРИ широкой области AE2") +print("3. Такие точки AE1 примет за норму, AE2 - за аномалии") + +print("\nСОЗДАНИЕ ТЕСТОВОЙ ВЫБОРКИ...") + +# На основе анализа областей из EDCA создаем точки: +# - AE1 имеет очень узкую область распознавания +# - AE2 имеет широкую область, но с высоким Excess +# Выбираем точки на границе между областями + +data_test = np.array([ + [k + 0.030, k + 0.002], + [k + 0.002, k + 0.030], + [k + 0.025, k + 0.008], + [k + 0.018, k + 0.012] +]) + +np.savetxt('data_test.txt', data_test) + +print("Тестовая выборка создана и сохранена в data_test.txt") +print("Тестовые точки:") +for i, point in enumerate(data_test): + print(f" Точка {i+1}: [{point[0]:.1f}, {point[1]:.1f}]") + +print("\nОЖИДАЕМОЕ ПОВЕДЕНИЕ:") +print("• AE1 (консервативный): примет ВСЕ точки за норму") +print("• AE2 (либеральный): обнаружит НЕКОТОРЫЕ точки как аномалии") + +print("\n" + "="*30) +print("ТЕСТИРОВАНИЕ AE1") +print("="*30) +predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1) +lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1) +lib.ire_plot('test', ire1, IREth1, 'AE1') + +print("\n" + "="*30) +print("ТЕСТИРОВАНИЕ AE2") +print("="*30) +predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2) +lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2) +lib.ire_plot('test', ire2, IREth2, 'AE2') + +print("\n" + "="*50) +print("ВИЗУАЛИЗАЦИЯ ОБЛАСТЕЙ И ТЕСТОВЫХ ТОЧЕК") +print("="*50) +lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test) + +print("\n" + "="*70) +print("АНАЛИЗ РЕЗУЛЬТАТОВ ТЕСТИРОВАНИЯ") +print("="*70) + +print("\nСВОДКА РЕЗУЛЬТАТОВ:") +anomalies_ae1 = np.sum(predicted_labels1) +anomalies_ae2 = np.sum(predicted_labels2) +total_points = len(data_test) + +print(f"AE1 обнаружил аномалий: {anomalies_ae1} из {total_points}") +print(f"AE2 обнаружил аномалий: {anomalies_ae2} из {total_points}") + +print("\nДЕТАЛЬНЫЙ АНАЛИЗ:") +for i in range(len(data_test)): + status_ae1 = "НОРМА" if predicted_labels1[i] == 0 else "АНОМАЛИЯ" + status_ae2 = "НОРМА" if predicted_labels2[i] == 0 else "АНОМАЛИЯ" + ire_val_ae1 = ire1[i][0] if len(ire1.shape) > 1 else ire1[i] + ire_val_ae2 = ire2[i][0] if len(ire2.shape) > 1 else ire2[i] + + print(f"Точка {i+1}: [{data_test[i,0]:.1f}, {data_test[i,1]:.1f}]") + print(f" AE1: {status_ae1} (IRE: {ire_val_ae1:.4f}, порог: {IREth1:.4f})") + print(f" AE2: {status_ae2} (IRE: {ire_val_ae2:.4f}, порог: {IREth2:.4f})") + print() + +print("ВЫВОД:") +if anomalies_ae1 == 0 and anomalies_ae2 > 0: + print("✓ ЗАДАЧА ВЫПОЛНЕНА: AE1 принимает точки за норму, AE2 детектирует аномалии") +else: + print("✗ Требуется корректировка тестовой выборки") +``` + +![график](10.png) + +**Результат выполнения:** +``` +СТРАТЕГИЯ СОЗДАНИЯ ТЕСТОВОЙ ВЫБОРКИ: +Выбираем точки, которые: +1. Находятся ЗА пределами области AE1 (но близко к данным) +2. Находятся ВНУТРИ широкой области AE2 +3. Такие точки AE1 примет за норму, AE2 - за аномалии + +СОЗДАНИЕ ТЕСТОВОЙ ВЫБОРКИ... +Тестовая выборка создана и сохранена в data_test.txt +Тестовые точки: + Точка 1: [5.0, 5.0] + Точка 2: [5.0, 5.0] + Точка 3: [5.0, 5.0] + Точка 4: [5.0, 5.0] + +ОЖИДАЕМОЕ ПОВЕДЕНИЕ: +• AE1 (консервативный): примет ВСЕ точки за норму +• AE2 (либеральный): обнаружит НЕКОТОРЫЕ точки как аномалии + +СВОДКА РЕЗУЛЬТАТОВ: +AE1 обнаружил аномалий: 0.0 из 4 +AE2 обнаружил аномалий: 0.0 из 4 + +ДЕТАЛЬНЫЙ АНАЛИЗ: +Точка 1: [5.0, 5.0] + AE1: НОРМА (IRE: 0.0300, порог: 0.0679) + AE2: НОРМА (IRE: 0.0200, порог: 0.0603) + +Точка 2: [5.0, 5.0] + AE1: НОРМА (IRE: 0.0200, порог: 0.0679) + AE2: НОРМА (IRE: 0.0200, порог: 0.0603) + +Точка 3: [5.0, 5.0] + AE1: НОРМА (IRE: 0.0200, порог: 0.0679) + AE2: НОРМА (IRE: 0.0100, порог: 0.0603) + +Точка 4: [5.0, 5.0] + AE1: НОРМА (IRE: 0.0100, порог: 0.0679) + AE2: НОРМА (IRE: 0.0100, порог: 0.0603) + +ВЫВОД: +✗ Требуется корректировка тестовой выборки +``` + +### Пункт №9. Применение автокодировщиков к тестовым данным. + +```python +print("="*70) +print("ПРИМЕНЕНИЕ AE1 И AE2 К ТЕСТОВЫМ ДАННЫМ") +print("="*70) + +data_test = np.loadtxt('data_test.txt', dtype=float) +print(f"Загружена тестовая выборка: {len(data_test)} точек") + +print("\nТЕСТОВЫЕ ТОЧКИ:") +for i, point in enumerate(data_test): + print(f" Точка {i+1}: [{point[0]:.3f}, {point[1]:.3f}]") + +print("\n" + "="*50) +print("ПРИМЕНЕНИЕ AE1 К ТЕСТОВЫМ ДАННЫМ") +print("="*50) + +predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1) + +print("РЕЗУЛЬТАТЫ AE1:") +print("Точка | Координаты | IRE | Порог | Статус") +print("-" * 55) +for i in range(len(data_test)): + ire_val = ire1[i][0] if len(ire1.shape) > 1 else ire1[i] + status = "НОРМА" if predicted_labels1[i] == 0 else "АНОМАЛИЯ" + print(f"{i+1:5} | [{data_test[i,0]:.3f}, {data_test[i,1]:.3f}] | {ire_val:.4f} | {IREth1:.4f} | {status}") + +lib.ire_plot('test', ire1, IREth1, 'AE1') + +print("\n" + "="*50) +print("ПРИМЕНЕНИЕ AE2 К ТЕСТОВЫМ ДАННЫМ") +print("="*50) + +predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2) + +print("РЕЗУЛЬТАТЫ AE2:") +print("Точка | Координаты | IRE | Порог | Статус") +print("-" * 55) +for i in range(len(data_test)): + ire_val = ire2[i][0] if len(ire2.shape) > 1 else ire2[i] + status = "НОРМА" if predicted_labels2[i] == 0 else "АНОМАЛИЯ" + print(f"{i+1:5} | [{data_test[i,0]:.3f}, {data_test[i,1]:.3f}] | {ire_val:.4f} | {IREth2:.4f} | {status}") + +lib.ire_plot('test', ire2, IREth2, 'AE2') + +lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test) +``` + +**Результат выполнения:** +``` +Загружена тестовая выборка: 4 точек + +ТЕСТОВЫЕ ТОЧКИ: + Точка 1: [5.030, 5.002] + Точка 2: [5.002, 5.030] + Точка 3: [5.025, 5.008] + Точка 4: [5.018, 5.012] + +РЕЗУЛЬТАТЫ AE1: +Точка | Координаты | IRE | Порог | Статус +------------------------------------------------------- + 1 | [5.030, 5.002] | 0.0300 | 0.0679 | НОРМА + 2 | [5.002, 5.030] | 0.0200 | 0.0679 | НОРМА + 3 | [5.025, 5.008] | 0.0200 | 0.0679 | НОРМА + 4 | [5.018, 5.012] | 0.0100 | 0.0679 | НОРМА + +РЕЗУЛЬТАТЫ AE2: +Точка | Координаты | IRE | Порог | Статус +------------------------------------------------------- + 1 | [5.030, 5.002] | 0.0200 | 0.0603 | НОРМА + 2 | [5.002, 5.030] | 0.0200 | 0.0603 | НОРМА + 3 | [5.025, 5.008] | 0.0100 | 0.0603 | НОРМА + 4 | [5.018, 5.012] | 0.0100 | 0.0603 | НОРМА +``` + +![Результаты тестирования](11.png) +![Результаты тестирования](12.png) +![Результаты тестирования](13.png) + +### Пункт №10. Применение автокодировщиков к тестовым данным. + +```python +print("="*70) +print("ВИЗУАЛИЗАЦИЯ ОБУЧАЮЩЕЙ И ТЕСТОВОЙ ВЫБОРКИ") +print("="*70) + +print("ВИЗУАЛИЗАЦИЯ ДЛЯ AE1:") +plt.figure(figsize=(12, 5)) + +plt.subplot(1, 2, 1) +plt.contourf(xx, yy, Z1, cmap=plt.cm.Reds, alpha=0.3) +plt.scatter(data[:, 0], data[:, 1], c='blue', alpha=0.6, s=20, label='Обучающая выборка') +plt.scatter(data_test[:, 0], data_test[:, 1], c='red', marker='s', s=50, label='Тестовая выборка') +plt.xlabel('X1') +plt.ylabel('X2') +plt.title('AE1: Область распознавания') +plt.legend() +plt.grid(True, alpha=0.3) + +plt.subplot(1, 2, 2) +plt.contourf(xx, yy, Z1, cmap=plt.cm.Reds, alpha=0.3) +plt.scatter(data[:, 0], data[:, 1], c='blue', alpha=0.3, s=10) + +for i, point in enumerate(data_test): + plt.scatter(point[0], point[1], c='red', marker='s', s=80) + plt.annotate(f'{i+1}', (point[0], point[1]), xytext=(5, 5), + textcoords='offset points', fontweight='bold') +plt.xlabel('X1') +plt.ylabel('X2') +plt.title('AE1: Тестовые точки с номерами') +plt.grid(True, alpha=0.3) + +plt.tight_layout() +plt.savefig('out/ae1_visualization.png', dpi=300, bbox_inches='tight') +plt.show() + +print("ВИЗУАЛИЗАЦИЯ ДЛЯ AE2:") +plt.figure(figsize=(12, 5)) + +plt.subplot(1, 2, 1) +plt.contourf(xx, yy, Z2, cmap=plt.cm.Greens, alpha=0.3) +plt.scatter(data[:, 0], data[:, 1], c='blue', alpha=0.6, s=20, label='Обучающая выборка') +plt.scatter(data_test[:, 0], data_test[:, 1], c='red', marker='s', s=50, label='Тестовая выборка') +plt.xlabel('X1') +plt.ylabel('X2') +plt.title('AE2: Область распознавания') +plt.legend() +plt.grid(True, alpha=0.3) + +plt.subplot(1, 2, 2) +plt.contourf(xx, yy, Z2, cmap=plt.cm.Greens, alpha=0.3) +plt.scatter(data[:, 0], data[:, 1], c='blue', alpha=0.3, s=10) + +for i, point in enumerate(data_test): + plt.scatter(point[0], point[1], c='red', marker='s', s=80) + plt.annotate(f'{i+1}', (point[0], point[1]), xytext=(5, 5), + textcoords='offset points', fontweight='bold') +plt.xlabel('X1') +plt.ylabel('X2') +plt.title('AE2: Тестовые точки с номерами') +plt.grid(True, alpha=0.3) + +plt.tight_layout() +plt.savefig('out/ae2_visualization.png', dpi=300, bbox_inches='tight') +plt.show() + + + +print("Созданы файлы:") +print("- out/ae1_visualization.png") +print("- out/ae2_visualization.png") +print("- out/comparison_visualization.png") +``` + +**Результат выполнения:** +``` +Загружена тестовая выборка: 4 точек + +ТЕСТОВЫЕ ТОЧКИ: + Точка 1: [5.030, 5.002] + Точка 2: [5.002, 5.030] + Точка 3: [5.025, 5.008] + Точка 4: [5.018, 5.012] + +РЕЗУЛЬТАТЫ AE1: +Точка | Координаты | IRE | Порог | Статус +------------------------------------------------------- + 1 | [5.030, 5.002] | 0.0300 | 0.0679 | НОРМА + 2 | [5.002, 5.030] | 0.0200 | 0.0679 | НОРМА + 3 | [5.025, 5.008] | 0.0200 | 0.0679 | НОРМА + 4 | [5.018, 5.012] | 0.0100 | 0.0679 | НОРМА + +РЕЗУЛЬТАТЫ AE2: +Точка | Координаты | IRE | Порог | Статус +------------------------------------------------------- + 1 | [5.030, 5.002] | 0.0200 | 0.0603 | НОРМА + 2 | [5.002, 5.030] | 0.0200 | 0.0603 | НОРМА + 3 | [5.025, 5.008] | 0.0100 | 0.0603 | НОРМА + 4 | [5.018, 5.012] | 0.0100 | 0.0603 | НОРМА +``` + +**ВИЗУАЛИЗАЦИЯ ДЛЯ AE1:** + +![Результаты тестирования](14.png) + +**ВИЗУАЛИЗАЦИЯ ДЛЯ AE2:** + +![Результаты тестирования](15.png)