human
I am working on the file "STRUCE/2018/SU-2018-LAB03-0036477171.ipynb".
The first task is:
Q: Jesu li rezultati očekivani? Obrazložite. <br>
Q: Bi li bilo dobro kada bismo funkciju fit_transform primijenili na cijelom skupu podataka? Zašto? Bi li bilo dobro kada bismo tu funkciju primijenili zasebno na skupu za učenje i zasebno na skupu za ispitivanje? Zašto?
5. Algoritam k-najbližih susjeda
U ovom zadatku promatrat ćemo jednostavan klasifikacijski model imena algoritam k-najbližih susjeda. Najprije ćete ga samostalno isprogramirati kako biste se detaljno upoznali s radom ovog modela, a zatim ćete prijeći na analizu njegovih hiperparametara (koristeći ugrađeni razred, radi efikasnosti).
(a)
Implementirajte klasu KNN, koja implementira algoritam $k$ najbližih susjeda. Neobavezan parametar konstruktora jest broj susjeda n_neighbours ($k$), čija je podrazumijevana vrijednost 3. Definirajte metode fit(X, y) i predict(X), koje služe za učenje modela odnosno predikciju. Kao mjeru udaljenosti koristite euklidsku udaljenost (numpy.linalg.norm.
pripazite na parametar axis). Nije potrebno implementirati nikakvu težinsku funkciju.
Can you write Python code for it?
 ... Can you provide a the Python code you requested?
assistant
#Here is the Python code you requested.

from numpy.linalg import norm
from collections import Counter

class KNN(object):
    def __init__(self, n_neighbors=3):
        self.n_neighbors = n_neighbors
        self.domain = []
        
    def fit(self, X_train, y_train):
        for x,y in zip(X_train, y_train):
            self.domain.append([x, y])
        return self.domain
        
    def predict(self, X_test):
        pred = []
        for x in X_test:
            dist = []
            y = []
            counter = []
            for xd, yd in self.domain:
                dist.append(norm(x-xd))
                y.append(yd)
            
            dat = sorted(zip(dist, y))[0: self.n_neighbors]
            
            for i in range(0, self.n_neighbors):
                counter.append(dat[i][1])
                
            pred.append((Counter(counter).most_common()[0])[0])

        return pred