Клъстериране на дървовидни структурирани данни

Да предположим, че са ни дадени данни в полуструктуриран формат като дърво. Като пример, дървото може да се формира като валиден XML документ или като валиден JSON документ. Можете да си представите, че това е S-израз, подобен на lisp, или (G)алгебричен тип данни в Haskell или Ocaml.

Дават ни се голям брой „документи“ в дървовидната структура. Нашата цел е да групираме документи, които са подобни. Под групиране имаме предвид начин за разделяне на документите в j групи, така че елементите във всяка да изглеждат един на друг.

Сигурен съм, че има документи, които описват подходи, но тъй като не съм много известен в областта на AI/Clustering/MachineLearning, искам да попитам някой, който е какво да търся и къде да копая.

Настоящият ми подход е нещо подобно:

  • Искам да конвертирам всеки документ в N-измерен вектор, настроен за групиране на K-означава.
  • За да направя това, рекурсивно обикалям дървото на документа и за всяко ниво изчислявам вектор. Ако съм във връх на дърво, повтарям всички подвърхове и след това сумирам техните вектори. Също така, когато се повторя, се прилага фактор на мощността, така че има все по-малко значение колкото по-надолу по дървото отивам. Крайният вектор на документа е коренът на дървото.
  • В зависимост от данните в лист на дърво, прилагам функция, която пренася данните във вектор.

Но със сигурност има по-добри подходи. Една слабост на моя подход е, че ще клъстери само дървета по сходство, които имат върхова структура, която много прилича едно на друго. Ако приликата е налице, но се появява по-надолу в дървото, тогава подходът ми вероятно няма да работи много добре.

Предполагам, че има решения и при търсене в пълен текст, но искам да се възползвам от полуструктурата, присъстваща в данните.

Функция за разстояние

Както беше предложено, трябва да се дефинира функция за разстояние между документите. Без тази функция не можем да приложим алгоритъм за групиране.

Всъщност може да се окаже, че въпросът е точно за тази функция за разстояние и примери за нея. Искам документи, в които елементи близо до корена са еднакви, да се групират близо един до друг. Колкото по-надолу по дървото слизаме, толкова по-малко значение има.

Гледната точка за една крачка назад:

Искам да клъстерирам следи на стека от програми. Това са добре оформени дървовидни структури, където функцията близо до корена е вътрешната функция, която се проваля. Имам нужда от прилична функция за разстояние между следите на стека, които вероятно се случват, защото същото събитие се е случило в кода.


person I GIVE CRAP ANSWERS    schedule 12.12.2010    source източник
comment
За да извършите клъстериране, първо трябва да дефинирате функция за разстояние въз основа на това, което очаквате да си приличат...   -  person Victor Nicollet    schedule 12.12.2010
comment
А, благодаря ти. Това определено точи меча.   -  person I GIVE CRAP ANSWERS    schedule 12.12.2010


Отговори (2)


Като се има предвид естеството на вашия проблем (проследяване на стека), бих го намалил до проблем със съвпадение на низ. Представянето на проследяване на стека като дърво е малко излишно: за всеки елемент в проследяването на стека имате точно един родител.

Ако съпоставянето на низове наистина би било по-подходящо за вашия проблем, можете да преминете през вашите данни, да картографирате всеки възел върху хеш и да създадете за всеки „документ“ неговите n-грами.

Пример:

Картографиране:

  • Изключение A -> 0
  • Изключение B -> 1
  • Изключение C -> 2
  • Изключение D -> 3

Документ А: 0-1-2 Документ Б: 1-2-3

2 грама за документ A: X0, 01, 12, 2X

2 грама за документ B: X1, 12, 23, 3X

Използвайки n-грамите, ще можете да групирате подобни последователности от събития, независимо от основния възел (в този пример събитие 12)

Въпреки това, ако все още сте убедени, че имате нужда от дървета, вместо низове, трябва да имате предвид следното: намирането на прилики за дървета е много по-сложно. Вие ще искате да намерите подобни поддървета, с поддървета, които са подобни на по-голяма дълбочина, което води до по-добър резултат за сходство. За тази цел ще трябва да откриете затворени поддървета (поддървета, които са базовите поддървета за дървета, които го разширяват). Това, което не искате, е колекция от данни, съдържаща поддървета, които са много редки или които присъстват във всеки документ, който обработвате (което ще получите, ако не търсите чести модели).

Ето някои насоки:

След като имате вашите чести поддървета, можете да ги използвате по същия начин, както бихте използвали n-грамите за клъстериране.

person jvdbogae    schedule 13.12.2010

Тук може да намерите документ, който изглежда тясно свързан с вашия проблем .

От резюмето:

This thesis presents Ixor, a system which collects, stores, and analyzes stack traces in distributed Java systems. When combined with third-party clustering software and adaptive cluster filtering, unusual executions can be identified.

person Dr. belisarius    schedule 13.12.2010