2024-11-20 07:26:21 +03:00
|
|
|
|
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()
|