From 5b2711315015f59020d09cac49fb7f8aa970a795 Mon Sep 17 00:00:00 2001 From: Rafael Volkov Date: Tue, 5 Dec 2023 12:27:16 +0400 Subject: [PATCH] volkov_rafael_lab_1 is done --- volkov_rafael_lab_1/app.py | 60 ++++++++++++++++++ volkov_rafael_lab_1/readme.md | 39 ++++++++++++ .../static/models_comparison.png | Bin 0 -> 35199 bytes volkov_rafael_lab_1/templates/index.html | 38 +++++++++++ 4 files changed, 137 insertions(+) create mode 100644 volkov_rafael_lab_1/app.py create mode 100644 volkov_rafael_lab_1/readme.md create mode 100644 volkov_rafael_lab_1/static/models_comparison.png create mode 100644 volkov_rafael_lab_1/templates/index.html diff --git a/volkov_rafael_lab_1/app.py b/volkov_rafael_lab_1/app.py new file mode 100644 index 0000000..d63193e --- /dev/null +++ b/volkov_rafael_lab_1/app.py @@ -0,0 +1,60 @@ +import numpy as np +from flask import Flask, request, render_template +from sklearn.datasets import make_circles +from sklearn.neural_network import MLPClassifier +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score +import matplotlib.pyplot as plt +from mlxtend.plotting import plot_decision_regions + +app = Flask(__name__) + +@app.route('/') +def home(): + return render_template('index.html') + +@app.route('/compare_models', methods=['POST']) +def compare_models(): + # Генерация данных + rs = 0 + X, y = make_circles(noise=0.2, factor=0.5, random_state=rs) + X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=rs) + + # Персептрон + perceptron = MLPClassifier(hidden_layer_sizes=(1,), max_iter=1000, alpha=0.01) + perceptron.fit(X_train, y_train) + perceptron_score = accuracy_score(y_test, perceptron.predict(X_test)) + + # Многослойный персептрон с 10-ю нейронами в скрытом слое + mlp_10 = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000, alpha=0.01) + mlp_10.fit(X_train, y_train) + mlp_10_score = accuracy_score(y_test, mlp_10.predict(X_test)) + + # Многослойный персептрон со 100-ю нейронами в скрытом слое + mlp_100 = MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000, alpha=0.01) + mlp_100.fit(X_train, y_train) + mlp_100_score = accuracy_score(y_test, mlp_100.predict(X_test)) + + # Создание графиков + plt.figure(figsize=(12, 4)) + + plt.subplot(131) + plot_decision_regions(X_test, y_test, clf=perceptron, legend=2) + plt.title('Персептрон\n(Accuracy: {:.2f})'.format(perceptron_score)) + + plt.subplot(132) + plot_decision_regions(X_test, y_test, clf=mlp_10, legend=2) + plt.title('MLP (10 нейронов)\n(Accuracy: {:.2f})'.format(mlp_10_score)) + + plt.subplot(133) + plot_decision_regions(X_test, y_test, clf=mlp_100, legend=2) + plt.title('MLP (100 нейронов)\n(Accuracy: {:.2f})'.format(mlp_100_score)) + + plt.tight_layout() + + plt.savefig('static/models_comparison.png') + + return render_template('index.html', result=True) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/volkov_rafael_lab_1/readme.md b/volkov_rafael_lab_1/readme.md new file mode 100644 index 0000000..21e0e5a --- /dev/null +++ b/volkov_rafael_lab_1/readme.md @@ -0,0 +1,39 @@ +Общее задание: +Используя код из пункта «Регуляризация и сеть прямого +распространения» из [1] (стр. 228), сгенерируйте определенный тип данных и +сравните на нем 3 модели (по варианту). Постройте графики, отобразите +качество моделей, объясните полученные результаты. + +8 вариант: +Данные: make_circles (noise=0.2, factor=0.5, random_state=rs) +Модели: +- Персептрон +· Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = +0.01) +· Многослойный персептрон со 100-а нейронами в скрытом слое (alpha += 0.01) + +Запуск осуществляется через файл app.py + + +Технологии: + +Flask: Веб-фреймворк для Python, используется для создания веб-приложения. +NumPy: Библиотека для работы с массивами и матрицами, используется для генерации данных. +scikit-learn: Библиотека для машинного обучения, используется для построения и обучения моделей. +Matplotlib: Библиотека для визуализации данных, используется для создания графиков. +mlxtend: Библиотека для визуализации решающих границ. +Описание работы программы: + +При запуске приложения через Flask создается веб-сервер. +Пользователь открывает веб-страницу, которая содержит кнопку "Compare Models". +При нажатии на кнопку генерируются данные (make_circles) и тренируются три модели: Perceptron, MLP с 10 нейронами и MLP с 100 нейронами. +Для каждой модели строятся графики с решающими границами и вычисляется точность модели на тестовых данных. +Результаты (графики и точности) отображаются на веб-странице. +Входные данные: + +Нет явных входных данных от пользователя. Данные генерируются программой (make_circles). +Выходные данные: + +Визуализация решающих границ для трех моделей (Perceptron, MLP с 10 нейронами, MLP с 100 нейронами). +Точность каждой модели на тестовых данных отображается на веб-странице. \ No newline at end of file diff --git a/volkov_rafael_lab_1/static/models_comparison.png b/volkov_rafael_lab_1/static/models_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..479019d7c3abd094569452331726b0f2b6802b7b GIT binary patch literal 35199 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

V}@L=Z}-Cim=^xAv3FkgE+{MqD`=O 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 literal 0 HcmV?d00001 diff --git a/volkov_rafael_lab_1/templates/index.html b/volkov_rafael_lab_1/templates/index.html new file mode 100644 index 0000000..bb0ed78 --- /dev/null +++ b/volkov_rafael_lab_1/templates/index.html @@ -0,0 +1,38 @@ + + + + + + Model Comparison + + + +

Model Comparison

+ + {% if result %} +
+
+ Perceptron +
+
+
+
+
+
+ {% endif %} + +
+ +
+ +