# -*- coding: utf-8 -*-
# Created on Sat Sep 31 08:15:00 2024
# @author: mhebding
# DM3 - Intelligence artificielle 2



## 1 - Prediction KNN

import matplotlib.pyplot as plt
from math import sqrt

donneesApprentissage = [
[2,3,'chat'], [1,5,'lapin'], [4,5,'chat'], [5,7,'chat'], [2,10,'lapin'],
[1.2,8,'lapin'], [7,5,'chat'], [3.5,4.5,'chat'], [3,12,'lapin'], [4.2,13,'lapin'], 
[8,6,'lapin'], [2,4,'chat'], [3,5,'chat'], [3.5, 8,'lapin'], [6,7,'lapin'], 
[3,6,'chat'], [3.8,7,'chat'], [8,15,'lapin'], [7,10,'lapin'], [4.5,8,'chat'],
[10,6,'chat'], [8,9,'chat'], [1,6,'lapin'], [2.5,9,'lapin'], [7,7,'chat'],
[2,8,'chat'], [3,7,'chat'], [8,7,'lapin'], [5.5,9.5,'lapin'], [5,3,'chat'],
[9,6,'chat'], [7,8,'lapin'], [4,7,'lapin'], [3,10,'lapin'], [9,7,'chat'],
[5.5,7.5,'lapin'], [5,9,'chat'], [9,9,'lapin'], [0.9,7,'lapin'], [6,9,'chat']
] 

donneesTest = [
[4,8,'chat'], [2.1,2,'chat'], [4.2,6,'lapin'], [3,6,'chat'], [4.9,8,'lapin'], 
[9,12,'lapin'], [2.5,3,'chat'], [8,4,'chat'], [12,2,'chat'], [6,5,'lapin']
]

donneesInconnues = [
[8.5,6.5], [1.5,4.5], [5.5,6.5], [9.5,6.5], [9,8]
]

# 1.
def distanceEuclidienne(donnee1, donnee2): 
    return None

# 2.
def kPlusProches(table, nouveau, k):
    return None

# 3.
def rayon(voisins, nouveau):
    return None

# 4.
def population(table, classe):
    return None

# 5.
def maxVoisins(table):
    return None

# 6.
def essai(table, nouveau, k):
    voisins = kPlusProches(table, nouveau, k)
    classeNouveau = maxVoisins(voisins)
    print("Sur", k, "voisins, il y a", population(voisins,'chat'), "chats et", population(voisins, 'lapin'), "lapins : la cible pourrait etre un", classeNouveau)

print(None)

# 7.
def distanceManhattan(donnee1, donnee2) : 
    return None

def kPlusProches2(table, nouveau, k) : # peut s'ameliorer avec =sorted(table, key=distanceEuclidienne)  
    return None

def essai2(table, nouveau, k):
    print(None)

#print(essai2(donneesApprentissage, donneesTest[5], k=3))



## 2 - Influence de k et matrice de confusion

# 8.
def maxOK():
    print(None)

#print(maxOK())

# 9.
None # Reponse a la question 9. en commentaire

# 10.
None # Reponse a la question 10. en commentaire

# 11.
None # Reponse a la question 11. en commentaire

# 12.
def matriceConfusion():
    return None

# 13.
#print(matriceConfusion())

# 14.
None # Reponse a la question 14. en commentaire

# 15.
None # Reponse a la question 15. en commentaire

# 16.
None # Reponse a la question 16. en commentaire

# 17.
None # Reponse a la question 17. en commentaire

# 18.
None # Reponse a la question 18. en commentaire

def grapheMatrice():
    matrice = matriceConfusion()
    labels = ['chat', 'lapin']
    fig, ax = plt.subplots()
    ax.imshow(matrice,interpolation='none',cmap='Blues')
    for i in range(len(matrice[0])):
        for j in range(len(matrice[1])):
            ax.text(j, i,s=matrice[i][j], va='center', ha='center')
    ax.set_xlabel("Verite")
    ax.set_ylabel("Prediction")
    ax.set_yticks([0, 1], minor = False)
    ax.yaxis.set_ticklabels(labels, minor = False)
    ax.set_xticks([0, 1], minor = False)
    ax.xaxis.set_ticklabels(labels, minor = False)
    plt.show()

#grapheMatrice()

def graphe(table, tableTest, nouveau):
    def listesAttributs(table, classe):
        liste_x, liste_y = [], []
        for element in table:
            if element[2] == classe:
                liste_x.append(element[0])
                liste_y.append(element[1])
        return liste_x, liste_y

    liste_x_1, liste_y_1 = listesAttributs(table, 'chat')
    liste_x_2, liste_y_2 = listesAttributs(table, 'lapin')
    liste_x_3 = [element[0] for element in tableTest]
    liste_y_3 = [element[1] for element in tableTest]

    fig, ax = plt.subplots()
    plt.axis('equal')
    plt.scatter(liste_x_1,liste_y_1, label='chats')
    plt.scatter(liste_x_2,liste_y_2, label='lapins')
    plt.scatter(liste_x_3, liste_y_3, label='test', color='k')
    plt.scatter(nouveau[0], nouveau[1], label='nouveau', color='r')
    plt.xlabel('poids (kg)')
    plt.ylabel('oreilles (cm)')
    voisins = kPlusProches(table, nouveau, k)
    cercle = plt.Circle((nouveau[0], nouveau[1]), rayon(voisins, nouveau), fill=False, ls='dotted') # 10.
    ax.add_patch(cercle)
    plt.legend()
    plt.show()

#k=7
#graphe(donneesApprentissage, donneesTest, donneesTest[0])