80 lines
3.1 KiB
Python
80 lines
3.1 KiB
Python
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()
|