metodi/app/labs/lab4.py

80 lines
3.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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