Update lab2.py, lab4.py, and 5 more files...

This commit is contained in:
cheykrym 2024-11-20 07:26:21 +03:00
parent 7c4a2f3ed6
commit abf38bce43
7 changed files with 435 additions and 23 deletions

View File

@ -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()

View File

@ -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('аттерограмма 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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -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()

View File

@ -1,3 +1,4 @@
numpy==1.24.4
matplotlib==3.7.5
scikit-learn==1.3.2
pandas==2.2.3