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):
- k piccolo: poco bias ma tanta varianza: overfitting !Pasted image 20241208143835.png
- k grande: poca varianza ma bias alto: underfitting !Pasted image 20241208143917.png
- un buon k è un trade-off tra i due !Pasted image 20241208144009.png
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