Знайдіть близькі пари у дуже великому просторі з розрідженими векторами


9

Я маю N(~ мільйон) функціональних векторів. ІснуєM (~ мільйон) двійкових функцій, але лише в кожному векторі K (~ тисяча) з них було б 1, решта є 0. Я шукаю пари векторів, які мають хоча бL (~ сотня) спільних ознак (1в обох). Кількість таких пар має аналогічну величинуN (~ мільйон).

Я думаю, що до цього можна підійти, як шукати пари близьких точок у дуже великому просторі. Функція відстані може бути такою, що базується на тому, скільки функцій мають два вектори. Але це, мабуть, було б корисно і з більш звичайною метрикою відстані (наприклад, евклідовою).

Які відомі алгоритми були б корисні для вирішення цієї проблеми? Все, що є квадратнимN або M не буде практичним.


Розглянемо приклад постановки проблеми в реальному світі Nлюди, що пересуваються між різними місцями. Якщо двоє людей були в одній і тій же місцевості одночасно, ми говоримо, що вони зустрілися один з одним. (Кількість комбінацій місце-час із присутньою щонайменше однією людиною єM.) Ми шукаємо друзів: людей, які зустрічалися хоча б L разів.


1
Якщо вектор 1, функція 1 є 0, & вектор 2, функція 1 також є 0, чи мають у них таку особливість "спільного"?
gung - Відновіть Моніку

@ user777, я вважаю, що ні , і в цьому випадку ваша відповідь ідеальна, але було б добре, щоб це було чітко зазначено в ОП.
gung - Відновіть Моніку

@gung, ти вважаєш правильно. Я відредагував питання, щоб уточнити. Дякую!
Даніель Дарабос

1
Про те, скільки пар векторів мають> 100 спільних ознак - випадкова вибірка + груба сила? Чи є реальні проблеми розмірами 1M x 1M чи складеними? Дивіться також підхід у пошуку бітових рядків-найближчих-сусідів у stackoverflow.
denis

1
Можливо шалена пропозиція: перегляньте свої вектори довжиною 1 Мбіт у вигляді зображень розміром 1000 х 1000 пікселів та знайдіть методи кластеризації зображень, наприклад, stackoverflow.com/search?q= evidenceimageSense+ clustering . Афаїк, ви повинні знайти хороші функції (не поодинокі пікселі), щоб це працювало, але я не фахівець.
denis

Відповіді:


6

Схоже, що підхід, який ви шукаєте, - це комбінація підписів на міні-шах та чутливості до локальності (LSH); (у вільному доступі) pdf Майнінг масивних наборів даних детально описує цей підхід (та інші заходи подібності) у Розділі 3, але коротко:

Minhash підпис є згущене уявлення вихідної матриці , яка будується із застосуванням деякого числа п хеш - функцій до функцій, зменшуючи тим самим кількість функцій в спостереженні. Це зменшує розмір ваших даних, однак ви, мабуть, помітите, що це все ще залишає васO(N2) проблема.

Щоб вирішити це, MMDS радить, що якщо все, що ви хочете знайти, це пари, що перевищують певний поріг подібності (який, здавалося б, застосовується у вашому випадку), то ви можете зосередитись лише на тих парах, які, швидше за все, схожі - такий підхід називається Locality Sensitive Hashing , і в розділі 3.4 вони проходять приклад того, як поєднати підхід підпису minhash з LSH.

Окрім тексту, є також лекції з однойменного курсу Coursera .


7

Я шукаю пари векторів, які мають хоча б L спільні риси.

Це лише внутрішній продукт бінарних функціональних векторів. Коли внутрішній виріб більший заL1, у пари буде як мінімум Lспільні елементи. Це повинно бути порівняно швидким обчисленням - принаймні, швидшим, ніж евклідова відстань, що було б марно і повільно для цих даних. Оскільки ви заявляєте, що шукаєте пари, це по суті означає, що вам доведеться робити обчислення для порівняння кожного вектора.(N2)

Пошук точок, які є близько один до одного, справді є проблемою кластеризації. Але перший крок алгоритмів кластеризації, який я знайомий, - це обчислення парних відстаней або подібності. Я впевнений, що хтось розробив більш ефективні альтернативи. Суть про термінологію: наявність принаймні спільних сусідів виражається як подібність , а не відстань! Внутрішні продукти - це в цьому випадку ненормалізовані косинусні подібності.L

Це можна зробити більш простежуючим, виконавши лише обчислення внутрішнього продукту, коли сума векторного ознаки (що в даному випадку така ж, як норма) для спостереження більша за , оскільки неможливо для цього бінарного вектора ознак мати внутрішній продукт з іншим бінарним вектором ознак , який буде задовольняти мій критерій , коли ця сума менше , ніж . Очевидно, що обчислення цих сум є лише складною , тому я - дешевий спосіб зменшити масштабність внутрішнього кроку продукту.L1LO(N)

