Cosine vs Euclidean similarity на собеседовании Data Scientist
Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.
Содержание:
Зачем разбирать на собесе
Метрики расстояния — kNN, kmeans, embeddings similarity, recsys. На собесе DS: «отличие cosine и euclidean», «зачем normalize перед kmeans», «когда Manhattan».
Euclidean distance
Прямое геометрическое расстояние.
d(a, b) = √Σ(aᵢ - bᵢ)²L2-норма разности векторов.
Свойства:
- Чувствителен к scale — большая координата доминирует.
- Чувствителен к dimensionality (curse of dimensionality в высоких измерениях).
- Естественен для физических координат.
np.linalg.norm(a - b)Cosine similarity
Угол между векторами.
cos(a, b) = (a · b) / (||a|| · ||b||)∈ [-1, 1] (или [0, 1] для неотрицательных векторов).
Свойства:
- Не зависит от length (норма) векторов.
- Хорош для разреженных high-dim векторов (text embeddings, TF-IDF).
- 1 — same direction, 0 — orthogonal, -1 — opposite.
Cosine distance: 1 - cos(a, b). Не настоящая metric (не triangle inequality), но используется как distance.
from scipy.spatial.distance import cosine
1 - cosine(a, b) # similarityСвязь cosine и euclidean
Если оба вектора имеют единичную длину (||a|| = ||b|| = 1):
||a - b||² = 2 - 2·cos(a, b)Euclidean на нормированных векторах эквивалентен cosine — топ-K совпадает.
Практика. Перед k-means / kNN на embeddings — l2-normalize и используй euclidean. Или сразу cosine.
Manhattan distance
L1-норма.
d(a, b) = Σ|aᵢ - bᵢ|«Расстояние такси» — двигаешься по сетке.
Свойства:
- Менее чувствителен к outliers, чем euclidean.
- Естественен для grid-like (geo координаты на манхэттене, board game).
- Используется в Lasso (L1 регуляризация).
Hamming, Jaccard, специальные
Hamming. Число различающихся позиций между бинарными векторами.
d_H("10110", "10011") = 3 (различается позиции 3, 4, 5)Применение: error-correcting codes, MinHash для приближённого Jaccard.
Jaccard. Для множеств.
J(A, B) = |A ∩ B| / |A ∪ B|Применение: similarity текстов через шинглы, рекомендации (overlapping users).
Mahalanobis. Учитывает covariance:
d² = (a - b)ᵀ Σ⁻¹ (a - b)Полезен на correlated features.
Edit (Levenshtein). Минимум вставок / удалений / замен между строками.
Когда что выбирать
Cosine:
- Text similarity (TF-IDF, sentence embeddings).
- Recsys с user/item embeddings.
- High-dimensional sparse.
- Когда величина не важна, важно направление.
Euclidean:
- Низкая размерность (geo, физика).
- Image embeddings (после нормализации часто).
- k-means по умолчанию.
Manhattan:
- Outliers important.
- L1 регуляризация.
- Grid-like data.
Jaccard:
- Множества (теги, юзеры с интересами).
- Document similarity (shingles).
Hamming:
- Бинарные хеши.
- LSH (locality sensitive hashing).
Частые ошибки
k-means с euclidean без нормализации. Колонка с большим scale доминирует. StandardScaler обязательно.
Cosine для image embeddings без normalization. Многие image embeddings уже нормированы. Проверять.
Использовать cosine в KDTree. scikit-learn KDTree работает с euclidean. Для cosine — BallTree или nmslib.
Mahalanobis на singular covariance. Matrix inversion фейлится. Регуляризация ковариации.
Euclidean в высоких измерениях. Curse of dimensionality — все расстояния примерно одинаковы. Cosine лучше.
Связанные темы
- Embeddings на собесе DS
- PCA — снижение размерности для DS
- Clustering k-means DBSCAN на собесе DS
- Two-tower DSSM на собесе DS
- Подготовка к собесу Data Scientist
FAQ
Cosine — это metric?
Cosine distance = 1 - cos. Не настоящая metric (не triangle inequality), но в индустрии используется как.
Какая метрика для word embeddings?
Cosine — стандарт. word2vec / GloVe / BERT embeddings обычно сравниваются через cosine.
Это официальная информация?
Нет. Статья основана на стандартных подходах в ML и геометрии.
Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.