import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import Perceptron
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Создание искусственных данных
rs = np.random.RandomState(42)
#n_samples - число примеров, n_features - признаки, n_redindant - лишние признаки, n_informative - информативные признаки
#random_state - rs для воспроизводимости данных, n_clusters_per_class - 1 кластер классов
X, y = make_classification(n_samples=500, n_features=2, n_redundant=0, n_informative=2, random_state=rs, n_clusters_per_class=1)

# Разделение данных на обучающий и тестовый наборы
#test_size=0.3 - 30% тестов
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=rs)

# Модель персептрона
perceptron = Perceptron()
perceptron.fit(X_train, y_train)
y_pred_perceptron = perceptron.predict(X_test)
accuracy_perceptron = accuracy_score(y_test, y_pred_perceptron)

# Модель многослойного персептрона с 10 нейронами
mlp_10 = MLPClassifier(hidden_layer_sizes=(10,), alpha=0.01, random_state=rs)
mlp_10.fit(X_train, y_train)
y_pred_mlp_10 = mlp_10.predict(X_test)
accuracy_mlp_10 = accuracy_score(y_test, y_pred_mlp_10)

# Модель многослойного персептрона с 100 нейронами
mlp_100 = MLPClassifier(hidden_layer_sizes=(100,), alpha=0.01, random_state=rs)
mlp_100.fit(X_train, y_train)
y_pred_mlp_100 = mlp_100.predict(X_test)
accuracy_mlp_100 = accuracy_score(y_test, y_pred_mlp_100)

# Визуализация данных
plt.figure(figsize=(12, 4))

# Персептрон
plt.subplot(131)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_perceptron, cmap=plt.cm.Paired)
plt.title(f'Персептрон (Точность: {accuracy_perceptron:.2f})')

# Многослойный персептрон с 10 нейронами
plt.subplot(132)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_mlp_10, cmap=plt.cm.Paired)
plt.title(f'MLP (10 нейронов) (Точность: {accuracy_mlp_10:.2f})')

# Многослойный персептрон с 100 нейронами
plt.subplot(133)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred_mlp_100, cmap=plt.cm.Paired)
plt.title(f'MLP (100 нейронов) (Точность: {accuracy_mlp_100:.2f})')

plt.show()