Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
def distCosine (vecA, vecB):
def dotProduct (x, y):
d = 0.0
for dim in vecA:
if dim in vecB:
d += x[dim]*y[dim]
return d
return dotProduct (vecA,vecB) / math.sqrt(dotProduct(vecA,vecA)) / math.sqrt(dotProduct(vecB,vecB))
По поводу использования метрик: предположим, у нас есть три вектора (10, 10, 1), (1, 1, 0) и (0, 0, 1). Согласно евклидовому расстоянию наиболее близки вектора 2 и 3, а по косинусной метрике — 1 и 2, что более корректно.
Выбор метрики обусловлен конкретной задачей
def distCosine (vecA, vecB):
def dotProduct (x, y):
d = 0.0
for dim in x:
if dim in y:
d += (x[dim]-3.0)*(y[dim]-3.0)
return d
return dotProduct (vecA, vecB) / math.sqrt(dotProduct(vecA,vecA)) / math.sqrt(dotProduct(vecB,vecB))
Коллаборативная фильтрация