Найти похожие записи в наборе данных

У меня есть набор данных из 25 целочисленных полей и 40 тыс. записей, например.

1:
  field1: 0
  field2: 3
  field3: 1
  field4: 2
  [...]
  field25: 1
2:
  field1: 2
  field2: 1
  field3: 4
  field4: 0
  [...]
  field25: 2

и т.п.

Я тестирую MySQL, но не привязан к ней.

Учитывая одну запись, мне нужно получить записи, наиболее похожие на нее; что-то вроде самой низкой средней разницы полей. Я начал смотреть на следующее, но я не знаю, как сопоставить это с проблемой поиска сходства в большом наборе данных.


person yitznewton    schedule 20.02.2011    source источник
comment
Ваша проблема может быть классифицирована как форма Поиска ближайших соседей (см.: en. wikipedia.org/wiki/Nearest_neighbor_search). На эту тему имеется обширная литература. Статья в Википедии может предоставить полезные возможности для поиска.   -  person mhum    schedule 20.02.2011


Ответы (2)


Я знаю, что это старый пост, но для тех, кто приходит к нему в поисках похожих алгоритмов, особенно хорошо работает косинусное сходство. Найдите способ векторизовать свои записи, затем ищите векторы с минимальным углом между ними. Если векторизация записи нетривиальна, то вы можете векторизовать сходство между ними с помощью некоторого известного алгоритма, а затем посмотреть на косинусное сходство векторов сходства с вектором идеального соответствия (при условии, что идеальные совпадения не являются целью, поскольку их легко найти). все равно найдешь). Я получаю потрясающие результаты при таком сопоставлении, даже сравнивая такие вещи, как списки людей в разных странах, работающих над конкретным проектом, с различным вкладом в проект. Векторизация подразумевает просмотр количества совпадений стран, несоответствий стран, соотношения людей в соответствующей стране между двумя наборами данных и т. д. и т. д. и т. д. Я использую функции расстояния редактирования строки, такие как расстояние Левенштейна, для получения числового значения из различий строк, но можно использовать фонетическое сопоставление и т. д. Пока целевое число не равно 0 (вектор [0 0 ... 0] является подпространством ЛЮБОГО вектора, и, следовательно, его угол будет неопределенным. Иногда, чтобы уйти от проблемы, например, в случае редактирования расстояние, я придаю идеальному совпадению (e.d. 0) отрицательный вес, так что идеальное совпадение действительно подчеркивается. 1 опечатка.

Cos(theta) = (A dot B) / (Norm(A)*Norm(B)), где точка — скалярное произведение, а Norm — евклидова величина вектора.

Удачи!

person Greg K    schedule 25.10.2011
comment
ТЫ! Можете ли вы порекомендовать какой-либо ресурс по векторизации? - person yitznewton; 25.10.2011

Вот возможность с прямым средним расстоянием между каждым из полей (значение после каждого минуса из данной записи, требующей совпадения):

SELECT id,
(
  ABS(field1-2)
  + ABS(field2-2)
  + ABS(field3-3)
  + ABS(field4-1)
  + ABS(field5-0)
  + ABS(field6-3)
  + ABS(field7-2)
  + ABS(field8-0)
  + ABS(field9-1)
  + ABS(field10-0)
  + ABS(field11-2)
  + ABS(field12-2)
  + ABS(field13-3)
  + ABS(field14-2)
  + ABS(field15-0)
  + ABS(field16-1)
  + ABS(field17-0)
  + ABS(field18-2)
  + ABS(field19-3)
  + ABS(field20-1)
  + ABS(field21-0)
  + ABS(field22-1)
  + ABS(field23-3)
  + ABS(field24-2)
  + ABS(field25-2)
)/25
AS distance 
FROM mytable
ORDER BY distance ASC
LIMIT 20;
person yitznewton    schedule 20.02.2011
comment
Чему равно это прямое среднее расстояние? я не мог погуглить. Вы предлагаете этот метод по косинусному сходству? - person Nikhil S; 01.10.2012