Optimize(knn): optimize evaluate knn to accelerate computation
OPTIMIZE evaluate_knn() : when computing for k=20, we also compute for all k in [1,2,...,19]. So we could just use the labels retrieved with k=20 and use them for fewer k, instead of re-computing distance_matrix() for each k