Найти похожие записи в наборе данных - PullRequest
1 голос
/ 20 февраля 2011

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

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

и т. Д.

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

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

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

Cos (тета) = (Точка B) / (Норма (A) * Норма (B)), где точка - это скалярное произведение, а Norm - евклидова величина вектора.

Удачи!

0 голосов
/ 20 февраля 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;
...