from math import *
from random import *
import  matplotlib.pyplot as plt
import numpy as np
from copy import deepcopy

from sklearn.datasets import load_digits

# Chargement du jeu de données des chiffres
chiffres=load_digits()

X=chiffres.data
Y=chiffres.target # recuperation des classes

# Affichage des chiffres
def afficherChiffres( X, Y, limit_max=10 ):
    """   afficherChiffres( X: list, Y: list, limit_max=10 : int ):
          entrees : X, liste du jeu de données
                  : Y, liste des etiquettes associees
                  : limit_max, entier, nombre de caractères affichés de chaque type
    """
    classes, nombres = np.unique( Y, return_counts = True )
    nombre_max = min( np.max(nombres), limit_max )
    img = np.zeros( ( 100, nombre_max*10 ) )
    for i in range( 10 ) :
        index_classe = np.where(Y == i)[0][:limit_max]
        for j, echantillon in enumerate( index_classe ):
            img[i*10+1:i*10+9,j*10+1:j*10+9] = X[echantillon].reshape((8, 8))
    plt.imshow( img, cmap='binary' )
    plt.xticks([])
    plt.yticks( 5 + 10*np.arange(10), np.arange(10) )
    plt.show()
# tests affichage
# afficherChiffres( X, Y)
# afficherChiffres( X, Y, 14)

def obtenir_echantillons( X , Y, nbEchantillons = 10 ):
    '''Donne une sélection aléatoire d indices d'échantillons pour chaque classe.'''
    index = []
    for classe in np.unique(Y):
        index_classe = np.where(Y == classe)[0]
        replace = len(index_classe) > nbEchantillons
        index += list( np.random.choice(index_classe, size=nbEchantillons, replace=replace) )
    return index

index = obtenir_echantillons( X, Y )
afficherChiffres( X[index], Y[index] )


""" _________________________________________________
      k plus proches voisins
_____________________________________________________"""
# Q1
def distance( im1 , im2 ):



#Q2
def PlusProchesVoisins( X , Y , im , k ):
    # calcul des distances entre chaque image du jeu de données et l'image im


    # tri par ordre croissant de distance


    # on cherche la classe majoritaire parmi les voisins les plus présents :



# Q3- Séparation des données d'apprentissage et de tests


# Affichage après separation puis echantillonnage


# Q4 Précision



"""___________________________________
      k-moyennes
______________________________________"""
#Q6
def barycentre(s):





#Q7
def kmoyennes( X, k ):



#test
