Szymon Grabowski

 

Propozycje tematów prac dyplomowych
magisterskich
na rok akademicki 2023 / 2024

 

1.        (NOWOŚĆ!) Aspekty implementacyjne lasów losowych

(Implementation aspects of random forests)

 

Las losowy (ang. random forest) jest kolekcją drzew decyzyjnych, działających z różnymi (losowymi) podzbiorami zbioru uczącego i/lub różnymi podzbiorami jego cech. (Istnieje wiele wariantów RF, p. np. (Lior Rokach, Decision forest: Twenty years of research, 2016, https://www.sciencedirect.com/science/article/pii/S1566253515000561)).

 

W ramach pracy należy zaimplementować (niskopoziomowo) las losowy, z naciskiem na wydajność (i ewent. oszczędność pamięci), zwłaszcza na etapie budowy. Eksperymenty na zbiorach różnej wielkości używanych w literaturze (https://www.kaggle.com/datasets?tags=13302-Classification).

Możliwe idee:

·      wybrane ID obiektów dla każdego węzła każdego drzewa pamiętamy na górnych poziomach drzewa (gdzie obiektów jest zwykle dużo) jako ustawione bity w wektorze bitowym, a nie liczby typu int; na dolnych poziomach drzewa, gdy w węzłach jest już niewiele obiektów, stosujemy (bardziej tradycyjnie) listy intów,

·      (dla danych numerycznych) sortujemy obiekty po każdej cesze, a następnie jako punkty podziału rozpatrujemy tylko średnie par kolejnych punktów, których klasy się różnią (idea wspomniana np. w rozdz. 18.3.6 monografii (Stuart Russell i Peter Norvig, Artificial Intelligence. A Modern Approach. Third Edition, 2010)),

·      powtórne wykorzystanie roboczych rejonów pamięci,

·      ...lub wczesne zwalnianie niewykorzystywanych później tablic, dla oszczędności pamięci,

·      oszczędna reprezentacja klasy danego obiektu (np. jeśli klas jest £ 4, to można ID każdej klasy zapisywać na 2 bitach) i szybkie (bitowo-równoległe) zliczanie rozkładu przynależności obiektów do klas,

·      praca wielowątkowa.

 

2.        (NOWOŚĆ!) Wydajny algorytm dla planszowej gry logicznej „Blokus” wykorzystujący logikę bitową
(An efficient algorithm for playing the logic board gameBlokusbased on bit logic)

 

Blokus (https://en.wikipedia.org/wiki/Blokus) to gra inspirowana łamigłówką pentomino, dla 2, 3 lub 4 graczy, polegająca na dostawianiu na planszy klocków swojego koloru w celu blokowania ruchów przeciwnikom. Celem pracy jest zaprojektowanie i zaimplementowanie algorytmu, w którym przeszukiwanie planszy będzie wykorzystywało operacje bitowe (typu OR, AND) dla słów maszynowych, co umożliwi szybkie znajdowanie dozwolonych w danej pozycji ruchów.

 

Pożądana (ale niekonieczna) funkcjonalność to również implementacja i testy platformy dla programów (botów) grających w Blokus.

 

3.        Ocena jakości danych dla uczenia maszynowego
(Data quality assessment for machine learning)

 

Rzeczywiste zbiory danych (np. z platformy Kaggle) stosunkowo często zawierają błędy lub niekonsekwencje, wynikające np. z niechlujnego gromadzenia danych. Przykładowo, liczby (w wybranych lub wszystkich kolumnach danych tabularycznych) mogą być zapisywane jako stringi, wyniki pomiarów tej samej wartości fizycznej mogą używać różnych jednostek, zaś brakujące wartości mogą być kodowane przy użyciu arbitralnej (i ryzykownej) konwencji, np. -99999. Niektóre „zjawiska” w danych niekoniecznie oznaczają błąd, lecz należy je wykryć do dalszej analizy, np. powtarzające się (jak często?) wartości całych wierszy/rekordów. Jednym z (niedoskonałych) sposobów wykrywania problematycznych danych (i ich oczyszczania) jest użycie schematu (ang. schema), ale nie zawsze jest on dostępny, a ręczna jego budowa może być pracochłonna.

 

Celem pracy jest

·     zaproponowanie i przetestowanie reguł ad-hoc służących do analizy danych (np. detekcji outlierów, niekonsekwentnego użycia formatu daty i czasu, proporcji liczby wystąpień elementu najczęstszego, tj. mody, do liczby wszystkich obiektów),

·     próba automatycznej budowy reguł,

·      implementacja wybranych technik oszczędnego pamięciowo wyznaczania kwantyli (np. mediany) próbek, m.in. dla modelu strumieniowego.

 

Istnieje już dość bogata literatura przedmiotu, m.in.

https://sites.cs.ucsb.edu/suri/psdir/ency.pdf

https://www.vldb.org/vol11/p1781-schelter.pdf

http://learningsys.org/nips17/assets/papers/paper_19.pdf

https://arxiv.org/abs/2203.10384

 

Oraz narzędzia typu „data linter”:

https://github.com/brain-research/data-linter

https://github.com/moj-analytical-services/data_linter

 

Słowa kluczowe: data cleaning, data cleansing, data smells, data linter

 

4.        Znajdowanie największych klik w grafach

(Finding maximum cliques in graphs)

 

Klika w grafie to podgraf pełny, tj. taki że w jego obrębie istnieją krawędzie od każdego do każdego wierzchołka. Celem pracy jest zaimplementowanie i porównanie eksperymentalne kilku algorytmów znajdowania największych klik w grafach. Grafy wejściowe mogą pochodzić z benchmarku DIMACS:

http://iridia.ulb.ac.be/~fmascia/maximum_clique/DIMACS-benchmark

 

Przykładowa literatura:

http://users.uj.edu.pl/~ufkapano/download/Dariusz_Zdybski_2016.pdf  (praca mgr z UJ)

https://www.sciencedirect.com/science/article/abs/pii/016763779090057C

https://www.sciencedirect.com/science/article/pii/S0167637797000540

 

5.        Projekt i implementacja algorytmu kompresji wykorzystującego ideę narzędzia copMEM
(Design and implementation of a compression algorithm based on the copMEM tool idea)

 

Literatura:

https://arxiv.org/abs/1805.08816

lub (prawie to samo):

https://academic.oup.com/bioinformatics/advance-article-abstract/doi/10.1093/bioinformatics/bty670/5061159

Kody źródłowe:
https://github.com/wbieniec/copmem

 

Chodzi o projekt i implementację b. szybkiego kompresora z rodziny LZ77, który jednak znajduje tylko długie „matche” (przykładowe zastosowanie: deduplikacja).

 

Uwaga: taki sam temat podałem jako pracę inż.  W ramach pracy magisterskiej należałoby zrobić więcej (różne tryby kompresji: kompromisy między szybkością a stopniem kompresji; obszerniejszy stan wiedzy; może więcej eksperymentów, np. na różnych maszynach).

 

 

Przetwarzanie obrazu / wideo

 

6.        Stratna kompresja grafik komiksowych

(Lossy compression of comic strips)

 

Obrazki komiksów są typowo kompresowane algorytmem JPEG, znanym ze swych artefaktów pierścieniowych (i zdecydowanie bardziej przydatnym do fotografii niż grafik). Algorytm PNG (bezstratny) oferuje stosunkowo słabą kompresję. Zapewne lepszy jest stosunkowo nowy algorytm FLIF (https://flif.info/index.html), ale też jest bezstratny. 

 

Celem pracy jest zbadanie możliwości dedykowanego algorytmu kompresji stratnej dla obrazów „komiksowych”. Etap wstępny mógłby redukować liczbę kolorów i wykrywać jednokolorowe obszary (które na wejściu mogą być tylko w przybliżeniu jednokolorowe). Obraz segmentujemy, wykrywając krawędzie (kontury) i zapisując je oszczędnie za pomocą np. kodu łańcuchowego. Jednolite wypełnienie nie sprawia problemu, ale może być też przejście tonalne. W przypadku „trudnego” wypełnienia, np. tektury, można odwołać się do bardziej konwencjonalnej techniki kompresji. Specyfiką komiksów są też dialogi, zwykle w dymkach (może się przydać OCR).

 

Przykładowe komiksy można obejrzeć pod:

https://www.gocomics.com/

https://swiatkomiksu.pl/katalog/wyszukiwanie/galeria,1,326.html

 

7.        Wykrywanie i dekodowanie kodów paskowych na obrazach

      (Barcode detection and decoding in images)

 

8.        Śledzenie i adnotowanie sylwetek ludzkich w sekwencjach wideo
(Tracking and annotating humans in video sequences)

 

 

Inżynieria oprogramowania

 

9.        Zastosowanie algorytmu sortowania pozycyjnego dla generycznego sortowania obiektów w języku Java

(Using the radix sort algorithm for a generic object sort in Java)

 

Celem pracy jest zbadanie możliwości zastosowania sortowania pozycyjnego (ang. radix sort), zamiast bardziej tradycyjnego sortowania opartego na porównaniach (tj. zazwyczaj: sortowania przez scalanie, sortowania szybkiego, lub nieraz hybrydy powyższych), w generycznym sortowaniu obiektów, czego przykładem w bibliotece standardowej Javy są Arrays.sort(Object[] a) i Collections.sort(List<T> list).

 

Jeśli np. typ elementów tablicy przekazanej do Arrays.sort to Student, który implementuje Comparable i funkcja compareTo wygląda następująco:

int compareTo(Student other)

{

  return Long.compareTo(other.id()); 
  // lub nawet: ...(other.getId());

}

to można wydedukować, że sortujemy Studentów po 8-bajtowym polu id (ze znakiem) i można do tego wykorzystać alg. radix sort (przyjmijmy dokładniej: LSD radix sort), który będzie prawdopodobnie szybszy niż merge sort (używany do sortowania obiektów w Arrays.sort) – zakładając, że sortujemy przynajmniej tysiące Studentów...

Niemniej, problem komplikuje się, jeśli kryterium sortowania jest bardziej złożone (np.: po jednym polu, a jeśli równość, to wtedy decyduje drugie pole itd.).

Algorytm LSD radix sort nie nadaje się, w ogólnym przypadku, do sortowania napisów (chyba że są równej i niedużej długości), dlatego skupiamy się na typach liczbowych (głównie int/Integer, long/Long, double/Double, float/Float). Radix sort najlepiej nadaje się do sortowania liczb całkowitych bez znaku, zatem trzeba zmodyfikować oryginalną procedurę pod kątem obsługi (osobno) typów całkowitych ze znakiem oraz typów zmiennoprzecinkowych.

 

Jak podejść do problemu?  Konieczna analiza kodu funkcji compareTo (jeśli dana klasa implementuje Comparable) lub funkcji compare (jeśli do funkcji Arrays.sort lub Collections.sort jest przekazany komparator). Reflekcja w Javie nie wystarczy – trzeba wygenerować drzewo składniowe (AST, abstract syntax tree). Zalecane narzędzie: https://javaparser.org

 

Minimalne rozwiązanie problemu to obsługa przypadków jak powyżej (np. Long.compareTo(...)). Im bardziej złożony kod w compare(To) będzie zrozumiały i obsłużony via radix sort, tym lepiej. Ale gdy algorytm analizy sobie nie poradzi, wtedy ma wywoływać standardowy Arrays.sort/Collections.sort.

 

Pożądana część pracy: eksperymenty wydajnościowe (różne typy danych, tablice/listy różnej wielkości; przy małych kolekcjach zapewne nie opłaca się przechodzić na radix sort, stąd należy znaleźć odpowiedni próg, etc.).

 

Powstałym produktem byłyby (uproszczone) klasy o nazwie np. MyArrays, MyCollections, zawierające opisaną metodę sort (lub: rsort).

 

 

 

Algorytmy tekstowe i bioinformatyka:

 

10.    Oznaczanie typów wypowiedzi w systemie dialogowym
(Tagging dialog acts in a dialog system)

 

Systemy dialogowe (=wirtualni asystenci, chatboty) działają zwykle wg pewnego schematu. Przypisują wypowiedzi użytkownika do jednej z predefiniowanych klas (typu: powitanie, pytanie, oświadczenie, zaprzeczenie, etc.) i również posługują się podobną klasyfikacją/oznaczaniem przy swoich wypowiedziach (np. potwierdzenie zrozumienia poprzedniej wypowiedzi, prośba o ujednoznacznienie).

 

Przykład dialogu z oznaczaniem typów wypowiedzi:

 

Źródło: https://web.stanford.edu/~jurafsky/slp3/ed3book.pdf

 

Celem pracy jest opracowanie i zaimpl. algorytmu oznaczania typów wypowiedzi. Oczywiście problem jest trudny, dlatego wydaje się konieczne odpowiednie zawężenie dziedziny tematycznej rozmowy. Język rozmowy angielski lub (ambitniejsze) polski.

 

Lektura podstawowa: podany wyżej URL (draft trzeciego wydania monografii „Speech and Language Processing”, 2017), rozdział 29.

 

11.    Implementacja efektywnego i bezpiecznego wątkowo dynamicznego łańcucha tekstowego

(Efficient and thread-safe dynamic string implementation)

 

Projekt jest rozszerzeniem podobnego tematu zaproponowanego na pracę inżynierską (http://szgrabowski.kis.p.lodz.pl/dyplomy/dyplomy2016inz.htm, nr 1).

W skrócie:

Celem projektu jest zaimplementowanie struktury danych „rope” (https://en.wikipedia.org/wiki/Rope_(data_structure)), rozważeniu różnych jej szczegółów implementacyjnych i testy wydajnościowe przy podstawowych scenariuszach użycia (typowych sekwencjach operacji).

Ponadto, zaprojektowana struktura danych ma się nadawać do pracy grupowej (np. współbieżna edycja artykułu przez kilku autorów), tj. należy zadbać o bezpieczeństwo wątkowe (ang. thread safety) oraz efektywność przy takim reżimie pracy.

 

12.    Wydajne i oszczędne pamięciowo struktury listowe w Javie
(Effective and compact list data structures in Java)

 

13.    Budowa otagowanego korpusu języka angielskiego

(Construction of a tagged corpus for the English language)

 

14.    System zarządzania streszczeniami publikacji naukowych

(A management system for scientific abstracts)

 

15.    Kompresja danych bioinformatycznych w języku Julia

(Bioinformatics data compression in Julia programming language)

Julia (http://julialang.org) jest względnie nowym interesującym językiem programowania do obliczeń naukowych i inżynierskich. Siłą tego języka jest połączenie prostej składni (przypominającej trochę Pythona) z wydajnością bliską językom C i C++. Celem pracy jest zaimplementowanie i przetestowanie przynajmniej dwóch algorytmów kompresji danych bioinformatycznych (kolekcji genomów w formacie FASTA i/lub kolekcji odczytów w formacie FASTQ i/lub kolekcji genomów w uproszczonym formacie VCF z szybkim dostępem i/lub wyników mapowania odczytów na genom referencyjny w formacie SAM).

 

16.    Zastosowanie paradygmatu obliczeniowego MapReduce dla wybranych problemów bioinformatycznych
(Application of the MapReduce computing paradigm for selected bioinformatics problems)

      – opiekun pomocniczy: dr inż. T. Kowalski

 

17.    Aplikacja pomocna w korekcie dokumentów tekstowych

      (A textual document correction assisting application)

 

Moduł kontroli pisowni (spellchecker) we współczesnych edytorach tekstu jest wprawdzie przydatnym, ale często niedoskonałym narzędziem: korekta błędów jest dość powolna (z uwagi na ich przeglądanie sekwencyjne); brak wygodnych mechanizmów do pomijania niektórych słów (np. pisanych wielką literą w środku zdania – nazwy własne); brak wykorzystania np. Google API do sprawdzenia poprawności słów.

 

18.    Kompresja wyników uliniawiania sekwencji DNA zapisanych w formacie SAM

      (Compression of DNA sequence alignment data in SAM format)
TEMAT ZAREZERWOWANY

 

19.    Oszczędne struktury słownikowe dla napisów
(Succinct string dictionaries)

 

          Literatura:

http://www.dcc.uchile.cl/~gnavarro/ps/sea11.1.pdf

http://journals.bg.agh.edu.pl/AUTOMATYKA/2011-03/Auto_2011_3_23.pdf

http://arxiv.org/abs/1305.0674

 

20.    Biblioteka kolekcji słownikowych z wyszukiwaniem probabilistycznym i przybliżonym
(Dictionary structures library with probabilistic and approximate search)

        – opiekun pomocniczy: dr inż. T. Kowalski

 

21.    Rozmyte wyrażenia regularne
(Fuzzy regular expressions)

      TEMAT ZAREZERWOWANY

 

       Literatura:

       http://en.wikipedia.org/wiki/TRE_%28computing%29

       http://frej.sourceforge.net/rules.html

       http://frej.sourceforge.net/javadocs/overview-summary.html
       ewent.:

       http://www.dcc.uchile.cl/~gnavarro/ps/spe01.pdf (NR-grep)

 

Temat obejmuje opracowanie składni, implementacji i przeprowadzenie testów rozmytych wyrażeń regularnych, będących rozszerzeniem konwencjonalnych wyrażeń regularnych.  Nowość polega na dodaniu pasowania przybliżonego (np. w sensie Levenshteina) na poziomie całego wzorca lub jego części (grup), dodanie wag związanych z pozycją (np. prefiks wzorca jest „ważniejszy” niż jego sufiks) oraz (alternatywnie) dopuszczenie innej kolejności elementów (grup) wyrażenia w pasowanym tekście.  Każde pasowanie zwraca stopień podobieństwa (od 0 do 1), użytkownik wywołuje narzędzie z odpowiednim progiem, np. „zwróć trafienia z podobieństwem >= 0.8”.

 

22.    Kompresja tekstowego XML z możliwością obsługi zapytań

 

23.    Usuwanie redundancji z dużych kolekcji plików

 

24.    Szukanie wzorców w tekście skompresowanym

 

25.    Rozszerzanie funkcjonalności tablicy sufiksowej

 

26.    Dynamiczne indeksowanie tekstu przy użyciu odmian tablicy sufiksowej

 

27.    Efektywność słownikowych struktur danych w przetwarzaniu tekstu

 

 

Information retrieval i data mining:

 

28.    Tworzenie materiałów wspomagających naukę języka obcego z wykorzystaniem dwóch wersji językowych Wikipedii

(Preparing language learning materials from bilingual Wikipedia articles)

 

29.    Efektywna kompresja dużych grafów z użyciem drzew k2
(Efficient compression of large graphs with k2-trees)

      

       Literatura:

       http://www.dcc.uchile.cl/~gnavarro/ps/spire09.1.pdf

 

30.    Implementacja i zastosowania R-drzewa
(Implementation and applications of the R-tree)

        – opiekun pomocniczy: dr inż. T. Kowalski

 

       Literatura (na początek):

       http://www.cse.cuhk.edu.hk/~taoyf/course/wst501/notes/lec13.pdf

 

 

 

Rozpoznawanie obrazów:

 

30. Klasyfikacja minimalnoodległościowa w zadaniach opisanych cechami symbolicznymi

 

31. Klasyfikacja minimalnoodległościowa przy niekompletnych danych uczących (missing data)

 

 

Gry logiczne:

 

32. Wykorzystanie programowania z ograniczeniami do realizacji platformy planszowych gier logicznych
(Using constraint programming for developing a logic board games platform)

 

33. Generacja bazy końcówek dla wybranych gier logicznych
(Endgame tablebase generation for selected logic games)


(Chodzi o np. szachy, warcaby, go-moku na zmniejszonej planszy, reversi? Idea generacji takiej bazy jest opisana np. w http://www.mimuw.edu.pl/~pan/gry.pdf , sekcja 2.)

 

 

Kryptografia i okolice

 

34. Steganografia w algorytmach kompresji danych
(Steganography exploiting properties of data compression algorithms)

 

Inne

 

35. Porównanie wydajności równoległych algorytmów sortowania
(Performance comparison of parallel sorting algorithms)
TEMAT ZAREZERWOWANY

     

36. Zależności pamięciowo-czasowe w skompresowanych filtrach Blooma
(Space-time tradeoffs in compressed Bloom filters)

 

Literatura:

http://www.eecs.harvard.edu/~michaelm/NEWWORK/postscripts/cbf2.pdf
(Mitzenmacher, 2002)

http://www.cs.amherst.edu/~ccm/cs34/papers/cacheefficientbloomfilters-jea.pdf (Putze et al., 2009)

http://szgrabowski.kis.p.lodz.pl/Gliwice/Bloom%20Filters%20-%20SzGrabowski.ppt

 

Filtr Blooma (BF) to oszczędna probabilistyczna struktura słownikowa – pozwala na sprawdzenie, czy dany element został wstawiony do słownika, ale możliwe są „fałszywe pozytywy” (odpowiedź twierdząca, podczas gdy element nie został wstawiony).

          Idea BF znana jest od roku 1970, ale dopiero w ostatnich latach stają się one popularne na szerszą skalę, z zastosowaniami m.in. w sieciach komputerowych i bazach danych. Przykładem popularności jest też implementacja BF w bibliotece javowej Google Guava.

          Mitzenmacher (2002) zaproponował skompresowany filtr Blooma (do transmisji przez sieć), a wersja obsługująca także zapytania bezpośrednio w postaci skompresowanej została przedstawiona w (Putze et al., 2009).

          Celem pracy jest zbadanie innych rozwiązań kompresji i otrzymania pewnych zależności między zużyciem pamięci a czasem dostępu.

 

37. Indeksowanie audiobooków na podstawie sygnału mowy

      (Speech indexing for audiobook data)

        – opiekun pomocniczy: prof. dr hab. inż. K. Ślot

 

W audiobookach przydałaby się inteligentna nawigacja: cofnięcie się do początku poprzedniego zdania (akapitu?), analogicznie do przodu. Zastosowanie takie, że gdy słuchacz się zdekoncentruje, to chciałby sobie cofnąć, ale nie naiwnie np. o 10s, tylko do początku jakiejś jednostki tekstu. (Również manipulacje suwakiem nie są wygodne, a całkiem odpadają, jeśli książki słucha kierowca.) Nasuwa się idea segmentacji z wykorzystaniem długości pauzy.

Druga możliwość nawigacji: do początku np. poprzedniego rozdziału. Czyli: dłuższa pauza przed + coś brzmiącego podobnie jak słowo „rozdział”. Oczywiście do początków rozdziałów powinny być zakładki, ale audiobooki mogą być też dostarczane jako zwykły mp3 (ewent. kilka takich plików, ale i tak granulacja większa niż 1 rozdział).

 

Drugi pokrewny pomysł, który mogłaby obejmować praca magisterska, to znajdowanie korespondencji między odtwarzanym audiobookiem a tekstem tej samej książki (szczegóły dla zainteresowanych...).

 

38.    Moduł deklaratywnej grafiki wektorowej dla Pythona

        (A declarative vector graphics Python module)

        – opiekun pomocniczy: dr inż. W. Bieniecki

 

Proszę zapoznać się z bibliotekami (dla innych języków):

Diagrams (Haskell):

http://projects.haskell.org/diagrams/doc/quickstart.html#getting-started

Compose (Julia):

https://github.com/dcjones/Compose.jl

http://giovineitalia.github.io/Compose.jl/latest/