Treść się tworzy #staytuned
Materiały do zajęć - inżynieria biomedyczna WEAIiIB AGH - wiosna 2024
Coś tu będzie, spokojnie, uczcie się Pythona :)UWAGA! Nie ma zajęć 27.02. (grupy poranne wtorkowe) - zaczynamy dopiero 5 marca! [Nie dotyczy to grup z dr Hemmerling]
Youtube: #LIVE z przedstawieniem pracy w środowisku Jupyter (nagranie z 23.05.)
Materiały do zajęć - modelowanie w data mining WH AGH - jesień 2023
-
Ramowy terminarz:
- 6.10., 13.10. - zajęcia wstępne, przypomnienie programowania w Python, analiza danych w Python
- 20.10., 27.10., (brak zajęć 3.11.!), 10.11., 17.11., 24.11., 1.12., 8.12., 15.12. - przedstawienie projektów teoretycznych + ćwiczenia praktyczne z zagadnień data mining
- 22.12. - konsultacje projektów praktycznych (osobiście lub Teams lub mailowo)
- 5.01., 12.01., 19.01., 26.01. - prezentacje projektów praktycznych
-
Tematy projektów teoretycznych i tabelka do zapisywania się - dostępne od 15.10. w plikach Teams
-
Tabelka do zapisywania się na projekty praktyczne i proponowania tematów - dostępne od 3.12. w plikach Teams, proszę o propozycje tematów do 22.12.
- ANKIETA
-
>> Zadanie na zajęcia nr 10 - Model SSN do klasyfikacji obrazów z wykorzystaniem CIFAR-10
Zbiór CIFAR-10 jest zbiorem 60 tys. kolorowych obrazów w rozmiarze 32x32, podzielonych na 10 klas, które mogą zostać użyte do machine learningu.
Klasy danych to: Samolot (Airplane), Samochód (Automobile), Ptak (Bird), Kot (Cat), Jeleń (Deer), Pies (Dog), Żaba (Frog), Koń (Horse), Statek (Ship), Ciężarówka (Truck).
Skorzystamy z bibliotek Tensorflow i Keras (pip install tensorflow) do wczytania danych, zdefiniowania modelu sztucznej sieci neuronowej, wytrenowania modelu na części danych z CIFAR-10, a następnie wykorzystamy nasz model do predykcji i klasyfikacji wybranego przez nas zdjęcia z obiektem z listy. Nasze zdjęcie wczytamy z wykorzystaniem biblioteki OpenCV (pip install opencv-python) - możesz wyszukać dowolny obrazek w sieci albo skorzystać z danych z obrazki.zip
UWAGA: Instalacja Tensorflow jest czasochłonna i zajmuje sporo miejsca na dysku. Pierwsze pobranie i załadowanie danych CIFAR-10 bywa bardzo czasochłonne (nawet ok. 40 minut), ze względu na powolny serwer źródła.
Źródło ćwiczenia i modelu SSN: Youtube
Notebook Jupyter z kodami: zajecia10.ipynb
-
>> Zadanie BONUS na zajęcia nr 10 - rekolorowanie Smerfów na obrazie, ale bez SSN
Wbrew wcześniejszemu pomysłowi, ciężko zademonstrować działanie sztucznych sieci neuronowych na przykładzie wykrywania niebieskich Smerfów na obrazie, przede wszystkim na brak danych - musielibyśmy posiadać dane do wytrenowania modelu, czyli duży zbiór obrazów z zaznaczonymi obiektami, zawierający etykiety (tworzony często ręcznie...), także charakteryzowanie ze względu tylko na jedną cechę - kolor, może nie demonstrować poprawnie zalet SSN
Możemy jednak zamierzoną "detekcję" niebieskiego koloru wykonać w bardzo prosty sposób, odczytując wartości pikseli na obrazie, porównując je z "wzorcem" (czyli odczytanym ręcznie pikselem z obrazka) z dobraną eksperymentalnie tolerancją. Tego typu operacje na obrazach mogą w prosty sposób pomóc w uczeniu się programowania i algorytmiki (tutaj: pętli zagnieżdżonej i tablicy 3D - obrazu kolorowego) ze względu na widoczne rezultaty. Bardzo podobnie skonstruowane są np. algorytmy do zamiany na skalę szarości, obraz binarny czy sepię.
Obraz smerfy.jpg odczytamy i przetworzymy z wykorzystaniem biblioteki Pillow (pip install pillow), możemy do tego dość analogicznie wykorzystać też bibliotekę OpenCV.
Notebook Jupyter z kodem: zajecia10_bonus.ipynb
-
>> Zadanie na zajęcia nr 9 - profilowanie użytkowników social media z użyciem HMM i algorytmu Viterbiego
Posiadamy proste dane o zachowaniach użytkowników social media (scrolluje, reaguje, komentuje).
Tworzymy model HMM, który profiluje użytkowników jako "aktywnych" i "nieaktywnych" - celem może być zachęta do dalszej aktywności dla osób aktywnych ("polubiłeś post FAME MMA, więc polub też profile walczących") lub próba zachęcenia dla nieaktywnych ("nie interesujesz się polityką i MMA, więc zobacz profile Magdy Gessler, Książula i małe pieski") lub też analiza, który czynnik wpływa na profilowanie ("więcej reaguj / więcej komentuj to dostaniesz więcej treści, które chcesz zobaczyć"
Narysuj wykres grafu HMM, zastosuj algorytm Viterbiego, aby przyporządkować użytkowników do tych profili, co może pozwolić określić ewentualne dalsze działania.
Należy otrzymać postać tabeli prawdopodobieństw oraz określić najbardziej prawdopodobną ścieżkę.
Zadanie jest swobodną interpretacją przykładu z Wikipedii: Viterbi algorithm
Notebook Jupyter z kodami: zajecia9.ipynb
-
>> Zadanie na zajęcia nr 8 - metoda mikstur Gaussa GMM a głos Kizo
Metoda mikstur Gaussa ma wiele zastosowań w klasyfikacji, a jednym z nich jest rozpoznawanie mowy/głosu/dźwięków.
Przetestujmy metodę GMM na bardzo prostej bazie danych znanych głosów i sprawdźmy jej efekty, dzięki temu nauczymy się przetwarzać oraz wizualizować dane dźwiękowe.
Dane treningowe to kilkusekundowe fragmenty głosów: Sanah, Kizo i Szymona Hołowni. Z plików dźwiękowych robimy ekstrakcję cech i przedstawiamy jako współczynniki MFCC.
Następnie tworzymy model korzystając z metody mikstur Gaussa, a potem porównujemy z danymi treningowymi: test (Kizo z innej piosenki), test2 (Peja) oraz pierwotne dane głosu Kizo, dla porównania w jakim stopniu zastosowanie modelu wpłynie na zaburzenie wyników. W tym celu będziemy stawiać hipotezy, podając "pożądaną" postać etykiet danych i sprawdzając, w jakim stopniu odpowiada ona danym wejściowym.
Biblioteki do zainstalowania: pydub, librosa (pip install pydub librosa)
Pliki do pobrania: glosy.zip (plik .zip z plikami .mp3), ffmpeg-6.1.zip (plik .zip z kodekiem ffmpeg potrzebnym do ekstrakcji cech)
Notebook Jupyter z kodami: zajecia8.ipynb
Pytania do dalszej analizy:
- - co moglibyśmy zrobić, żeby ulepszyć model?
- - jakie wady danych treningowych mogą wpływać niekorzystnie na wyniki predykcji?
- - w jaki sposób, mając model i dane testowe, możemy odpowiedzieć na pytanie "do którego głosu najbardziej podobna jest próbka X"?
-
>> Zadanie na zajęcia nr 7 - zamówienia ze sklepu internetowego jako szereg czasowy
Pobierz plik z rocznymi danymi zamówień ze sklepu internetowego z okresu 11-2022 do 10-2023 zamowienia.csv
Wyświetl wykres szeregu czasowego, odczytując odpowiednią kolumnę jako daty i godziny.
Spróbuj przeskalować dane: suma kwot zamówień z każdego dnia, suma kwot zamówień w tygodniu, suma kwot zamówień w miesiącu, liczba zamówień w każdym dniu itd. - która ze skali wydaje się najlepsza do analizy trendów?
Następnie rozbij szereg na komponenty: trend, sezonowość, resztki, dobierając odpowiedni okres czasowy. Co możesz powiedzieć o takich danych?
Wyznacz funkcję autokorelacji ACF i autokorelację częściową PACF. Na ich podstawie, który model najlepiej nadaje się do zastosowania w predykcji - AR, MA, ARIMA?
Notebook Jupyter z kodami: zajecia7.ipynb
-
>> Zadanie na zajęcia nr 6 - naiwny klasyfikator Bayesa: prosty filtr antyspamowy w SMS-ach
Dawno, dawno temu, kiedy sieć LTE była jeszcze w niedostępna, a sieć 3G nie pozwalała na sprawną obsługę Internetu w telefonach, obecni dorośli używali do komunikacji głównie SMSów. Jeden kosztował ok. 20 groszy. Oczywiście jest to totalnie nieistotne dla naszego zadania.
Korzystając z bazy smsów dostępnej w pliku sms_spam.csv (uwaga na kodowanie znaków!), w której treści smsów są wstępnie zaklasyfikowane jako "spam" lub "ham" (czyli nie-spam), podziel dane na zbiór trenujący i testowy w proporcjach 90/10, zastosuj naiwny klasyfikator Bayesa do oznaczania treści jako spam i sprawdź jego skuteczność na danych testowych.
Zaprezentuj dane na wykresach przedstawiających % danych spam/ham: dane rzeczywiste ze zbioru testowego oraz dane z klasyfikatora. Wyświetl treści smsów, które zostały zaklasyfikowane: fałszywie pozytywne (czyli zwykłe wiadomości, zaklasyfikowane jako spam) oraz fałszywie negatywne (czyli wiadomości ze spamem, które dotrą do użytkownika jako poprawne). Czy obserwujesz jakieś zależności w treściach, które mogą wpłynąć na takie zaklasyfikowanie?
Notebook Jupyter z kodami: zajecia6.ipynb
Zadanie dodatkowe - ręczne obliczenie prawdopodobieństwa Bayesa dla zdarzeń (możesz skorzystać z ChatGPT, żeby zobaczyć obliczenia i kod - ale uważaj na błędy!)
Załóżmy, że słowo "xxx" oznacza spam na 90%, a słowo "bitcoin" spam na 80%. Załóżmy, że są to sprawy od siebie niezależne. Do obliczeń załóż dodatkowo, że pozostałe słowa nie mają wpływu na spam/ham (P_word_spam = P_word_ham = 1), a prawdopodobieństwa a priori P_spam_prior = P_ham_prior = 0.5.
Korzystając z twierdzenia Bayesa, oblicz prawodpodobieństwo, że mail o treści "give me bitcoin for xxx" będzie spamem.
-
>> Zadanie BONUS na zajęcia nr 5/6 - algorytm KNN a brakujące wyniki wyborów
Plik exitpoll.csv zawiera dane z wyników exit poll w wyborach parlamentarnych w 2023: województwo, miasto wojewódzkie, jego szerokość i długość geograficzna oraz nazwa partii, która wygrała tam wybory. [TVN24] Wyniki wyborów wizualnie na mapie
Symulujemy sytuację, w której nie mamy wyników wyborów dla województw: dolnośląskiego, lubelskiego oraz śląskiego [usuń je z tabeli przed trenowaniem]
Wykorzystaj algorytm KNN do przewidzenia wyników wyborów w tych województwach, na podstawie pozostałych wyników w innych województwach ("nie wiem co mam zrobić, więc zapytam sąsiadów i zagłosuję tak jak oni mówią").
- - Jakie wyniki zaobserwujesz dla k=3, a jakie dla k=10?
- - Zmień zestaw brakujących województw, na przykład na tylko skrajnie zachodnie lub skrajnie wschodnie- jak to może wpłynąc na wyniki?
- - Czy gdyby nie typowa dla Polski zależność "podziału" w wynikach wyborów i nie tylko (tzw. Polska "A" i "B"), takie przewidywanie miałoby sens?
- - Jakie dane musielibyśmy posiadać, żeby precyzyjniej przewidzieć wyniki wyborów we wszystkich miastach Polski?
- - Czy na podstawie tylko takich danych moglibyśmy przewidzieć, z której partii pochodziłby prezydent w wyborach prezydenckich (założenie: głosuje się na partię, a nie człowieka)? (wskazówka: wyniki wyborów drugiej tury w 2020, podział na województwa).
Notebook Jupyter z kodami: zajecia6_bonus.ipynb
-
>> Zadanie na zajęcia nr 5 - regresja liniowa: jak długo się uczyć na egzamin?
Na uczelni przeprowadzono ankietę wśród studentów, mającą określić, co miało wpływ na wyniki egzaminu.
Studenci byli pytani ile godzin spędzili nad nauką (x1), ile godzin spali przed egzaminem (x2), ile litrów kawy wypili dzień przed egzaminem (x3).
Każdy student podał też liczbę punktów oraz miał przypisaną ocenę. Ankietowanych studentów było 25. Na tej podstawie zbudowano modele wiążące liczbę punktów lub ocenę z tymi trzema czynnikami, zauważając w wielu przypadkach pewną korelację ilości punktów z ilością godzin spędzonych nad nauką oraz ilością przespanych godzin.
Skorzystaj z generatora danych dostępnego w pliku zajecia5.ipynb lub zajecia5.py, podziel dane na zbiór trenujący i testujący w proporcji 80/20, a następnie przeprowadź regresję liniową na różnych przypadkach:
- liczba punktów / ocena zależy tylko od ilości godzin spędzonych nad nauką - regresja 1D
- liczba punktów / ocena zależy tylko od ilości godzin spędzonych nad nauką (x1) oraz przespanych (x2) - regresja 2D
- liczba punktów / ocena zależy od udziału wszystkich czynników x1, x2, x3
Po wykonaniu regresji określ poziom dopasowania modelu, obliczając współczynnik R^2 dla danych testowych.
Na podstawie uzyskanych wyników wykonaj/odpowiedz:
- - Dla regresji 1D narysuj wykres z prostą obrazującą zależność - czy jej przebieg jest zgodny z pomiarami?
- - Który z modeli (a,b,c) wydaje się najlepszy do przewidywania wyników punktowych?
- - Czy dokładniejsze będzie przewidywanie liczby punktów czy oceny?
- - Uruchom generator dla 1000 wyników zamiast 25. Czy wpłynęło to istotnie na wyniki regresji?
- - Zmień podział danych trenujących/testujących na proporcje 90/10 oraz 50/50. Czy wpłynęło to istotnie na wyniki regresji?
- - Jaki wynik według różnych modeli osiągnie student, który uczył się 20 godzin, spał 8 godzin* i wypił 2 litry kawy* (* - jeśli dany model nie przewiduje tego czynnika, pomiń go).
- - Jakie warunki w różnych modelach mogą "wystarczyć" do zaliczenia egzaminu (50 punktów) dla każdego przypadku (dla przypadków 2D i 3D będzie to więcej niż jeden sposób uzyskania wyniku).
Należy pamiętać, że korzystamy z generatora i "rzeczywistość" jest generowana na podstawie przyjęcia jakiegoś założenia odnośnie relacji danych, z dodaną pewną losowością - przeprowadzenie takiej analizy na danych rzeczywistych mogłoby prowadzić do wniosków, że nie da się realnie przewidzieć wyników egzaminu na podstawie podanych czynników.
Notebook Jupyter z kodami: zajecia5.ipynb
-
>> Zadanie na zajęcia nr 4 - redukcja wielowymiarowości w bazie danych Pokemonów
Zagadnienie wielowymiarowości jest zgrabnie pokazane na przykładzie Pokemonów na blogu Mirosława Mamczura.
Wykorzystajmy zatem bazę Pokemonów dostępną w pliku pokemon.csv (źródło), żeby zobrazować na czym polega redukcja wielowymiarowości.
Zastosuj na podanej bazie algorytm PCA i zredukuj wymiary do 2:
- "ręcznie" - wykorzystując kolejne kroki PCA: standaryzacja, obliczaniem macierzy kowariancji, wartości i wektorów własnych, wyboru 2 składowych głównych oraz transformacji danych na nowe składowe - skorzystamy z Numpy;
- wykorzystując gotową funkcję do PCA z biblioteki Scikit-learn;
Czy na podstawie takiej redukcji danych i wizualizacji da się wykonać prostą klasteryzację? Co możemy odczytać z takich danych? Czy możemy coś odczytać po redukcji danych (np. wybrania tylko określonych typów)?
Notebook Jupyter z kodami: zajecia4.ipynb
-
>> Zadanie na zajęcia nr 3 - preprocessing: integracja, sprawdzanie, oczyszczanie, normalizacja danych
W szkole średniej robiony jest prosty bilans uczniów - badanie wzrostu i wagi. Są 3 klasy - A, B, C, każda licząca ok. 15-25 os. Pomiary wykonują panie pielęgniarki Krysia, Marysia i Zbysia, każda dla innej klasy.
Każda zapisuje wyniki w osobnej tabelce do pliku CSV. Ale jak to w polskiej szkole, każdy robi po swojemu i jedna zapisuje wzrost w metrach, druga w centymetrach, jedna zapisuje wagę jako liczbę całkowitą, druga jako zmiennoprzecinkową.
jeszcze inna nie ma zainstalowanego Excela i robi to w notatniku, używając innych separatorów wartości i znaku dziesiętnego. W dodatku może się zdarzyć literówka i ktoś dostanie wzrost czterocyfrowy w cm, bo za długo wciśnie się klawisz 1 na starej 30-letniej klawiaturze. Żeby dopełnić katastrofy, trzech uczniów poszło na bilans drugi raz do innej klasy, żeby zwiać z lekcji, więc znajdują się na dwóch listach.
Pani Grażynka z sekretariatu ma teraz problem, bo musi szybko wysłać dane do kuratorium i czeka ją pewnie ręczne przepisywanie cyferek do Excela, żeby się wszystko zgadzało.
Bądź dobrym człowiekiem i pomóż pani Grażynce pisząc do tego automat, w którym pani Grażynka podaje tylko nazwy plików, a reszta robi się sama.
Do kuratorium należy wysłać:- wspólną listę uczniów i pomiarów bez podziału na klasy;
- statystyki: min, max, średnią i medianę wzrostu oraz wagi dla całego zbioru danych;
- w tabelce dodatkowo obliczone BMI każdego ucznia
- dane dotyczące BMI: ile % w BMI stanowią osoby "optymalne", ile jest nadwagi, ile jest niedowagi (uproszczone warunki: tylko 3 przedziały, można wszystkie)
- wykres punktowy wzrostu i wagi uczniów oraz wykres kołowy % zakresów BMI
- współczynnik korelacji danych wzrostu i wagi
Uwzględnij problemy:
- Różne separatory i znaki dziesiętne w plikach, które należy połączyć
- Różne skale i formaty liczbowe wzrostu i wagi - ustal arbitralnie i przelicz wartości w odpowiednich kolumnach
- Duplikacja danych - uczniowie, którzy dwa razy poszli na bilans
- Błędy grube, czyli wzrost >1000cm (przyczyna problemu do usunięcia: duplikacja pierwszej cyfry)
Generator danych (stworzony z użyciem ChatGPT, wymaga zainstalowania biblioteki Faker): generator.py
Przykładowe wygenerowane pliki z danymi do pobrania: students_A.csv ; students_B.csv ; students_C.csv
Notebook Jupyter z kodami: zajecia3.ipynb
Zadanie domowe
Pogłębienie problemu: usuń 3 losowe wartości wzrostu i wagi z tabeli, zostawiając puste pola (usuń ręcznie albo napisz skrypt, który to zrobi).
Co może zrobić pani Grażynka, żeby mieć spokój i nie musieć ponawiać całych badań dla 3 osób z pustymi komórkami?
Podpowiedź: kuratorium sprawdza dokładnie liczbę uczniów, zwraca uwagę na minima i maksima danych, ale nie testuje każdego ponownie.
Uwaga: Może to wpłynąć niekorzystnie na pojedyncze przypadki ze względu na przekłamanie stanu zdrowia, ale "statystyki mają się zgadzać".
Uwaga2: To nieetyczne i nie powinno się tak robić!Do poćwiczenia praktycznego kodowania: wyślij maila od pani Grażynki z poziomu skryptu Pythona, załącz tabelki i obrazki w załączniku, a statystki w treści maila, dodaj tytuł, nadawcę, itd. Przydadzą się moduły smtplib i email. Dane serwera SMTP weź z prywatnej skrzynki
Inny przypadek danych wymagających obróbki przed dalszym działaniem: cars.csv; tutorial video (z zajęć dla EAIiIB)
-
>> Zadanie na zajęcia nr 2 - przypomnienie zagadnień z analizy danych w Python (Pandas, Matplotlib, Numpy)
Baza danych z zestawami klocków LEGO - Rebrickable
Do pobrania: sets.csv ; themes.csv
Źródło: Rebrickable.com/downloads
Potrzebne pakiety: Pandas, Matplotlib, (niejawnie) NumpyZadania do wykonania:
- Wczytaj plik sets.csv, wyświetl pierwsze 10 rekordów
- Odczytaj ile jest rekordów w pliku
- Wyświetl tylko nazwy zestawów - pierwsze 10 rekordów
- Zakres roczników - minimalny i maksymalny rok
- Filtrowanie: zostaw tylko rekordy, w których liczba elementów > 0
- Grupowanie: zestawy dla każdego roku
- Ile zestawów wyszło w twoim roku urodzenia
- Średnia i mediana ilości elementów w zestawach z roku urodzenia
- Nazwa największego zestawu w bazie
- Nazwa największego zestawu w twoim roku urodzenia
- Tabela: Dla każdego roku nazwa największego zestawu i ilość elementów
- Wykres punktowy: liczba zestawów wydanych w danym roku
- Wykres słupkowy: średnia i mediana liczby elementów w zestawach w danym roku
- "Wyszukiwarka": Tabela zestawów z danym słowem w nazwie (np. Star Wars, Ninjago, Pirates) (dodatkowo: case insensitive)
- Łączenie danych: otwórz plik themes.csv i w danych zestawów zamień id serii na nazwę serii z pliku themes
- Wykres kołowy: “udział” danej serii (liczba zestawów) w roku urodzenia
- Wykresy na jednym ekranie: liczba zestawów z 3 określonych serii (np. Pirates I, Classic Town, Technic) w kolejnych latach
- (* - bardziej złożone) Zapis danych: Tabela w CSV, w której uwzględnione są tylko zestawy z ilością elementów >0, z nazwami serii zamiast id oraz bez kolumny url do zdjęć; posortowane rocznikami; a dane w rocznikach posortowane numerami zestawów. Kolumny w tabeli: rocznik, numer, nazwa, seria, ilość elementów.
Notebook Jupyter z kodami: zajecia2.ipynb
Zadania domowe (dla chętnych do poćwiczenia):
-
Użytkownik wpisuje nr XYZ zestawu (np. hardcode, input, okienko w Tkinter), wyszukujemy go w naszej bazie danych i w przeglądarce otwierają się:
- -Zdjęcie zestawu (z linka z bazy - pierwsze pasujące do schematu XYZ-1)
- -Wyszukiwanie w Google hasła: "LEGO XYZ"
- -(* dla ambitniejszych) Instrukcja do zestawu na stronie https://lego.brickinstructions.com/ - uwaga: trzeba sprawdzić w przeglądarce, jaką postać ma metoda POST w przypadku podania konkretnego numeru zestawu, ciężko to zrobić korzystając z samego URL, który zawiera też nazwę.
- (* poćwiczenie algorytmiki) W pliku themes.csv są podane wszystkie podserie, ale też serie główne poprzez parent_id - dla każdego zestawu dopisz nie tylko pasującą podserię, ale całe drzewo serii (np. zamiast Paradisa -> Town:Paradisa) - zwykle są to 2-3 gałęzie aż do serii głównej (która odznacza się tym, że nie ma podanego parent_id).
- (* inne zdefiniowanie danych dające inne wnioski) Dla każdego zestawu odczytaj tylko serię główną, a nie podserię - powtórz analizę z punktów o udziale procentowym serii w roku oraz liczbie zestawów z danej serii
- (** dla mających dużo wolnego czasu) Poszerzenie bazy danych - wykorzystaj web scrapping: liczba minifigurek i średnia cena sprzedaży podanego zestawu używanego ze strony Bricklink.com, przeprowadź analizę np.: średniej ceny zestawu w czasie, sumę wartości zestawów w danym roku, statystyk dla liczby minifigurek w zestawach w danym roku (średnia, mediana, suma, maksimum), sumy liczby minifigurek w danym roku
Zagadnienia na kartkówkę 10min: typy danych w Pythonie, napisać prostą funkcję, napisać prostą pętlę, tworzenie listy i dodawanie elementów, operacje na listach, zamiana typów (lista-set, lista-słownik, set-lista, lista-string itp)., tworzenie obiektu z definicji klasy, wywołanie metody, instrukcje sterujące, osługa wyjątków
Kontakt
mgr inż. Paweł Miry
E-mail: miry@agh.edu.pl
Telefon: w razie pilnych spraw, udostępniany starostom w każdej grupie
Konsultacje: on-line przez Teams lub dowolne inne narzędzie, po wcześniejszym umówieniu się mailowo
Strona dumnie wygenerowana przez ChatGPT po prośbie:
"Napisz mi prostą stronę internetową w HTML wyglądającą jak typowa strona nauczyciela akademickiego z AGH"