Підсилення чутливості до локальності


10

Я намагаюся створити хеш-чутливість до косинусної місцевості, щоб я міг знайти кандидата подібних пар елементів, не порівнюючи всіх можливих пар. У мене це в основному працює, але, здається, більшість пар у моїх даних мають схожість на косинус у діапазоні від -0,2 до +0,2, тому я намагаюся нарізати його досить тонко і вибирати речі з косинусоподібною схожістю 0,1 і вище.

Я читав розділ 3. Майнінг масивних наборів даних. Це говорить про підвищення точності вибору пари кандидатів шляхом посилення сімейства, чутливої ​​до місцевості. Я думаю, що я просто розумію математичне пояснення, але я намагаюся зрозуміти, як я це реалізую практично.

Я маю поки що таке

  1. Я маю на увазі 1000 фільмів у кожному з рейтингами від деяких користувачів 1М користувачів. Кожен фільм представлений розрідженим вектором балів користувачів (номер рядка = ідентифікатор користувача, значення = оцінка користувача)
  2. Я будую N випадкових векторів. Довжина вектора відповідає довжині векторів фільму (тобто кількості користувачів). Значення вектора дорівнює +1 або -1. Я фактично кодую ці вектори як бінарні, щоб заощадити простір, з +1 відображено до 1, а -1 - до 0
  3. Я будую вектори ескізів для кожного фільму, беручи крапковий добуток фільму і кожен з N випадкових векторів (а точніше, якщо я створюю матрицю R, поклавши N випадкових векторів горизонтально і накладаючи їх один на одного, то ескіз для фільму m - R * m), то приймаючи знак кожного елемента в отриманому векторі, тому я закінчую ескізним вектором для кожного фільму + 1s та -1s, який я знову кодую як двійковий. Кожен вектор довжиною N біт.
  4. Далі я шукаю подібні ескізи, роблячи наступне
    1. Я розділив вектор ескізу на b діапазони r біт
    2. Кожна смуга r біт - це число. Я поєдную це число з номером групи і додаю фільм у хеш-відро під цим номером. Кожен фільм може бути доданий до більше ніж одне відро.
    3. Потім я заглядаю в кожне відро. Будь-які фільми, які знаходяться в одному відрі, є парами кандидатів.

Порівнюючи це з 3,6,3 ммдс, мій І крок, коли я дивлюся на смуги r бітів - пара фільмів проходить крок І, якщо r біти мають однакове значення. Мій АБО крок відбувається у відрах: фільми - це пари кандидатів, якщо вони обидва в будь-якому відрі.

Книга передбачає, що я можу "підсилити" свої результати, додавши більше кроків AND і OR, але я втрачаю з точки зору того, як це зробити практично, оскільки пояснення процесу побудови для подальших шарів полягає в тому, щоб перевірити парну рівність, а не придумуючи номери відра.

Хтось може допомогти мені зрозуміти, як це зробити?

Відповіді:


4

Я думаю, я щось розробив. В основному я шукаю підхід, який працює в середовищі карти / зменшення типу, і я думаю, що такий підхід це робить.

Тому,

  • припустимо, у мене є b смуги r рядків, і я хочу додати ще один етап І, скажімо, ще c ANDs.
  • тому замість біт b * r мені потрібні хеші біт b * r * c
  • і я запускаю попередню процедуру c разів, кожен раз на b * r біт
  • Якщо за будь-якою з цих процедур х і у виявляється парою-кандидатом, вона випромінює пару значень ключа ((х, у), 1), з набором ідентифікаторів (х, у) як ключем і значенням 1
  • Наприкінці c процедур я групую ці пари за клавішею та сумою
  • Будь-яка пара (x, y) із сумою, рівною c, була парною кандидатом у кожному з c раундів, і так само є кандидатською парою у всій процедурі.

Тож тепер у мене є дієве рішення, і все, що мені потрібно зробити, - це розробити, чи використання 3 таких кроків насправді допоможе мені отримати кращий результат із меншою кількістю загальних хеш-бітів або покращенням загальної продуктивності ...


0

Я б просто прокоментував, але не можу. Я шукав практичне лікування ампліфікації в LSH, і те, що ви представили, має багато сенсу. З того, що я збираю, головна хеш-функція

h(x,v)={0if sgn(xv)<01else
для деякого випадкового вектора , після AND це стає , і нарешті після АБО, абоТепер ви можете І / АБО, використовуючи як ви описуєте. Тоді ви просто вибиратимете кандидатів на основі логічного твердження ТА / АБО; ти насправді вже не гасиш. На цьому етапі для продовження хешування вам знадобиться відображення бункерів таким чином, що кожен вектор з’являється лише один раз уvh(x,i)=(h(x,vi+1),...,h(x,vi+r))h(x,j)=f(h(x,rj),j)
h(x,y)={1if h(x,j)=h(y,j) for any j[0,b)0else
h(x,y)h^:SSS, але це також, ймовірно, введе помилкові позитиви та / або негативи. Одна ідея для хеша - мінімум для всіх (або мінімум для всіх і всіх, що прямо та опосередковано пов'язані ). Обидва однозначно ввели б упередженість. Я можу спробувати один із них, хоча я не впевнений, що хеши одного випадкового І / АБО будуть значущими наступного разу. Але, враховуючи рівномірний розподіл випадкових та велику кількість реплікацій, можливо?h(x,j)jjyv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.