import numpy as np
from sklearn.datasets import make_classification, make_moons
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import classification_report
from Helper_SVM_students import *
from SVM_Classifier_students import SVM_custom
from sklearn.inspection import DecisionBoundaryDisplay
import matplotlib.pyplot as plt
from sklearn.svm import SVC

#PRIMO TEST DI SVM CON KERNEL POLYNOMIALE
X, y = make_classification(n_samples=150, n_features=2, n_classes=2, n_informative=2, n_redundant=0, n_repeated=0, class_sep=1.0)
y[np.where(y==0)] = -1

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)

#Inizializzazione del classificatore e addestramento
clf = SVM_custom(C=1e0, opt_strat='dual', kernel='polynomial', degree=2)
clf.fit(X_train, y_train)

#Calcolo delle etichette predette sul test set e stampa del report di classificazione
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))

#Rappresentazione grafica del risultato (solo per n_samples = 2)
if X.shape[1] == 2:
    disp = DecisionBoundaryDisplay.from_estimator(
        clf, X_train, response_method="predict",
        alpha=0.5,
    )
    disp.ax_.scatter(X[:, 0], X[:, 1], c=y, edgecolor="k")
    plt.show()


