master-degree-notes/Foundation of data science/notes/9 K-Nearest Neighbors.md

2.2 KiB

Algoritmo che può essere usato sia per regression che per classification.

Classificazione

ho dei dati di training in un determinato spazio vettoriale in base al numero di feature. Quando voglio classificare un nuovo dato, vedo quali sono i k data point più vicini al dato che voglio classificare sulla base della distanza (tipicamente distanza euclidea). Poi ordino questi k data point (anche detti i k nearest neighbors, ovvero i primi k vicini), e osservo le classi di questi k. Al nuovo data point darò semplicemente la classe maggioritaria che ho osservato tra i neighbors.

!Pasted image 20241208150705.png

Come scelgo il valore migliore per k? Con la Cross Validation (Grid-Search):

Regression

Invece di vedere la classe di maggioranza (anche perché in regression non ci sono le classi), calcolo il valore medio dei neighbors, semplicemente sommo tutti i data point e divido per k.

Metriche per la distanza

Si possono usare varie metriche

Distanza euclidea

La classica distanza cartesiana, la linea che unisce due punti su un piano.

d(x,y) = \sum_{j=1}^d \sqrt{(x_j - y_{j})^2}
Distanza di Manhattan

Misura la somma delle differenze assolute tra le coordinate. Più robusta ai dati con outlier rispetto alla distanza euclidea. Tendenzialmente alla distanza euclidea se la dimensionalità è alta

d(x,y) = \sum_{i=1}^n |x_i - y_i|
Distanza di Minkowski

La possiamo vedere come una forma più "generale", se vario il parametro p

  • per p=1 ho la distanza di Manhattan
  • per p=2 ho la distanza euclidea
d(x,y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{\frac{1}{p}}
Cosine similarity

Quando ci interessa l'angolo tra i vettori più che la distanza, è il coseno dell'angolo tra due vettori. Si usa spesso con vettori di embedding.

Si possono usare tante altre metriche, io ho riportato le più comuni, per approfondire: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.DistanceMetric.html