Как мога да използвам индексните структури в ELKI?

Това са цитати от http://elki.dbs.ifi.lmu.de/ :

„По същество ние свързваме абстрактната заявка за разстояние към база данни и след това получаваме търсене на най-близкия съсед за това разстояние. В този момент ELKI автоматично ще избере най-подходящия клас на заявка kNN. Ако съществува подходящ индекс за нашата функция за разстояние ( не всеки индекс може да ускори всяко разстояние!), той автоматично ще се използва тук."

„Методът getKNNForDBID може да се сведе до бавно линейно сканиране, но когато базата данни има подходящ индекс, ще се използва индексната заявка. Тогава алгоритъмът може да се изпълни за O(n k log n) или дори O(n k) време.“

Въпросът е: на каква база ELKI избират да изпълнят индексната заявка или не?

какво се разбира под: "когато базата данни има подходящ индекс" и как мога да гарантирам това?

друг неуместен въпрос относно подписа на метода "run", защо има 3 подписа вместо само 1? и какви са разликите между тях и какви са критериите за определяне кой подпис да се използва?


person Omar Yousry    schedule 12.10.2013    source източник


Отговори (2)


Има страница с инструкции за това в уикито на ELKI: http://elki.dbs.ifi.lmu.de/wiki/HowTo/Index

По същество трябва да добавите индекс с помощта на -db.index. След това ще се използва автоматично, ако индексът поддържа показателя за разстояние. R*-дървото изглежда най-мощното. Има също урок за добавяне на поддръжка за индексиране на R-дърво за персонализирани функции за разстояние: http://elki.dbs.ifi.lmu.de/wiki/Tutorial/SpatialDistanceFunctions

Що се отнася до втория въпрос: има run(Database) метод в AbstractAlgorithm, който използва интроспекция, за да провери за алтернативни сигнатури на метода. Това е бъркотия, но всъщност е удобно да можете да изберете един от подписите. Просто се уверете, че вашите getInputTypeRestriction() съвпадат. Има смисъл, когато работите с множество релации. Докато живеете в мисленето "всичко е (един) вектор", изглежда излишно; но дори и тогава е удобно да имате run(Database database, Relation<O> relation) подпис, който вече има отношение към данните за обработка.

person Has QUIT--Anony-Mousse    schedule 13.10.2013

Това е най-вече продължение на публикацията на @Anony-Mousse, която е доста точна.

Индексите трябва да се добавят към базата данни от потребителя. Понастоящем няма автоматично индексиране (тъй като всеки индекс ще изисква допълнителна памет и време за изграждане). -db.index е параметърът за това. Поддръжката за автоматично индексиране е в списъка с желания, но изисква внимателно настроени модели на разходите. При малък набор от данни или данни с големи размери, или когато потребителят изобщо не се нуждае от този тип заявки, добавянето на индекс ще има цена.

Базата данни ще препрати заявката към всеки индекс по ред. Печели първият индекс, който предлага ускорение. Ако нито един индекс не върне ускорена заявка, базата данни ще се върне към линейно сканиранеосвен ако не е дадено подсказката DatabaseQuery.HINT_OPTIMIZED_ONLY. В този случай ще бъде върнато null. Линейно сканиране може да бъде принудено чрез QueryUtil, което е най-вече полезно за индекси за тестване на единици.

M-Дърветата могат да работят с всяко числово разстояние, но ако разстоянието не е метрично, резултатите може да са неправилни. Трябва да се докладва грешка, ако функция за разстояние не отчете isMetric() като вярно.

R-Trees може да работи с всяка функция за разстояние, която прилага SpatialPrimitiveDistanceFunction, което по същество означава прилагане на долна граница на разстояние от точка до правоъгълник. Може да се намери долна граница за много функции за разстояние, но ефективността може да варира. Например, ъгловите разстояния ще се възползват много по-малко от правоъгълните страници, използвани от R-дървото.

Що се отнася до метода run. Предпочитаният подпис за обичайните методи за векторно пространство е

 YourResultType run(Database database, Relation<V> relation)

Към момента базата данни може действително да бъде получена чрез relation.getDatabase(), но това може да се промени в бъдеще. Има редица ситуации, в които това е проблематично, а някои ситуации, в които в момента не могат да бъдат лесно отстранени, за съжаление. Както и да е, това е изричната форма, която е удобна за стартиране на алгоритмите от Java код, т.е. позволява ми да посоча коя връзка да използвам, вместо да се налага да използвам база данни, където това е единственото подходящо релация (така че се избира автоматично).

Имам планове да направя това още по-ясно в дългосрочен план, добавяйки изрична поддръжка за избор на подмножество от данни за обработка, а може би и на заявките. След това абстрактният родителски метод run ще се погрижи за това. Един автоматичен оптимизатор ще разчита на това: той първо ще направи заявка за всички алгоритми, които да бъдат изпълнени за техните изисквания, включително изисквания за заявка. Въз основа на заявките, набора от данни, наличната памет и т.н. оптимизаторът може да избере подходящи индекси и да предаде на алгоритъма подходящите методи за заявка. За да запазите run подписа прост, той вероятно ще се обработва чрез някои Instance класове и вместо това ще се използва повече фабричният шаблон. Но не се тревожи за това сега.

Ако искате да разберете защо имаме нужда от това, погледнете напр. алгоритми за откриване на геопространствени отклонения. Подписът, използван от SLOM например, е:

OutlierResult run(Database database, Relation<N> spatial, Relation<O> relation)

т.е. SLOM използва две релации две. Първата релация е пространствената връзка на екземплярите, напр. географски позиции. Второто отношение са действителните данни, напр. измервания. Географските позиции се използват, за да се определи кои екземпляри се очаква да бъдат подобни (но те също могат да бъдат например многоъгълници!), докато втората релация уточнява данните, които всъщност след това се сравняват за сходство.

person Erich Schubert    schedule 14.10.2013