100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Python

k-Nearest Neighbors (k-NN)

Explains the instance-based k-NN algorithm, which classifies or predicts based on the majority vote or average of the k closest training examples.

Supervised Learning: ClassificationBeginner8 min readJul 8, 2026
Analogies

k-Nearest Neighbors (k-NN)

k-Nearest Neighbors is one of the simplest algorithms in machine learning to describe, yet it remains a useful baseline and, in some domains, a strong production model. It makes no assumptions about the functional form of the relationship between features and target; instead, for a new data point, it finds the k closest points in the training set (by some distance metric, usually Euclidean) and predicts based on them — the majority class among neighbors for classification, or the average target value for regression. Because it defers all computation to prediction time and simply memorizes the training data, k-NN is called an 'instance-based' or 'lazy' learning algorithm, in contrast to 'eager' learners like linear regression that build an explicit model during training.

🏏

Cricket analogy: Instead of building a coaching model beforehand, k-NN predicts a rookie batsman's role by finding the 5 career stats most similar to his and going with the majority label among them, like comping a newcomer to Ruturaj Gaikwad rather than deriving a formula.

Distance Metrics and the Curse of Dimensionality

The most common distance metric is Euclidean distance, sqrt(sum((xi - x'i)^2)), though Manhattan distance and others are used depending on the data. Because k-NN relies entirely on distance to define 'closeness', feature scaling is essential: a feature measured in the thousands (e.g., income) will dominate the distance calculation over a feature measured in single digits (e.g., number of children) unless both are standardized first. k-NN also suffers acutely from the curse of dimensionality — as the number of features grows, data points become increasingly equidistant from one another in high-dimensional space, and the notion of a 'nearest' neighbor becomes statistically less meaningful, degrading model quality.

🏏

Cricket analogy: Comparing bowlers by both economy rate (single digits) and career wickets (hundreds) without scaling lets wickets swamp the comparison; and adding dozens more unscaled stats makes every bowler look equally 'close', the way high dimensions erode k-NN's notion of nearest neighbor.

Choosing k

The hyperparameter k controls model complexity in the opposite direction from what might be intuitive: small k (e.g., k=1) creates a highly flexible, low-bias but high-variance model that can be very sensitive to noise and outliers in the training data, since a single mislabeled neighbor can flip a prediction. Large k smooths predictions by averaging over more neighbors, increasing bias but reducing variance, and very large k (approaching the full dataset size) eventually predicts the same majority class or global mean for every input. As with other hyperparameters, k is typically chosen via cross-validation, and using an odd k for binary classification avoids tie votes.

🏏

Cricket analogy: Small k=1 mimics judging form off one risky shot, noisy and swayed by a single bad dismissal, while large k=50 just gives the team average. Selectors tune k via trial matches, like cross-validation, and an odd k avoids a tied selection vote.

python
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=500, n_features=6, n_informative=4, random_state=4)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=4)

best_k, best_score = None, -1
for k in [1, 3, 5, 7, 9, 15, 25]:
    model = make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=k))
    scores = cross_val_score(model, X_train, y_train, cv=5)
    mean_score = scores.mean()
    print(f"k={k:>2}  cv accuracy={mean_score:.3f}")
    if mean_score > best_score:
        best_k, best_score = k, mean_score

final_model = make_pipeline(StandardScaler(), KNeighborsClassifier(n_neighbors=best_k))
final_model.fit(X_train, y_train)
print(f"chosen k={best_k}, test accuracy={final_model.score(X_test, y_test):.3f}")

k-NN has essentially zero 'training' cost — fitting just stores the data — but potentially expensive prediction cost, since a naive implementation compares a new point against every training example. This is the opposite computational profile of most models (slow to train, fast to predict), which matters when deciding whether k-NN suits a latency-sensitive production system; libraries mitigate this with spatial indexes like KD-trees or ball trees.

A common misconception is treating k-NN as free of hyperparameters because it 'just looks at neighbors' — in practice the choice of k, the distance metric, and whether to weight neighbors by inverse distance all substantially affect performance, and skipping feature scaling is one of the most frequent real-world k-NN mistakes.

  • k-NN is an instance-based, lazy learner: it stores training data and defers computation to prediction time.
  • Predictions are based on the majority class (classification) or average value (regression) of the k nearest training points.
  • Feature scaling is essential, since distance-based methods are sensitive to the relative magnitude of feature values.
  • Small k gives low bias/high variance; large k gives high bias/low variance — k is tuned via cross-validation.
  • k-NN suffers from the curse of dimensionality: distances become less meaningful as feature count grows.
  • Training is cheap (just storing data) but naive prediction is expensive, scaling with training set size.

Practice what you learned

Was this page helpful?

Topics covered

#Python#MachineLearningBasicsStudyNotes#MachineLearning#KNearestNeighborsKNN#Nearest#Neighbors#Distance#Metrics#StudyNotes#SkillVeris