Предположим, у меня есть 2 вектора.Какие алгоритмы я могу использовать для их сравнения?

StackOverflow https://stackoverflow.com/questions/1805987

  •  05-07-2019
  •  | 
  •  

Вопрос

Компания 1 имеет такой вектор:

['books','video','photography','food','toothpaste','burgers'] ... ...

Компания 2 имеет такой вектор:

['video','processor','photography','LCD','power supply', 'books'] ... ...

Предположим, это частотное распределение (я мог бы сделать его кортежем, но слишком большим для ввода).
Как вы можете видеть ... у этих векторов есть вещи, которые перекрываются."видео" и "фотография" кажутся "схожими" между двумя векторами из-за того, что они находятся в схожих положениях.И ... "книги", очевидно, являются сильной стороной компании 1.Порядок и позиционирование действительно имеют значение, поскольку это частотное распределение.

Какие алгоритмы вы могли бы использовать, чтобы поиграть с этим?Какие алгоритмы вы могли бы использовать, которые могли бы предоставить ценные данные для этих компаний, используя эти векторы?

Я новичок в текстовом анализе и поиске информации.Может ли кто-нибудь рассказать мне об этих темах в связи с этим вопросом?

Это было полезно?

Решение

Если позиция очень важна, как вы подчеркиваете, то решающая метрика будет основана на разнице позиций между одними и теми же элементами в разных векторах (вы можете, например, суммировать абсолютные значения разностей или их квадраты).Большая проблема, которую необходимо решить, заключается в том, сколько весить элемента, который присутствует (скажем, это N-й элемент) в одном векторе и полностью отсутствует в другом.Является ли это относительно незначительной проблемой - как если бы отсутствующий элемент действительно присутствовал сразу после настоящих, например, - или действительно, действительно серьезной проблемой?Это невозможно сказать без более глубокого понимания реальной области применения.Вы можете попробовать различные способы решения этой проблемы и посмотреть, какие результаты они дают на интересующих вас примерах!

Например, предположим, что "отсутствующий элемент примерно такой же, как если бы он присутствовал, сразу после настоящих".Затем вы можете предварительно обработать каждый входной вектор в элемент отображения dict для позиционирования (важная оптимизация, если вам нужно сравнить много пар входных векторов!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

а затем, чтобы сравнить два таких диктатора:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(или abs(d) вместо возведения в квадрат в последнем выражении).Чтобы сделать недостающие элементы более весимыми (составлять диктанты, т.е.векторы, рассматриваемые дальше), вы могли бы использовать удвоенные длины вместо просто длин или какую-нибудь большую константу, такую как 100, в аналогично структурированной программе.

Другие советы

Я бы посоветовал вам книгу под названием Программирование Коллективного разума.
Это очень хорошая книга о том, как вы можете извлекать информацию из простых данных, подобных этой.Включены примеры кода (на Python :)

Редактировать: Просто отвечаю на gbjbaanb:Это Python!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

Ознакомьтесь с расстоянием Хэмминга

Как упоминал mbg, дистанция Хэмминга - хорошее начало.По сути, это присвоение битовой маски для каждого возможного элемента, независимо от того, содержится ли он в значении companies.

Например.зубная паста стоит 1 для компании A, но 0 для компании B.Затем вы подсчитываете биты, которые отличаются между компаниями.С этим связан коэффициент Жаккарда.

Расстояние Хэмминга на самом деле не сможет уловить сходство между такими понятиями, как "видео" и "фотография".Очевидно, что компания, которая продает одно, продает и другое с большей вероятностью, чем компания, которая продает зубную пасту.

Для этого вы можете использовать такие материалы, как LSI (он также используется для уменьшения размерности) или факториальные коды (напримернейронные сети, такие как ограниченные машины Больцмана, автокодеры или минимизация предсказуемости), чтобы получить более компактные представления, которые затем можно сравнить, используя евклидово расстояние.

выберите ранг каждой записи (чем выше ранг, тем лучше) и сделайте сумму геометрических средних между совпадениями

для двух векторов

sum(sqrt(vector_multiply(x,y)))  //multiply matches

Сумма рангов для каждого значения по вектору должна быть одинаковой для каждого вектора (предпочтительно 1) Таким образом, вы можете сравнивать более двух векторов.

Если вы примените метод ikkebr, вы сможете найти, как a похож на b

в этом случае просто используйте

sum( b( b.intersection(a) ))

Вы можете использовать set_intersection . Сначала нужно отсортировать 2 вектора (использовать вызов сортировки), затем передать 4 итератора, и вы получите коллекцию с общими элементами, вставленными в нее. Есть несколько других, которые работают аналогичным образом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top