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