from sklearn.datasets import load_digits
from sklearn.semi_supervised import LabelSpreading
import numpy as np

# Caricamento del dataset digits (immagini 8x8 di cifre manoscritte)
digits = load_digits()
X = digits.data                # Feature: pixel delle immagini appiattiti
y = np.copy(digits.target)     # Copia delle etichette reali, per poterle modificare

# Simulazione di uno scenario con pochi dati etichettati
rng = np.random.RandomState(42)        # Generatore casuale riproducibile
mask = rng.rand(len(y)) < 0.9          # Selezioniamo il 90% dei campioni da "nascondere"
y[mask] = -1                           # -1 indica etichetta sconosciuta per scikit-learn

n_labeled = np.sum(~mask)
print("Campioni etichettati disponibili:", n_labeled, "su", len(y))

# Creazione e addestramento del modello di propagazione delle etichette
model = LabelSpreading(kernel='knn', n_neighbors=7)
model.fit(X, y)

# Valutazione dell'accuratezza sui campioni originariamente nascosti
accuracy = (model.transduction_[mask] == digits.target[mask]).mean()
print("Accuratezza sui dati originariamente nascosti:", accuracy)