Znajdowanie zależności funkcjonalnych w danych znajduje zastosowanie w różnych obszarach analizy danych: zarządzaniu bazami danych, czyszczeniu danych, inżynierii wstecznej baz danych i eksploracji danych. O samych zależnościach już pisaliśmy
Wybór zadań
Studiując w centrum CS, zacząłem dogłębnie studiować bazy danych, a mianowicie szukać zależności funkcjonalnych i różnicowych. Temat ten był powiązany z tematem moich zajęć na uniwersytecie, dlatego pracując nad zajęciami zacząłem czytać artykuły na temat różnych zależności w bazach danych. Napisałem recenzję tego obszaru - jedną z moich pierwszych
Podczas drugiego semestru studiów w ośrodku rozpocząłem projekt badawczy mający na celu udoskonalenie algorytmów wyszukiwania zależności funkcjonalnych. Pracowała nad nim wspólnie ze studentką Uniwersytetu Państwowego w Petersburgu Nikitą Bobrową w JetBrains Research.
Złożoność obliczeniowa poszukiwania zależności funkcjonalnych
Głównym problemem jest złożoność obliczeniowa. Liczba możliwych minimalnych i nietrywialnych zależności jest ograniczona powyżej wartością Gdzie — liczba atrybutów tabeli. Czas działania algorytmów zależy nie tylko od liczby atrybutów, ale także od liczby wierszy. W latach 90. algorytmy wyszukiwania prawa federalnego na zwykłym komputerze stacjonarnym mogły przetwarzać zestawy danych zawierające do 20 atrybutów i dziesiątki tysięcy wierszy w ciągu nawet kilku godzin. Nowoczesne algorytmy działające na procesorach wielordzeniowych wykrywają zależności dla zbiorów danych składających się z setek atrybutów (aż do 200) i setek tysięcy wierszy mniej więcej w tym samym czasie. To jednak nie wystarczy: taki czas jest nie do przyjęcia dla większości rzeczywistych zastosowań. Dlatego opracowaliśmy podejścia mające na celu przyspieszenie istniejących algorytmów.
Schematy buforowania dla przecięć partycji
W pierwszej części pracy opracowaliśmy schematy buforowania dla klasy algorytmów wykorzystujących metodę przecięcia partycji. Partycja dla atrybutu to zbiór list, gdzie każda lista zawiera numery wierszy z tymi samymi wartościami dla danego atrybutu. Każda taka lista nazywana jest klastrem. Wiele nowoczesnych algorytmów wykorzystuje partycje do określenia, czy zależność jest utrzymywana, czy nie, a mianowicie stosują się do lematu: Zależność odbyło się, jeśli , tutaj wyznacza się partycję i stosuje się koncepcję rozmiaru partycji - liczby znajdujących się w niej klastrów. Algorytmy wykorzystujące partycje, w przypadku naruszenia zależności, dodają dodatkowe atrybuty po lewej stronie zależności, a następnie przeliczają je, wykonując operację przecięcia partycji. Operację tę nazywa się specjalizacją w artykułach. Zauważyliśmy jednak, że partycje dla zależności, które zostaną zachowane dopiero po kilku rundach specjalizacji, można aktywnie ponownie wykorzystać, co może znacznie skrócić czas działania algorytmów, ponieważ operacja przecięcia jest kosztowna.
Dlatego zaproponowaliśmy heurystykę opartą na Entropii Shannona i Niepewności Ginny, a także naszą metrykę, którą nazwaliśmy Odwróconą Entropią. Jest to niewielka modyfikacja Shannon Entropy i zwiększa się wraz ze wzrostem niepowtarzalności zbioru danych. Proponowana heurystyka jest następująca:
Tutaj — stopień niepowtarzalności ostatnio obliczonego podziału I jest medianą stopni niepowtarzalności poszczególnych atrybutów. Wszystkie trzy metryki opisane powyżej zostały przetestowane jako metryki niepowtarzalności. Można również zauważyć, że w heurystyce występują dwa modyfikatory. Pierwsza wskazuje, jak blisko klucza podstawowego znajduje się bieżąca partycja i pozwala w większym stopniu buforować te partycje, które są daleko od potencjalnego klucza. Drugi modyfikator pozwala monitorować zajętość pamięci podręcznej i tym samym zachęca do dodawania kolejnych partycji do pamięci podręcznej, jeśli jest dostępna wolna przestrzeń. Pomyślne rozwiązanie tego problemu pozwoliło przyspieszyć algorytm PYRO o 10-40%, w zależności od zbioru danych. Warto dodać, że algorytm PYRO odnosi największe sukcesy w tym obszarze.
Na poniższym rysunku możesz zobaczyć wyniki zastosowania proponowanej heurystyki w porównaniu z podstawowym podejściem do buforowania monetą. Oś X jest logarytmiczna.
Alternatywny sposób przechowywania partycji
Następnie zaproponowaliśmy alternatywny sposób przechowywania partycji. Partycje to zbiór klastrów, z których każdy przechowuje liczbę krotek o identycznych wartościach dla niektórych atrybutów. Te klastry mogą zawierać długie sekwencje liczb krotek, na przykład jeśli dane w tabeli są uporządkowane. Dlatego zaproponowaliśmy schemat kompresji do przechowywania partycji, a mianowicie interwałowe przechowywanie wartości w klastrach partycji:
$$display$$pi(X) = {{underbrace{1, 2, 3, 4, 5}_{Pierwszy interwał}, underbrace{7, 8}_{Drugi interwał}, 10}}\ downarrow{ Kompresja} \ pi(X) = {{podkreślenie{$, 1, 5}_{pierwszy~interwał}, podkreślenie{7, 8}_{drugi~interwał}, 10}}$$display$$
Dzięki tej metodzie udało się zmniejszyć zużycie pamięci podczas działania algorytmu TANE od 1 do 25%. Algorytm TANE jest klasycznym algorytmem wyszukiwania przepisów federalnych, w swojej pracy wykorzystuje partycje. W ramach praktyki wybrano algorytm TANE, gdyż znacznie łatwiej było w nim zaimplementować przechowywanie interwałowe niż np. w PYRO, aby ocenić, czy zaproponowane podejście działa. Uzyskane wyniki przedstawiono na poniższym rysunku. Oś X jest logarytmiczna.
Konferencja ADBIS-2019
Na podstawie wyników badania we wrześniu 2019 roku opublikowałem artykuł
Źródło: www.habr.com