Это звучит, как вам нужно cosine similarity меру:
similarity = cos(v1, v2) = v1 * v2/(|v1| |v2|)
где v1 * v2
является скалярное произведение между v1
и v2
:
v1 * v2 = v1[1]*v2[1] + v1[2]*v2[2] + ... + v1[n]*v2[n]
По существу, скалярное произведение показывает, сколько элементов в обоих векторов есть 1 в то же положение: если v1[k] == 1
и v2[k] == 1
, то итоговая сумма (и, следовательно, сходство) увеличивается, в противном случае она не изменяется.
Вы можете использовать сам точечный продукт, но иногда вам нужно, чтобы окончательное сходство было нормализовано, например. от 0 до 1. В этом случае вы можете разделить точечный продукт v1
и v2
по их длине - |v1|
и |v2|
. По существу, длина вектора квадратный корень из скалярного произведения вектора с самими собой:
|v| = sqrt(v[1]*v[1] + v[2]*v[2] + ... + v[n]*v[n])
Имея все это, это легко осуществить косинус расстояния следующим образом (пример в Python):
from math import sqrt
def dot(v1, v2):
return sum(x*y for x, y in zip(v1, v2))
def length(v):
return sqrt(dot(v, v))
def sim(v1, v2):
return dot(v1, v2)/(length(v1) * length(v2))
Примечания , что я описал сходство (сколько двух векторов близко друг к другу), а не расстояние (как далеко они есть). Если вам нужно точно расстояние, вы можете рассчитать его как dist = 1/sim
.
поэтому в чем вопрос? – Pradheep
Извините, уже отредактирован, если есть какие-либо метрики расстояния, которые могут захватить это – 2013-05-11 11:32:54
'Я интересуюсь группами '1', которые вместе'. Не могли бы вы объяснить, что вы имеете в виду? 1 и 2 более похожи друг на друга из-за того же количества групп? –