2013-05-11 4 views
8

Вектора как этотСходство расстояние измеряет

v1 = {0 0 0 1 1 0 0 1 0 1 1} 
v2 = {0 1 1 1 1 1 0 1 0 1 0} 
v3 = {0 0 0 0 0 0 0 0 0 0 1} 

нужно вычислить сходство между ними. Расстояние Хэмминга между v1 и v2 составляет 4 и между v1 и v3 также 4. Но поскольку я заинтересован в группах «1», которые вместе для меня v2 гораздо больше похожа на v1 то v3 есть.

Есть ли какие-либо показатели расстояния, которые могут фиксировать это в данных?

Данные представляют собой размещение дома во времени, поэтому для меня это важно. '1' означает занятый, '0' означает не занятый.

+0

поэтому в чем вопрос? – Pradheep

+0

Извините, уже отредактирован, если есть какие-либо метрики расстояния, которые могут захватить это – 2013-05-11 11:32:54

+0

'Я интересуюсь группами '1', которые вместе'. Не могли бы вы объяснить, что вы имеете в виду? 1 и 2 более похожи друг на друга из-за того же количества групп? –

ответ

8

Это звучит, как вам нужно 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.

+0

Я считаю, что это должно быть 'dist = 1 - sim', а не' 1/sim' –

+1

@ThalisK .: оба будут работать. Идея заключается в том, что расстояние в некотором смысле обратное к подобию, поэтому любая обратная (и строго монотонная) функция должна работать, и вы можете выбрать конкретную функцию, основанную на вашей конкретной интерпретации «расстояния». – ffriend

+0

Спасибо. В этом есть смысл. Я был бы признателен, если бы вы взглянули на этот вопрос: http://stackoverflow.com/questions/25181104/cosine-distance-as-vector-distance-function-for-k-means –

0

Я думаю, вы можете просто взять среднее значение значений в каждом наборе. Например v1 здесь будет иметь средний 0,4545, среднее v2 является 0,6363 и среднее v3 является 0,0909. Если единственными возможными значениями в наборе являются 0 и 1, то ваши цели с равными или почти равными значениями будут служить вашей цели.

+1

Это на самом деле хорошая идея, проблема в том, что мне приходится смешивать две метрики как-то вместе. Поскольку векторы '0 0 1 1' и '1 1 0 0' будут со средним возвратом как' 0,5', так и моими метками '4', что все они смещены. Можно ли каким-то образом объединить эти две метрики, каждая из которых дает половину конечного значения? Или это слишком непредсказуемо? – 2013-05-11 11:51:06

+0

Как насчет стандартного отклонения? Это поможет? – Deepu

+0

В каком-то смысле я предполагаю, что распределение под ним было гауссовым. Но если я снова возьму пример '0 0 1 1 и' 1 1 0 0, то ** std ** будет иметь одинаковые результаты. Я знаю, как вы это понимаете, но тогда мне придется сначала сгруппировать его, чтобы сделать кластеры, а затем сравнить средства и std каждого кластера. Но если такое сложное решение существенно отличается. – 2013-05-11 12:17:45

4

Есть буквально сотни дистанционных функций, в том числе дистанционные меры для комплектов, таких как Dice and Jaccard.

Возможно, вы захотите получить книгу «Словарь дистанционных функций», это очень хорошо.

+1

Поднялся название и не нашел его. Могли ли вы предоставить автора, isbn, точное название, пожалуйста? –

+1

Первый результат в Google Книгах. ISBN: 9780080465548 –

1

Случай 1: Если позиция тех, в серии имеет отношение, ТОГДА:

Я рекомендую динамическое время коробление расстояние (DTW). В применении данных временных рядов он оказался невероятно полезным.

Чтобы проверить, может ли он быть применен к вашей проблеме, я использовал код, представленный здесь: https://jeremykun.com/2012/07/25/dynamic-time-warping/

d13 = dynamicTimeWarp(v1,v3) 
d12 = dynamicTimeWarp(v1,v2) 
d23 = dynamicTimeWarp(v2,v3) 

d23,d12,d13 
(3, 1, 3) 

Как вы видите, d12 является самым низким, поэтому v1 и v2 являются наиболее похожи. Более подробную информацию о DTW можно найти в любом месте на этом форуме, а для исследовательских работ я рекомендую что-либо по Eamonn Keogh.

Случай 2: Положение них не имеет значения:

я просто согласен Дип для усреднения в качестве признака.

 Смежные вопросы

  • Нет связанных вопросов^_^