-
Notifications
You must be signed in to change notification settings - Fork 0
/
knn_function.R
21 lines (21 loc) · 968 Bytes
/
knn_function.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# knn function to predict the label of the image
knn = function(train.data, test.data, labels, distance, k, threshold = 10000){
target = NULL
#Computing the distance between rows
dmatrix=dist(rbind(test.data,train.data),
method = distance,
diag = TRUE,
upper = TRUE)
dmatrix=as.matrix(dmatrix) #distances as matrix
dmatrix=dmatrix[1,(nrow(test.data)+1):nrow(dmatrix)] #1st rows distances as a vector
ordenados=sort(dmatrix,index.return=TRUE,decreasing=FALSE) #Indexing the distances from lower to higher
if (ordenados$x[1] > threshold){
return(0)
} else{
labels_sel = labels[ordenados$ix[1:k]] #choosing the labels depending on the distance from 1 to 'k'
uniqv = unique(labels_sel)
target = uniqv[which.max(tabulate(match(labels_sel, uniqv)))] #Selecting the label that is the most repeated
#If they are two values with the same frecuency, it returs the first
return(target)
}
}