From abf38bce43b3e4baa7d4ccf94359cd9f366aa74a Mon Sep 17 00:00:00 2001 From: cheykrym Date: Wed, 20 Nov 2024 07:26:21 +0300 Subject: [PATCH] Update lab2.py, lab4.py, and 5 more files... --- app/labs/lab2.py | 43 ++++++++------ app/labs/lab4.py | 79 ++++++++++++++++++++++++++ app/labs/lab5.py | 85 ++++++++++++++++++++++++++++ app/labs/lab6.py | 98 ++++++++++++++++++++++++++++++++ app/labs/lab7.py | 143 +++++++++++++++++++++++++++++++++++++++++++++++ main.py | 9 +-- requirements.txt | 1 + 7 files changed, 435 insertions(+), 23 deletions(-) diff --git a/app/labs/lab2.py b/app/labs/lab2.py index 782977d..573011f 100644 --- a/app/labs/lab2.py +++ b/app/labs/lab2.py @@ -7,34 +7,45 @@ class lab2: pass def main(self): - # Данные для графика + + # Используем массивы из первой работы x11 = np.random.normal(2, 1, [10, 1]) x21 = np.random.normal(6, 2, [10, 1]) - print(x11,x21) - # Рисуем график + # Построение диаграммы рассеяния plt.scatter(x11, x21) - plt.xlabel("x") - plt.ylabel("y") + plt.xlabel("x1") + plt.ylabel("x2") plt.title("Диаграмма рассеяния") plt.show() + # Построение гистограммы hist_data = np.vstack((x11, x21)) - print ("Данные для гистограммы:", hist_data ) - plt.hist(hist_data) - plt.xlabel('Значение признака') - plt.ylabel('Частота появления значения признака') - plt.title('Гистограмма') + plt.hist(hist_data, bins=10) + plt.xlabel("Значение признака") + plt.ylabel("Количество значений") + plt.title("Гистограмма") plt.show() - # Коробочковая диаграмма - plt.boxplot((x11.ravel(), x21.ravel()), notch=True) - print("Данные для коробочковой диаграммы",x11.ravel(), x21.ravel()) - plt.xlabel('№ объекта') - plt.ylabel('Значение признака') - plt.title('Ящик с усами') + # Построение "ящика с усами" + boxplot_data = plt.boxplot((x11.ravel(), x21.ravel()), notch=True) + plt.xlabel("Массив") + plt.ylabel("Значение признака") + plt.title("Ящик с усами") + plt.xticks([1, 2], ['x11', 'x21']) plt.show() + # Получение данных для таблицы + for i, name in enumerate(['x11', 'x21'], start=1): + print(f"Данные для {name}:") + print(f"Медиана: {boxplot_data['medians'][i-1].get_ydata()[0]}") + print(f"Нижняя граница: {boxplot_data['whiskers'][2*(i-1)].get_ydata()[1]}") + print(f"Верхняя граница: {boxplot_data['whiskers'][2*(i-1)+1].get_ydata()[1]}") + print(f"Нижний квартиль: {boxplot_data['boxes'][i-1].get_ydata()[1]}") + print(f"Верхний квартиль: {boxplot_data['boxes'][i-1].get_ydata()[2]}") + fliers = boxplot_data['fliers'][i-1].get_ydata() + print(f"Выбросы: {', '.join(map(str, fliers)) if fliers.size > 0 else 'Нет выбросов'}") + if __name__ == "__main__": l2 = lab2() l2.main() diff --git a/app/labs/lab4.py b/app/labs/lab4.py index e69de29..6639519 100644 --- a/app/labs/lab4.py +++ b/app/labs/lab4.py @@ -0,0 +1,79 @@ +import numpy as np +import matplotlib +import matplotlib.pyplot as plt +from sklearn.datasets import load_iris + +class lab4: + + def __init__(self): + pass + + def main(self): + matplotlib.use('TkAgg') + + # Загрузим данные Ирисов Фишера + data = load_iris() + X = data.data # признаки ирисов + Y = data.target # сорта ирисов + Y_str = data.target_names # названия сортов ирисов + setosa_inds = Y == np.where(Y_str == "setosa") + setosa_data = X[np.ravel(setosa_inds), :] + virginica_inds = Y == np.where(Y_str == "virginica") + virginica_data = X[np.ravel(virginica_inds), :] + + # трехмерная скаттерограмма setosa и virginica + fig = plt.figure() + ax = plt.axes(projection='3d') + ax.set_title('Cкаттерограмма setosa и virginica') + + x = setosa_data[:, 1] + y = setosa_data[:, 3] + z = setosa_data[:, 0] + ax.scatter(x, y, z, c='blue') + + x = virginica_data[:, 1] + y = virginica_data[:, 3] + z = virginica_data[:, 0] + ax.scatter(x, y, z, c='red') + ax.set_xlabel('Ширина чашелистика') + ax.set_ylabel('Ширина лепестка') + ax.set_zlabel('Длина чашелистика') + + plt.show() + + # разница средних значений по всем признакам + diff_mean = np.mean(setosa_data, axis=0) - np.mean(virginica_data, axis=0) + print ('Разница средних значений:', diff_mean) + + # сумма матриц ковариации + sum_covariance = np.cov(setosa_data, rowvar=0) + np.cov(virginica_data, rowvar=0) + print ('Сумма матриц ковариации:',sum_covariance) + + # ненормированный весовой вектор + W = np.matmul(np.linalg.inv(sum_covariance), diff_mean) + print ('Ненормируемый весовой вектор:',W) + + # нормируемирование весового вектора + w = W/np.linalg.norm(W) + print ('Нормируемый весовой вектор:', w) + + # проекции исходных объектов на полученный весовой вектор + proj_setosa = np.matmul(setosa_data, w) + print ('Проекция сетоса', proj_setosa) + proj_virginica = np.matmul(virginica_data, w) + + #Гистограмма проекций объектов на весовой вектор + hist_data = np.vstack((proj_setosa, proj_virginica)) + plt.hist(hist_data.T) + print ('Значения гистограммы', hist_data.T) + plt.xlabel('Значение проекции объекта') + plt.ylabel('Проекция на весовой вектор') + plt.title('Гистограмма') + plt.show() + lim=(np.mean(proj_setosa)+np.mean(proj_virginica))/2 + print(lim) + + +if __name__ == "__main__": + l4 = lab4() + l4.main() diff --git a/app/labs/lab5.py b/app/labs/lab5.py index e69de29..e00acb7 100644 --- a/app/labs/lab5.py +++ b/app/labs/lab5.py @@ -0,0 +1,85 @@ +import matplotlib.pyplot as plt +import matplotlib +from sklearn.datasets import load_iris +from sklearn.decomposition._pca import PCA +import numpy as np + +class lab5: + + def __init__(self): + pass + + def main(self): + + matplotlib.use('TkAgg') + + # Загружаем данные ирисов + data = load_iris() + X = data.data # признаки ирисов + Y = data.target # сорта ирисов + Y_str = data.target_names # названия сортов ирисов + + # setosa + setosa_inds = Y == np.where(Y_str == "setosa") + setosa_data = X[np.ravel(setosa_inds), :] + # versicolor + versicolor_inds = Y == np.where(Y_str == "versicolor") + versicolor_data = X[np.ravel(versicolor_inds), :] + # virginica + virginica_inds = Y == np.where(Y_str == "virginica") + virginica_data = X[np.ravel(virginica_inds), :] + + plt.scatter(setosa_data[:, 1], setosa_data [:, 2], marker="+", label='Setosa') + plt.scatter(virginica_data[:, 1], virginica_data[:, 2], marker=".", label='Vergisicа') + plt.title('Скаттерограмма Setosa и Virginica') + plt.xlabel('Ширина чашелистика (см)') + plt.ylabel('Ширина лепестка (см)') + plt.legend() + plt.show() + + + # Выполняем PCA для сокращения размерности до 2D + PCA_obj = PCA(n_components=2) # Две главные компоненты + N = len(setosa_data) + data_0 = np.vstack((setosa_data, virginica_data)) + reduced_data_0 = PCA_obj.fit_transform(data_0) + print (reduced_data_0) + + #Скаттерограмма объекты сортов ирисов в пространстве главных компонент + plt.scatter(reduced_data_0[0:N, 0], reduced_data_0[0:N, 1], marker=".", label='Setosa') + plt.scatter(reduced_data_0[N:, 0], reduced_data_0[N:, 1], marker="*", label='Virginica') + plt.xlabel("Главная компонента 1") + plt.ylabel("Главная компонента 2") + plt.title("Скатерограмма Setosa и Virginica") + plt.legend() + plt.show() + + # Для всех Сортов + plt.scatter(setosa_data[:, 1], setosa_data [:, 2], marker="+", label='Setosa') + plt.scatter(versicolor_data[:, 1], versicolor_data[:, 2], marker=".", label='Versicolor') + plt.scatter(virginica_data[:, 1], virginica_data[:, 2], marker=".", label='Vergisicа') + plt.title('Скаттерограмма для всех сортов ирисов') + plt.xlabel('Ширина чашелистика (см)') + plt.ylabel('Ширина лепестка (см)') + plt.legend() + plt.show() + + + data = np.vstack((setosa_data, versicolor_data, virginica_data)) + reduced_data = PCA_obj.fit_transform(data) + + #Скаттерограмма объекты сортов ирисов в пространстве главных компонент + plt.scatter(reduced_data[0:N, 0], reduced_data[0:N, 1], marker="+", label='Setosa') + plt.scatter(reduced_data[N:2*N, 0], reduced_data[N:2*N, 1], marker=".", label='Versicolor') + plt.scatter(reduced_data[2*N:, 0], reduced_data[2*N:, 1], marker="*", label='Virginica') + plt.xlabel("Главная компонента 1") + plt.ylabel("Главная компонента 2") + plt.title("Скатерограмма всех сортов") + plt.legend() + plt.show() + + + +if __name__ == "__main__": + l5 = lab5() + l5.main() diff --git a/app/labs/lab6.py b/app/labs/lab6.py index e69de29..222e1be 100644 --- a/app/labs/lab6.py +++ b/app/labs/lab6.py @@ -0,0 +1,98 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import matplotlib + +class lab6: + + def __init__(self): + pass + + def main(self): + + matplotlib.use('TkAgg') + + #создание массивов + g1 = [[0.7, 0.3, 1.2], + [0.5, 0.7, 1.0], + [0.4, 1.0, 0.4], + [0.7, 0.7, 1.0], + [0.6, 0.6, 1.5], + [0.6, 0.6, 1.2], + [0.6, 0.5, 1.0], + [0.4, 0.9, 0.6], + [0.5, 0.6, 1.1], + [0.8, 0.3, 1.2]] + g2 = [[0.4, 0.2, 0.8], + [0.2, 0.2, 0.7], + [0.9, 0.3, 0.5], + [0.8, 0.3, 0.6], + [0.5, 0.6, 0.4], + [0.6, 0.5, 0.7], + [0.4, 0.4, 1.2], + [0.6, 0.3, 1.0], + [0.3, 0.2, 0.6], + [0.5, 0.5, 0.8]] + # Создание датафреймов + df_g1 = pd.DataFrame(g1, columns=['X1', 'Y1', 'Z1']) + df_g2 = pd.DataFrame(g2, columns=['X2', 'Y2', 'Z2']) + # Объединение датафреймов + df = pd.concat([df_g1, df_g2], axis=1) + # п3: построение скаттерограммы + fig = plt.figure() + ax = fig.add_subplot(111, projection='3d') + # Наносим точки на график + ax.scatter(df.iloc[:, 0], + df.iloc[:, 1], + df.iloc[:, 2], + color='midnightblue') + ax.scatter(df.iloc[:, 3], + df.iloc[:, 4], + df.iloc[:, 5], + color='darkred') + ax.set_xlabel('1 признак') + ax.set_ylabel('2 признак') + ax.set_zlabel('3 признак') + plt.legend(['g1', 'g2']) + plt.show() + + # п2: последовательное обучение с коррекцией ошибки + one = np.ones((10, 1)) + g1 = np.hstack((g1, one)) + g2 = np.hstack((g2, one)) + g2 = (-1)*np.array(g2) + g = np.vstack((g1, g2)) + W = np.mean(g1, axis=0) - np.mean(g2, axis=0) + w = W/np.linalg.norm(W) + proj1=np.matmul(g,w) + print (proj1) + plt.figure(3) + plt.subplot(1, 2, 1) + plt.hist(proj1.T[0:9], bins= 10,color = ('firebrick'), alpha=0.7, edgecolor = 'black',label='g1') + plt.hist((-1)*proj1.T[10:19], bins= 10,color = ('indigo'), alpha=0.7, edgecolor ='black',label='g2') + plt.legend() + plt.xlabel('Значение') + plt.ylabel('Количество') + plt.title('Гистограмма первого приближения') + learn_coeff = 0.1 + while min(proj1)<0: + for ind, data_sample in enumerate(g): + proj1[ind] = np.matmul(data_sample, w) + if proj1[ind]<0: + w = w + data_sample*learn_coeff + proj = np.matmul(g, w) + v1 = np.matmul(g, w) + # Построение гистограммы проекций + plt.subplot(1, 2, 2) + plt.hist(v1.T[0:9], bins= 10,color = ('firebrick'), alpha=0.7, edgecolor = 'black',label='g1') + plt.hist((-1)*v1.T[10:19], bins= 10,color = ('indigo'), alpha=0.7, edgecolor ='black',label='g2') + plt.xlabel('Значение') + plt.ylabel('Количество') + plt.title('Гистограмма после обучения') + plt.legend() + plt.show() + + +if __name__ == "__main__": + l6 = lab6() + l6.main() diff --git a/app/labs/lab7.py b/app/labs/lab7.py index e69de29..09a5cce 100644 --- a/app/labs/lab7.py +++ b/app/labs/lab7.py @@ -0,0 +1,143 @@ +import numpy as np +import matplotlib.pyplot as plt +import sklearn.metrics +from sklearn.datasets import load_iris +from sklearn.model_selection import train_test_split +from sklearn.neighbors import KNeighborsClassifier +import matplotlib + +class lab7: + + def __init__(self): + pass + + def main(self): + matplotlib.use('TkAgg') + + # Загружаем данные ирисов + data = load_iris() + X = data.data # Признаки ирисов + Y = data.target # Сорта ирисов + label = Y # Используем Y в качестве меток классов для классификации + Y_str = data.target_names # Названия сортов ирисов + + # setosa + setosa_inds = Y == np.where(Y_str == "setosa")[0][0] + setosa_data = X[setosa_inds, :] + # versicolor + versicolor_inds = Y == np.where(Y_str == "versicolor")[0][0] + versicolor_data = X[versicolor_inds, :] + # virginica + virginica_inds = Y == np.where(Y_str == "virginica")[0][0] + virginica_data = X[virginica_inds, :] + + # Определяем функцию классификации + def classification(data, label, k): + X_train, X_test, y_train, y_test = train_test_split(data, label, random_state=10) #Разделение данных + knn = KNeighborsClassifier(n_neighbors=k, metric='euclidean') # Создание KNN-классификатора + knn.fit(X_train, y_train) + predicted_data = knn.predict(X_test) + report = sklearn.metrics.classification_report(y_test, predicted_data) + + # Пример вызова функции классификации + setosa_data = sklearn.preprocessing.normalize(setosa_data) + versicolor_data = sklearn.preprocessing.normalize(versicolor_data) + virginica_data = sklearn.preprocessing.normalize(virginica_data) + data_all = np.vstack((setosa_data,versicolor_data,virginica_data)) + + fig, axs = plt.subplots(2, 3, figsize=(12,8),dpi=160) + axs[0, 0].scatter(data_all[:50, 0], data_all[:50, 1], marker='*') + axs[0, 0].scatter(data_all[50:100, 0], data_all[50:100, 1], marker='^') + axs[0, 0].scatter(data_all[100:, 0], data_all[100:, 1], marker='+') + axs[0, 0].title.set_text('features 1 and 2') + + axs[0, 1].scatter(data_all[:50, 0], data_all[:50, 2], marker='*') + axs[0, 1].scatter(data_all[50:100, 0], data_all[50:100, 2], marker='^') + axs[0, 1].scatter(data_all[100:, 0], data_all[100:, 2], marker='+') + axs[0, 1].title.set_text('features 1 and 3') + + axs[0, 2].scatter(data_all[:50, 0], data_all[:50, 3], marker='*') + axs[0, 2].scatter(data_all[50:100, 0], data_all[50:100, 3], marker='^') + axs[0, 2].scatter(data_all[100:, 0], data_all[100:, 3], marker='+') + axs[0, 2].title.set_text('features 1 and 4') + + axs[1, 0].scatter(data_all[:50, 1], data_all[:50, 2], marker='*',) + axs[1, 0].scatter(data_all[50:100, 1], data_all[50:100, 2], marker='^') + axs[1, 0].scatter(data_all[100:, 1], data_all[100:, 2], marker='+') + axs[1, 0].title.set_text('features 2 and 3') + + axs[1, 1].scatter(data_all[:50, 1], data_all[:50, 3], marker='*') + axs[1, 1].scatter(data_all[50:100, 1], data_all[50:100, 3], marker='^') + axs[1, 1].scatter(data_all[100:, 1], data_all[100:, 3], marker='+') + axs[1, 1].title.set_text('features 2 and 4') + + axs[1, 2].scatter(data_all[:50, 2], data_all[:50, 3], marker='*') + axs[1, 2].scatter(data_all[50:100, 2], data_all[50:100, 3], marker='^') + axs[1, 2].scatter(data_all[100:, 2], data_all[100:, 3], marker='+') + axs[1, 2].title.set_text('features 3 and 4') + plt.show() + + data = np.hstack((data_all[:,0].reshape(150,1),data_all[:,1].reshape(150,1))) + print('Количество соседей = 2:') + classification(data,label,2) + print('Количество соседей = 5:') + classification(data,label,5) + print('Количество соседей = 20:') + classification(data,label,20) + print('Количество соседей = 70:') + classification(data,label,70) + print('///////////////////////////////////////////////////////////////////') + data = np.hstack((data_all[:,0].reshape(150,1),data_all[:,2].reshape(150,1))) + print('Количество соседей = 2:') + classification(data,label,2) + print('Количество соседей = 5:') + classification(data,label,5) + print('Количество соседей = 20:') + classification(data,label,20) + print('Количество соседей = 70:') + classification(data,label,70) + print('///////////////////////////////////////////////////////////////////') + data = np.hstack((data_all[:,0].reshape(150,1),data_all[:,3].reshape(150,1))) + print('Количество соседей = 2:') + classification(data,label,2) + print('Количество соседей = 5:') + classification(data,label,5) + print('Количество соседей = 20:') + classification(data,label,20) + print('Количество соседей = 70:') + classification(data,label,70) + print('///////////////////////////////////////////////////////////////////') + data = np.hstack((data_all[:,1].reshape(150,1),data_all[:,2].reshape(150,1))) + print('Количество соседей = 2:') + classification(data,label,2) + print('Количество соседей = 5:') + classification(data,label,5) + print('Количество соседей = 20:') + classification(data,label,20) + print('Количество соседей = 70:') + classification(data,label,70) + print('///////////////////////////////////////////////////////////////////') + data = np.hstack((data_all[:,1].reshape(150,1),data_all[:,3].reshape(150,1))) + print('Количество соседей = 2:') + classification(data,label,2) + print('Количество соседей = 5:') + classification(data,label,5) + print('Количество соседей = 20:') + classification(data,label,20) + print('Количество соседей = 70:') + classification(data,label,70) + print('///////////////////////////////////////////////////////////////////') + data = np.hstack((data_all[:,2].reshape(150,1),data_all[:,3].reshape(150,1))) + print('Количество соседей = 2:') + classification(data,label,2) + print('Количество соседей = 5:') + classification(data,label,5) + print('Количество соседей = 20:') + classification(data,label,20) + print('Количество соседей = 70:') + classification(data,label,70) + + +if __name__ == "__main__": + l7 = lab7() + l7.main() diff --git a/main.py b/main.py index a088d68..c38e713 100644 --- a/main.py +++ b/main.py @@ -2,10 +2,5 @@ from app.utils.config import debug from app.menu_load import menu if __name__ == "__main__": - if debug == True: - print("Running in debug mode...") - from test_module.debug_main import debug_main_start - debug_main_start() - else: - mn = menu() - mn.main_menu() + mn = menu() + mn.main_menu() diff --git a/requirements.txt b/requirements.txt index dc05f4e..76e29a5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ numpy==1.24.4 matplotlib==3.7.5 scikit-learn==1.3.2 +pandas==2.2.3