Machine learning – pierwsze kroki cz. 1

Machine learning – co to jest ?

Machine learning (uczenie maszynowe) jest to jeden z najważniejszych obszarów sztucznej inteligencji oraz jest to dziedzina z pogranicza tradycyjnej matematyki i statystki oraz informatyki i inżynierii oprogramowania z drugiej strony. Jako użytkownik codziennie nieświadomie korzystamy z wielu aplikacji, które wykorzystują mechanizmy uczenia maszynowego w celu polepszenia wygody i odczuć osoby korzystającej z aplikacji. Przykładem aplikacji wykorzystujących machine learning może być autokorekta tekstu w klawiaturze, wirtualni asystenci (np. Cortana, Siri). Ale czym dokładnie jest uczenie maszynowe? Jest wiele definicji dotyczących tego zagadnienia. Na wysokim poziomie abstrakcji uczenie maszynowe można traktować jako zestaw narzędzi i metod, które służą do wyszukiwania schematów oraz istotnych informacji z zarejestrowanych danych. Przykładową aplikacją obrazującą działanie mechanizmów machine learningu może być program odpowiedzialny za rozpoznawanie kodów pocztowych widocznych na kopertach. W celu nauczenia takiej aplikacji rozpoznawania danych z obrazu można użyć fotografii kopert oraz listy z widocznymi kodami pocztowymi.

Machine learning w czym pisać swoje programy?

W większości przypadków do komercyjnego tworzenia systemów uczenia maszynowego wykorzystuje się język Python. Dzięki dostępności wielu pakietów związanych z tematyką uczenia maszynowego ten język programowania ma bardzo duży potencjał do tworzenia tego typu rozwiązań. Dodatkowo język ten jest bardzo wszechstronny oraz elastyczny co pozwala na tworzenie za jego pomocą całych serwisów a nie tylko elementów związanych z machine learning. Mimo wszystkich plusów tego języka do nauki uczenia maszynowego polecam jednak wykorzystanie innego języka programowania jakim jest R.

Język R

R to język do wykonywania i obrazowania obliczeń statystycznych. Język ten udostępnia wiele technik statystycznych (modelowanie liniowe i nieliniowe, narzędzia klasyfikacji i wiele innych) oraz technik obrazowania. Jest niezwykle efektywny podczas manipulowania oraz analizy danych. R jest bardzo popularny pośród społeczności analityków danych oraz badaczy uczenia maszynowego.

Analiza danych

Podczas pracy z danymi dobrze jest podzielić pracę na dwie części:

  • Analizę eksploracyjną
  • Analizę potwierdzającą

Rozróżnienie takie pochodzi o Johnego Turkeya, który podkreślał znaczenie projektowania prostych narzędzi do praktycznej analizy danych. Według J. Turkeya analiza eksploracyjna to podsumowania i wizualizacje pomoce w identyfikowaniu schematów, które są ukryte w przetwarzanych przez nas danych. W fazie eksploracji danych należy uważać na znajdowanie wzorców, które tak naprawdę nie istnieją. Nasz umysł wyewoluował jako narzędzie wychwytywania wzorców przez co potrafimy je znaleźć tam gdzie są one czystym przypadkiem. Z tego względu faza eksploracji musi być uzupełniona fazą analizy potwierdzającej. W analizie potwierdzającej używa się zazwyczaj dwóch metod:

  • testowania formalnego modelu wykrytego wzorca na nowych danych
  • stosowanie teorii prawdopodobieństwa w celu zweryfikowania, czy schematy wykryte w fazie analizy eksploracyjnej mogły powstać przypadkowo

