-
Notifications
You must be signed in to change notification settings - Fork 0
/
KNN.py
54 lines (36 loc) · 1.37 KB
/
KNN.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python
# coding: utf-8
import numpy as np
import pandas as pd
from sklearn import preprocessing
#ensure to input the data as numpy arrays and not dataframe.
# Define KNN Class
def calculate_distance(test, train, method="euclidean"):
if method == "manhattan":
return np.sum(np.abs(test-train))
return np.sqrt(np.sum((test - train)**2))
def accuracy(y_true, y_pred):
return np.sum(y_true == y_pred) / len(y_true)
class KNN:
def __init__(self, k=3, metric="euclidean"):
self.k = k
self.metric = metric
def fit(self, X, y, preprocess_=False):
if preprocess_:
X, y = pd.DataFrame(X), pd.DataFrame(y)
df = pd.concat([X,y], axis=1).dropna()
X = preprocessing.normalize(df.iloc[:, :-1].values)
y = df.iloc[:, -1].values
self.X_train = X
self.y_train = y
self.X_train = X
self.y_train = y
def predict(self, X):
predictions = [self.make_predictions(x) for x in X]
return np.array(predictions)
def make_predictions(self, x):
distances = [calculate_distance(x, x_train, self.metric) for x_train in self.X_train]
indices = np.argsort(distances)[:self.k]
nearest_labels = [self.y_train[i] for i in indices]
pred = np.bincount(nearest_labels).argmax()
return pred