G

Untitled

public
Guest Apr 02, 2024 Never 34
Clone
Plaintext paste1.txt 63 lines (51 loc) | 2.42 KB
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