Pierwszym etapem analizy eksploracyjnej danych jest załadowanie dostępnych danych oraz wnioskowanie ich typu. W ramach przykładu będziemy tworzyć aplikację, której zadaniem jest stwierdzenie płci osoby o podanej wadze i wzroście. W tym celu najpierw utworzymy obiekt data i do jego właściwości o nazwie file przypiszemy ścieżkę do pliku z danymi. Plik ten można pobrać pod tym adresem. Następnie ładujemy z niego dane do zmiennej heights.weight. Kolejnym krokiem jest przeskalowanie danych do przyjętych dla nas metryk oraz zmiana nazwy płci z nazwy angielskiej na polski odpowiednik.

Wykres histogramu wzrostu

Rys 1. Eksploracja danych – wykres obrazuje liczbę osób o danym wzroście

W celu wykrycia wzorców w przetwarzanych danych możemy także wygenerować wykresy gęstości. Można to zrobić korzystając z metod dostępnych w ramach biblioteki ggplot2 i należy wykorzystać metodę geom_density() zamiast geam_histogram().

Wykres gęstości wzrostu

Rys 2. Wykres gęstości

Wyłuskanie oczekiwanych modeli na tak przygotowanym wykresie także może nie być możliwe, dlatego w tym przypadku utworzymy kolejny wykres który już podzieli dane względem płci. Aby to zrobić do metody w metodzie aes musimy dodać parametr fill i przypisać do niego wartość Gender (heights.weights$Gender) a następnie dodajemy legendę poprzez dodanie parametru fill = „płeć” do metody labs.

wykres wzrostu z podziałem na płeć

Rys 3. Wykres gęstości wzrostu w zależności od płci

Dzięki takiemu wykresowi możemy już wyłapać model, który mówi nam, że większość mężczyzn ma wzrost w okolicach 178cm a większość kobiet w granicy 160cm. Dodatkowo z tego wykresu możemy odczytać, że średni wzrost mężczyzn jest większy niż średni wzrost kobiet.

Ciąg dalszy nastąpi…

Przydatne narzędzia dla indie developerów

Ostatnio w wolnym czasie zacząłem pracować nad własną grą. Przed rozpoczęciem pracy nad projektem nie zdawałem sobie sprawy z liczby narzędzi, których będę potrzebował do stworzenia swojego tytułu. W ramach tego artykułu chcę przedstawić narzędzia, które w mojej opinii są przydatne w procesie tworzenia własnej gry(indie developer).

Silniki gier

Przed rozpoczęciem pracy nad grą należy zdecydować o silniku na którym będzie działał nasz tytuł. Możemy stworzyć od podstaw swój silnik lub wybrać jeden z już istniejących. Z dostępnych rozwiązań warto rozważyć dwa wiodące rozwiązania, z których może skorzystać każdy indie developer.

Unity

Unity
Unity

Link do strony z opisem silnika: https://unity3d.com
Wspierany język programowania: C#

Silnik Unity jest dostępny w kilku wersjach:

  • Personal – darmowa i zarazem najbardziej uboga wersja. Jest to idealne rozwiązanie dla osób, które zaczynają swoją przygodę z gamedevem lub nie posiadają dużego budżetu.
  • Plus – bogatsza wersja. (35$/miesiąc)
  • Pro – najbogatsza wersja.(125$/miesiąc)

Gry, które korzystają z tego silnika można znaleźć na tej stronie: https://unity.com/madewith?_ga=2.142683056.44613910.1508350468-506106525.1480273934

Jedną z najważniejszych zalet tego narzędzia jest to, że jako podstawowy język programowania wykorzystuje C#. Język ten jest w miarę prosty do nauki oraz dostarcza bardzo dużo gotowych rozwiązań, szczególnie w połączeniu z biblioteką .Net framework. Najlepszym IDE według mnie do pracy z tym silnikiem oraz z C# jest Visual Studio. Samo IDE występuje w kilku wersjach od darmowej (Community) po płatną (Enterprise).

Unreal Engine

Unreal Engine
Unreal Engine

Link strony z opisem silnika: https://www.unrealengine.com/en-US/blog
Wspierany język programowania: C++, Blueprint

