У вас есть множество эмбеддингов — векторов признаков объектов (например, предложений, изображений, пользователей).
Требуется реализовать функцию
find_similar_pairs(vectors, tolerance=0.05), которая возвращает все пары индексов, где косинусная разница между векторами меньше tolerance.Дополнительные условия:
• Векторы могут быть высокой размерности (до 512)
• Пара (i, j) считается дубликатом (i < j), если их cosine similarity ~ 1.0
• Не используйте внешние ML-библиотеки: только numpy
• Функция должна быть оптимизирована — без грубой проверки каждой пары, если можно
Решение задачи🔽
import numpy as np
def cosine_similarity(a, b):
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
def find_similar_pairs(vectors, tolerance=0.05):
result = []
n = len(vectors)
for i in range(n):
for j in range(i + 1, n):
sim = cosine_similarity(vectors[i], vectors[j])
if 1 - sim <= tolerance:
result.append((i, j))
return result