Але класичним способом зменшити масштаб цієї проблеми є додаткова попередня фільтрація. Вас особливо цікавить, коли одна, дещо незвична функція приймає значення 1? Якщо так, виконайте обчислення лише для цих функціональних векторів.

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

Після деякої додаткової думки, у мене є сильна підозра , що дані ви працюєте, яке - то граф . Дуже правдоподібно, що складається з декількох з'єднаних компонентів, і в цьому випадку ви можете розкласти на набір графіків, із задоволеним побічним ефектом зменшення розмірності даних. Навіть якщо графік є лише двома з'єднаними компонентами приблизно однакового розміру, це означає, що ваше попарне порівняння має приблизно загальну вартість!GGGO(N2)14

Якщо графік симетричний, можуть бути корисні такі спостереження:

  1. Визначте Лаплаціана вашого графа як , де - діагональна матриця градусів (сума кожного векторного ознаки), а - матриця примикання (укладання векторів ознак у матрицю).P=DADA
  2. Часи числа відображається як власне є число компонент зв'язності . Декомпозиція графіка в його з'єднані компоненти та робота виключно з цими компонентами матиме побічний ефект зменшення розмірності ваших даних; обчислити вашу кількість інтересів буде простіше. Але обчислення ейгендекомпозиції буде коштувати дорого за мільйон вершин ...0PG
  3. (Після повної перестановки) являє собою блок - діагональна матриця лапласіанов з компонент зв'язності .PG
  4. P - позитивний напівдефініт. Це майже напевно якось корисно.
  5. Алгебраїчна зв'язність є значенням другого-найменше власне . Це говорить про те, наскільки добре пов'язаний є. Можливо, це відповість на деякі запитання, які вас цікавлять: вектори, які мають спільні риси. Теорія спектральних графів розвиває цю ідею ще детальніше.GPG

"Це проблема СНР?" Я не впевнений. В одному додатку функції описують поведінку, і ми хочемо пов’язати людей з подібною поведінкою. Це робить це проблемою СНР?

Якщо у вас є двосторонній графік, що пов'язує людей з поведінкою, ви можете вважати це як мережу приналежності , а люди як рядки, а поведінку - як стовпці. Якщо ви хочете , щоб з'єднати людей з людьми з допомогою поведінки , який вони мають у загальному, ви можете вирахувати . - це кількість спільних для людей поведінки. Очевидно, набір вершин, де відповідає на ваше запитання.BBBT=AAijAijL


Дякую за відмінну відповідь! Це багато речей, які мені доведеться дослідити далі. Я не переконаний, що парні порівняння неминучі. Це не проблема кластеризації, коли я шукаю кластери розміром> 1? Я очікував, що деякий підхід до просторового розподілу може значно зменшити кількість парних порівнянь.
Даніель Дарабос

Вибачте, я не знаю багато про науку даних. Але хіба це не проблема кластеризації, коли ми шукаємо згрупувати точки, розташовані близько один до одного? Я маю максимальну відстань (L) і хочу знайти групи (пари) точок, які лежать на відстані одна від одної. Це розтягування визначення кластеризації занадто багато?
Даніель Дарабос

1
Це дійсно можна охарактеризувати як графічну проблему. У цьому випадку ми маємо двосторонній графік з N точок і M ознак і хочемо знайти пари точок, які мають принаймні L загальних сусідів. Зараз я спеціально розглядаю фразові фрази на основі функцій, сподіваючись, що існує метод кластеризації, який може бути корисним для мене. K-SVD запропонував подібну проблему в stats.stackexchange.com/questions/93366/… , тому я зараз читаю про це. Дякую!
Даніель Дарабос

"Це проблема СНР?" Я не впевнений. В одному додатку функції описують поведінку, і ми хочемо пов’язати людей з подібною поведінкою. Це робить це проблемою СНР? Дякуємо, що познайомили мене з термінологією, дуже корисно орієнтуватись на пошук.
Даніель Дарабос

Я переглянув свою відповідь. Ваша кінцева мета - просто перерахувати людей, що мають багато спільних способів поведінки, чи це щось інше?
Sycorax повідомляє про відновлення Моніки

2

людей, які зустрічаються у просторі-часі блоки:
розділіть простір на блоки (міські блоки, квадратні км, що завгодно) та час на блоки . Є хороший шанс, що якщо люди зустрінуться, вони зустрінуться в одному блоці. Тому запускайте NN в кожному блоці. Виконання та швидкість помилок, звичайно, залежатимуть від розмірів та форм блоків (також від того, з чим ви можете паралелізувати / MapReduce), але у вас є параметри, з якими можна грати - інженерія, а не широко відкритий .NspaceNtime
O(N2)