Gry stworzone z wykorzystaniem tego silnika można znaleźć na tej stronie: https://www.unrealengine.com/en-US/showcase

Silnik ten jest dostępny do pobrania za darmo. Nie posiada on wersji płatnych, które dostarczają większą liczbę funkcjonalności. Przy korzystaniu z tego rozwiązania po opublikowaniu gry należy zapłacić 5% swojego przychodu brutto z danego tytułu za korzystanie z tego rozwiązania. Płatność obowiązuje tylko i wyłącznie gdy dochód z tytułu sięgnie co najmniej 3000$ na kwartał.

Podstawowym językiem programowania w tym silniku jest C++. Dzięki takiemu rozwiązaniu dobry programista jest w stanie tworzyć bardzo wydajne gry. Niestety dla niedoświadczonych programistów pisanie gier w tym języku może być trudne, ze względu na sporą ilość pułapek w jakie możne się złapać w C++ np. wycieki pamięci.

Silnik udostępnia także alternatywny „język” programowania jakim są Blueprinty. Rozwiązanie to pozwala na tworzenie logiki gry za pomocą łączenia bloków i za ich pomocą osiągania wymaganego celu.

Każdy z wymienionych silników posiada zarówno mocne jak i słabe strony, więc nie można jawnie określić, który z nich jest lepszy. Wybór rozwiązania zależy więc głównie od predyspozycji developera gry oraz tego czego w danej grze lub procesie jej tworzenia jest wymagane.

Unreal - Blueprints
Unreal – Blueprints

IDE

Visual Studio

Visual studio
Visual studio

Dobre IDE jest jednym najważniejszym wyborem zaraz po wyborze silnika, ponieważ jest on drugim narzędziem, w którym spędzimy najwięcej czasu zaraz po silniku. Według mnie najlepszym IDE, które pozwoli tworzyć gry zarówno w C++ jak i C# jest Visual Studio. Sam korzystam z wersji Community tego IDE. Co najważniejsze dla indie developerów można z tego IDE korzystać za darmo lecz trzeba spełnić pewne określone lrzez Microsoft warunki.

Programy do modelowania 3D

Blender3D

Blender
Blender

Podstawowym narzędziem do tworzenia modeli 3D w moim przypadku jest Blender. Co najważniejsze narzędzie to jest darmowe do zastosowań komercyjnych oraz dostarcza wszystkie wymagane funkcjonalności potrzebne do tworzenia modeli 3D (high poly oraz low poly). Jak jesteś indie developerem warto zainteresować się tym narzędziem.

Przy programach do modelowania warto wymienić także świetne płatne narzędzia takie jak 3ds max oraz Maya od Autodesku.

Programy do teksturowania oraz grafiki 2D

GIMP

Gimp
Gimp

Do tworzenia grafiki 2D warto wykorzystać GIMPa. Jest to dobre i proste w obsłudze narzędzie, które dostarcza naprawdę wiele funkcjonalności. Korzystając z tego programu możemy tworzyć dowolny rodzaj grafik 2D od tekstur po dowolne miniaturki.

Pakiet programów od Allegorithmic

Substance
Substance

Pakiet bardzo przydatnych narzędzi od firmy Allegorithmic można nabyć już za 19$/miesiąc (oferta dotyczy tylko indie developerów) . Narzędzia te bardzo przyśpieszają proces teksturowania modeli oraz pomagają uzyskać naprawdę bardzo dobrą jakość tekstur. Przy tworzeniu własnych tytułów korzystam z Substance Painter oraz Substance Source

Audio

Audacity

Audacity
Audacity

Do edytowania oraz szykowania audio do swoich projektów wykorzystuję Audactiy. Ponownie kryterium wyboru było to, że to narzędzie jest darmowe.

