Untitled
public
Apr 02, 2024
Never
65
1 import numpy as np 2 import matplotlib.pyplot as plt 3 from math import sqrt 4 from random import randint 5 from random import random 6 7 class KNN: 8 9 def __init__(self,lista_tacaka,nova_tacka,n): 10 self.lista_tacaka = lista_tacaka 11 self.nova_tacka = nova_tacka 12 self.n = n 13 14 def generisi_tacke(self,broj_tacaka): 15 #return [(100 * np.random.normal(), 100 * np.random.normal()) for i in 16 #range(broj_tacaka)] # normalna raspodela tačaka 17 return [(200 * random() - 100, 200 * random() - 100) for i in range(broj_tacaka)] # ravnomerna raspodela tačaka 18 19 def crtaj(self,lista_tacaka, nova_tacka, boja_tacaka): 20 x,y = zip(*lista_tacaka) 21 plt.scatter(x, y, c=boja_tacaka, s=50) 22 plt.scatter(nova_tacka[0],nova_tacka[1], c="red", s=70) 23 plt.savefig("slika_tacaka.png") 24 plt.show() 25 26 def dodeli_tackama_labele(self,lista_tacaka): 27 return {i:1 if i[0]>0 else 0 for i in lista_tacaka} 28 29 def rast(t1, t2): 30 return sqrt((t1[0]-t2[0])**2+(t1[1]-t2[1])**2) 31 32 def rastojanje_od_tacaka(self, lista_tacaka, nova_tacka): 33 return {i:KNN.rast(i,nova_tacka) for i in lista_tacaka} 34 35 def sortiraj_recnik(self, dict): 36 keys = list(dict.keys()) 37 values = list(dict.values()) 38 sorted_value_index = np.argsort(values) 39 sorted_dict = {keys[i]: values[i] for i in sorted_value_index} 40 return sorted_dict 41 42 def najblizih_k_tacaka(self,lista_tacaka, nova_tacka, k): 43 return list(self.sortiraj_recnik(self.rastojanje_od_tacaka(lista_tacaka, nova_tacka)))[:k] 44 45 def pronadji_labele(self,lista_tacaka, nova_tacka, k, d): 46 najblize = self.najblizih_k_tacaka(lista_tacaka, nova_tacka, k) 47 return [d[i] for i in najblize] 48 49 def odluka(self,lista_tacaka, nova_tacka, k, d): 50 lista_labela = self.pronadji_labele(lista_tacaka, nova_tacka, k, d) 51 print(lista_labela) 52 res = {key: lista_labela.count(key) for key in lista_labela} 53 return max(res.items(), key=lambda kv: (kv[1], kv[0]))[0] 54 55 if __name__=="__main__": 56 broj_tacaka = 50 57 obj = KNN() 58 lista_tacaka = obj.generisi_tacke(broj_tacaka) 59 d = obj.dodeli_tackama_labele(lista_tacaka) 60 nova_tacka = (0,0) 61 obj.crtaj(lista_tacaka, nova_tacka, list(d.values())) 62 for k in range(3,21,2): 63 print(f"Klasa odluke za k={k} je",obj.odluka(lista_tacaka, nova_tacka, k, d)) 64 65