metodi/app/labs/lab4.py

80 lines
3.1 KiB
Python
Raw Normal View History

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