Przydatne strony

  • https://www.turbosquid.com/ – strona na której można znaleźć wiele gotowych modeli 3D zarówno darmowych jak i płatnych.
  • https://www.gametextures.com/ – strona na której po wykupieniu subskrypcji można znaleźć wiele bardzo dobrych jakościowo gotowych materiałów.
  • https://www.udemy.com – portal na którym udostępnionych jest wiele jakościowo dobrych kursów dotyczących game devu, modelowania 3d, programowania itp.

Messages manager – pierwsze kroki w Symfony

Czym jest Symfony ?

Symfony jest frameworkiem dla aplikacji internetowych tworzonych w PHP. Dostarcza on podstawowe funkcjonalności takie jak obsługa zapytań, bazy danych, profiler, system szablonów, translacje oraz wiele innych. Dzięki wykorzystaniu frameworka programista może od razu rozpocząć pracę nad funkcjonalnością swojej aplikacji, zamiast tworzyć podstawowe mechanizmy wymagane do działania aplikacji internetowej.

Tworzenie aplikacji opartej o framework Symfony

Przed utworzeniem aplikacji wykorzystującej framework należy pobrać instalator tego narzędzia, a służy do tego poniższe polecenie (Windows):

Powyższe polecenie należy uruchomić w wierszu poleceń, w katalogu źródłowym,w którym ma się znajdować nowy projekt. Po wykonaniu tej komendy można utworzyć nowy projekt poleceniem:

Po wykonaniu tego polecenia w wierszu poleceń powinna pojawić się informacja o pobieraniu frameworka.

Tworzenie nowego projektu
Tworzenie nowego projektu

Po utworzeniu projektu należy skonfigurować serwer WWW tak, aby po wpisaniu adresu localhost wyświetlał dane zawarte w folderze web. Po udanej konfiguracji i wyświetleniu localhost. Powinna ukazać się poniższa strona:

Strona startowa Symfony
Strona startowa Symfony

Tworzenie własnego Bundle’a

Aby zacząć pracę nad projektem należy jeszcze wygenerować nowego Bundle’a. Architektura tego frameworka wymaga aby cały kod aplikacji znajdował się właśnie w takich paczkach. Każda osobna funkcjonalność powinna być tworzona jako osobna paczka. Pozwala to zachować spójność kodu oraz łatwość jego rozszerzania i zmniejsza koszty utrzymania. Takie podejście także pozytywnie wpływa na czytelność kodu, ponieważ logika związana z daną funkcjonalnością jest wydzielona do osobnego katalogu(paczki).

Przed utworzeniem nowego Bundle’a należy usunąć przykładowego wygenerowane przy tworzeniu projektu, aby to zrobić należy usunąć folder AppBundle z folderu src. Następnie w pliku app/AppKernel.php należy usunąć poniższą linie:

oraz w pliku app/config/routes.yml należy usunąć linie:

i z pliku app/config/services.yml należy usunąć poniższe wpisy:

Następnym krokiem jest utworzenie własnego Bundlea’, aby tego dokonać należy wykorzystać polecenie:

Po uruchomieniu tego polecenia należy odpowiedzieć na kilka pytań wyświetlanych przez Symfony.

Generowanie nowego Bundle'a w Symfony
Generowanie nowego Bundle’a w Symfony

Jako wynik wykonania tego polecenia w folderze src powinien pojawić się nowy folder o takiej samej nazwie jaka została podana w wierszu poleceń. W nowo utworzonym folderze powinien znajdować się kontroler oraz widok dla akcji index. Przykład wygenerowane kontrolera:

Ostatnim krokiem jest podmiana nazwy naszego Bundle’a w pliku composer.json. Należy w tym pliku zlokalizować poniższą linie:

i nazwę AppBundle zmienić na nazwę naszego nowo wygenerowanego Bundle’a. Teraz pozostaje tylko ponownie uruchomić przeglądarkę  i wpisać adres localhost. Tym razem powinna zostać wyświetlona strona zawierająca tekst Hello world!.