Дивіться також:
Найближчі-сусіди-пошук-для-дуже-високих розмірів даних на datascience.stackexchange

pairwise.py :

використовує бібліотеку Python Gensim та heapq зі стандартної бібліотеки для масового швидкого та масштабованого попарного порівняння між атрибутивно великою кількістю документів за допомогою TF-IDF та косинусоїдальної відстані.


1

Перевернутий словник! Представіть крапку як , ключі, що відповідають ненульовим значенням (тобто функції, що відповідають дійсності). Середній розмір зберігання елемента буде . Дійсно, мені потрібні лише рядки для зберігання функцій, а плаває, щоб утримувати значення.xfeat1:value1,feat101:value101KKK

Для кожної функції побудуйте словник із вмістом індексів, що поділяють цю функцію. Сподіваємось, це число не буде занадто великим (якщо у вас є функція, якою поділяються всі індекси, такий підхід зруйнований, ви можете перестати читати тут).

Цей словник виглядає так: . Якщо я хочу набрати швидкість і заощадити простір, я навіть можу скинути функції, які можна знайти лише з одним елементом (тут: ), оскільки вони не створюють близьких пар. Цей словник вбудований в операції .feat1:{1,101,202},feat2:{7,202},feat3:{202}...featM:{3,45,6}feat3O(NK)

Тепер, коли ви хочете оцінити відстань елемента до інших, створіть (зі словником) список індексів, що діють принаймні однією ознакою з . Ви знаєте, що всі інші елементи далекі від (вони навіть не мають жодної функції!). Якщо середня кількість "елементів на особливість" є низькою (назвіть її ), вам більше не потрібно перебувати в .xxxPO(N2)

Тепер є ще одне велике вдосконалення, якщо і представлені також як словники, оскільки або можна оцінити ітерацією по клавішах і , в операціях .xyd(x,y)<x,y>xyO(K)

Ваша остаточна складність - це замість наївного початкового підходу.O(NPK)O(MN2)

Я застосував цей метод для впровадження КНН над великим текстовим набором (поїзд: 2 000 000 рядків, тест 35 000 рядків, кількість особливостей: 10 000, середня кількість функцій на елемент: 20), який пробіг приблизно за годину. .


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

1) "це число не буде занадто великим": середня сума стовпців = середня сума рядка = 1000. 2) плаває? Особливості ОП - це двійкові 3) тривалість виконання протягом 3 циклів N, 2N, 4N, що було б цікаво, показало б, якщо вони приблизно . O(N2)
denis

1

Я знайшов посилання, яке може бути корисним, і я вважаю, що це асимптотично ефективніше, ніж будь-яке інше рішення, представлене дотепер. Якщо я правильно розумію, ви можете побудувати графу найближчий сусід (KNN) за час .kO(LNlog(N))

Л. Ероц, М. Штейнбах та В. Кумар. "Новий спільний алгоритм кластеризації найближчого сусіда та його програми." Праці 1-го семінару з кластеризації даних високих розмірів та його застосувань, 2002.


Дякую, це цікаве прочитання. Як ви отримали час O (журнал LN (N))? Звучить чудово. Але опис алгоритму починається з "Побудувати матрицю подібності", і це була б матриця NxN, наскільки я розумію.
Даніель Дарабос

@DanielDarabos Складність описується в книзі « Практичний графік
Sycorax каже: Відновити Моніку

1

Божевільним, але, ймовірно, підходом може стати перехід на частотну область. Існує божевільний / хворий швидкий ффт під назвою " рідкісний FFT ", де ви вказуєте кількість режимів, про які вам важливо (ваша кількість 100 функцій), а потім ви працюєте в згортаннях і шукаєте рядок-макс більший за поріг (шукайте біти у верхніх регістрах ваших номерів). Це буде де .O(klogn)k<<n

Враховуючи, що ваш k становить 100, а ваш n - 1e6, це повинно прискорити ~ 1e4x прискорення порівняно з класичним FFT.

Якщо вам потрібна ще 20-кратна швидкість, і ви приймаєте ризик, то замість того, щоб зводити всі рядки до домену та шукати пік, ви можете завантажувати підмножину рядків.

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

Завдання: я маю навести приклад із використанням синтетичних даних та порівняти деякі методи.


0

Я щойно натрапив на папір, що має пряме значення.

Рандомізовані алгоритми та NLP: використання хеш-чутливої ​​функції для кластеризації іменників високої швидкості (Ravichandran et al, 2005)

Це реально реалізовано в https://github.com/soundcloud/cosine-lsh-join-spark , де я його знайшов.

Він ґрунтується на чутливому хешировании (вже згадувалося в інших відповідях). Після того, як він скоротив вектори функцій до просторового простору, він використовує швидке приєднання дистанції Хеммінга, щоб знайти найближчих сусідів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.