diff --git a/gordeeva_anna_lab_1/1graf.jpg b/gordeeva_anna_lab_1/1graf.jpg new file mode 100644 index 0000000..1784faa Binary files /dev/null and b/gordeeva_anna_lab_1/1graf.jpg differ diff --git a/gordeeva_anna_lab_1/2graf.jpg b/gordeeva_anna_lab_1/2graf.jpg new file mode 100644 index 0000000..5c7deb8 Binary files /dev/null and b/gordeeva_anna_lab_1/2graf.jpg differ diff --git a/gordeeva_anna_lab_1/3graf.jpg b/gordeeva_anna_lab_1/3graf.jpg new file mode 100644 index 0000000..c26f736 Binary files /dev/null and b/gordeeva_anna_lab_1/3graf.jpg differ diff --git a/gordeeva_anna_lab_1/lab1.py b/gordeeva_anna_lab_1/lab1.py new file mode 100644 index 0000000..de328ff --- /dev/null +++ b/gordeeva_anna_lab_1/lab1.py @@ -0,0 +1,66 @@ +import streamlit as st +import numpy as np +from matplotlib import pyplot as plt +from matplotlib.colors import ListedColormap +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.datasets import make_moons, make_circles, make_classification +from sklearn.linear_model import Perceptron +from sklearn.neural_network import MLPClassifier +from sklearn.metrics import accuracy_score + +st.header("Лабораторная работа 1. Вариант 7") + +#Создаем данные +moon_dataset = make_moons(noise=0.3, random_state=0) +X, y = moon_dataset #Х это двумерный массив с признаками (координатами), а y - одномерный массив с 0 и 1.(Либо к 1 классу, либо к другому) +X = StandardScaler().fit_transform(X) #Данные нужно обязательно стандартизировать, для того, что бы один признак не перевешивал в обучении другой признак +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4, random_state=42) #Делим на обучающую и тестовую выборку. Число выбираем для того, чтобы выборка при каждом старте не менялась + +def print_perceptron(perceptron): + # Обучение модели на обучающих данных + perceptron.fit(X_train, y_train) + + #Определение точности модели + y_pred = perceptron.predict(X_test)#На тестовой выборке получаем принадлежность к классу + accuracy = accuracy_score(y_test, y_pred) + st.write("Точность:", accuracy) + + #График с помощью Matplotlib + fig, ax = plt.subplots() + cm_bright = ListedColormap(['#FF0000', '#0000FF']) + cm_bright2 = ListedColormap(['#FFBBBB', '#BBBBFF']) + cmap = ListedColormap(['#FFBBBB', '#BBBBFF']) + + #Отрисовка градиента/фона + h = .02 # шаг регулярной сетки + x0_min, x0_max = X_train[:, 0].min() - .5, X_train[:, 0].max() + .5 #Определение границы множества по оси х + x1_min, x1_max = X_train[:, 1].min() - .5, X_train[:, 1].max() + .5 #Определение границы множества по оси y + #np.arange(start, stop, inter) позволяет создать последовательность числен в интервале от start до stop c интервалом/шагом inter + xx0, xx1 = np.meshgrid(np.arange(x0_min, x0_max, h), np.arange(x1_min, x1_max, h)) #получаем координатную матрицу из координатных векторов + Z = perceptron.predict(np.c_[xx0.ravel(), xx1.ravel()]) + Z = Z.reshape(xx0.shape) # Изменяем форму Z в соответствии с сеткой + # Применяем обученную модель к сетке точек и отображаем результат как цветовую карту + ax.contourf(xx0, xx1, Z, cmap=cmap, alpha=.8) + scatter_train = ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright, marker='o', label='Обучающая выборка') + scatter_test = ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright2, marker='x', label='Тестовая выборка') + ax.legend(handles=[scatter_train, scatter_test], labels=['Обучающая выборка', 'Тестовая выборка']) + st.pyplot(fig) + +# Создание объекта модели персептрона +on = st.toggle('Персептрон') +if on: + perceptron = Perceptron(max_iter=100, random_state=0) + print_perceptron(perceptron) + +# Создание объекта модели персептрона +on = st.toggle('Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01)') +if on: + perceptron = MLPClassifier(hidden_layer_sizes=(10,), alpha=0.01, max_iter=1000, random_state=0) + print_perceptron(perceptron) + +# Создание объекта модели персептрона +on = st.toggle('Многослойный персептрон с 100-а нейронами в скрытом слое (alpha = 0.01)') +if on: + perceptron = MLPClassifier(hidden_layer_sizes=(100,), alpha=0.01, max_iter=1000, random_state=0) + print_perceptron(perceptron) \ No newline at end of file diff --git a/gordeeva_anna_lab_1/readme.md b/gordeeva_anna_lab_1/readme.md new file mode 100644 index 0000000..1553056 --- /dev/null +++ b/gordeeva_anna_lab_1/readme.md @@ -0,0 +1,62 @@ +## Задание +Данные: make_moons (noise = 0.3, random_state = 0) + +Модели: +* Персептрон +* Многослойный персептрон с 10-ю нейронами в скрытом поле (alpha = 0.01) +* Многослойный персептрон с 100-а нейронами в скрытом поле (alpha = 0.01) + +## В чем различие каждой модели + +Персептрон: +* самая простая форма искусственной нейронной сети +* состоит из одного или нескольких нейронов +* только один слой нейронов +* разделяет данные линейно + +Многослойный персептрон с 10-ю/100-а нейронами в скрытом поле (alpha = 0.01) +* более сложная форма искусственной нейронной сети +* состоит из нескольких слоев, причем имеет один или несколько скрытых слоев +* способен решать задачи классификации, регрессии, обработки изображений, текста и т.д + +Общий вывод таков, что многослойный персептрон способен решать более сложные задачи, требующие нелинейных решений. + + +## Библиотеки +Streamlit. Предоставляет простой способ создания веб-приложений для визуализации данных. + +Numpy. Предоставляет возможность работать с массивами и матрицами. + +Matplotlib. Используется для создания графиков. + +Sklearn. Предоставляет инструменты и алгоритмы, которые упрощают задачи, связанные с машинным обучением. + +## Функционал +Предоставляет создание объекта для каждой модели персептрона. + +Создание данных с помощью функции make_moon c последующим +делением данных на обучающую и тестовую выборку. + +Метод print_perceptron, в котором происходит обучение модели, определение точности и отрисовка графика. + +## Запуск +Перед запуском необходимо запустить виртуальную среду venv. Так как я использую streamlit, то для запуска необходимо в терминал прописать следующую строку: +``` +streamlit run lab1.py +``` +Приложение развернется на локальном сервере и автоматически откроется в браузере. + +## Скриншоты работы программы +При запуске выглядит так: +![Alt text](win_start.jpg "Optional Title") + +Построенные графики +![Alt text](1graf.jpg "Optional Title") + +![Alt text](2graf.jpg "Optional Title") + +![Alt text](3graf.jpg "Optional Title") + +## Вывод +В первой модели, как сказано выше, данные делятся линейно. Но точность разделения близка к 1, поэтому задача в данном случае решена. +В других моделях данные делятся нелинейно и чем выше кол-во нейронов, тем разбиение становится точнее. Но точность в обоих случаях одинаковая. \ No newline at end of file diff --git a/gordeeva_anna_lab_1/win_start.jpg b/gordeeva_anna_lab_1/win_start.jpg new file mode 100644 index 0000000..a7d8a4c Binary files /dev/null and b/gordeeva_anna_lab_1/win_start.jpg differ