View
26
Download
4
Category
Preview:
Citation preview
UNIVERZITET U NOVOM SADU
TEHNIČKI FAKULTET
„MIHAJLO PUPIN“
ZRENJANIN
SEMINARSKI RAD 1. TIMA
TEMA: GRAFOVI U PYTHON-U POMOĆU
NETWORKX-A
Predmet: Sistemi veštačke inteligencije
Profesor: Prof. dr Ivana Berković Studenti: Svetlana Živanov IT 33/16
Asistent: Doc. dr Višnja Ognjenović Aleksa Putnik IT 38/16
Emilija Kulman IT 39/16
Zrenjanin, 2019. godina
2
SADRŽAJ
1. Predmetni cilj ......................................................................................................................... 3
2. O Python-u ............................................................................................................................. 4
2.1. Pandas ............................................................................................................................. 4
2.2. NumPy ............................................................................................................................ 5
2.3. Matplotlib ........................................................................................................................ 6
3. NetworkX ............................................................................................................................... 7
4. Anaconda ............................................................................................................................... 8
4.1. Instalacija ........................................................................................................................ 8
5. Spyder .................................................................................................................................. 14
6. Grafovi ................................................................................................................................. 15
6.1. Definisanje grafa ........................................................................................................... 15
6.2. Modifikacija grafa ......................................................................................................... 19
7. Generisanje grafova u NetworkX-u ..................................................................................... 21
8. Literatura .............................................................................................................................. 24
9. Izvori preuzetih ilustracija ................................................................................................... 25
3
1. Predmetni cilj
Upoznavanje sa glavnim pravcima razvoja i postignutim rezultatima u oblasti veštačke
inteligencije radi sagledavanja i razumevanja dometa informatizacije. Osim tehničkih
primena, rezultati se interpretiraju i u smislu novih saznanja o određenim aktivnostima
čoveka kao što su predstavljanje znanja, rešavanje zadataka, značaj heuristika, strategije
pretraživanja i drugo, što je u vezi sa procesima rezonovanja, učenja, prepoznavanja i
obrazovanja.
4
2. O Python-u
Python je interpretirani, interaktivni, objektno orijentisani programski jezik visokog nivoa,
koji poseduje dinamičku semantiku. Stvorio ga je Gvido van Rosum (Guido van Rossum)
1991. godine, a ime je dobio po kultnoj britanskoj komediji „Monty Python”. Odlikuje ga
visokokvalitetna struktura podataka, koja ga, u kombinaciji sa dinamičkim pisanjem i
vezivanjem, čini veoma atraktivnim za brz razvoj različitih aplikacija.
Python-ova jednostavna sintaksa lako naglašava čitljivost, smanjujući tako troškove
održavanja samog programa. Python podržava pakete koji podstiču modularnost programa i
ponovno korišćenje koda.
Python nema komplikovanih koraka, a ciklus edit-test-debug je neverovatno brz. Debugging
Python program je jednostavan, jer loš unos podatka nikada neće uzrokovati grešku
segmentacije. Umesto toga, debugging opcija će otkriti problem, bez izuzetka. Debbuger na
nivou izvora dozvoljava proveru lokalnih i globalnih varijabli, procenu proizvoljnih izraza,
postavljanje tačaka za zaustavljanje, unošenje linija koda u isto vreme i slično.
Rasprostranjenost Python-a je široka, a ovo su samo neke od industrija u kojima je ovaj
popularni programski jeziki uspešno primenjen: desktop grafički razvoj aplikacija
(uključujući i igrice), matematička i naučna analaza podataka, razvoj interneta (Python danas
koriste neki od najvećih internet domena na svetu poput Googlea, Facebooka, Reddita,
Dropboxa, YouTubea, Instagrama, Pinteresta...).
Python koristi whitespace da ograniči programske blokove, prateći off-side pravilo. Python
pozajmljuje ovo svojstvo od njegovog prethodnika ABC: umesto interpunkcija ili ključnih
reči, on koristi uvlačenje da prikaže blok u kome se odvija programski kod.
Neki od osnovnih paketa programskog jezika Python su: Pandas, NumPy, Matplotlib,
Networkx.
2.1. Pandas
Pandas predstavlja brzu i fleksibilnu open source biblioteku za Python programski jezik koja
pruža visoke performanse za ceo proces analize podataka na jednostavan i intuitivan način.
Ima cilj da postane jedna od najmoćnijih i najfleksibilnijih open source alata za analizu i
manipulaciju podataka. Namenjena je za sve Python korisnike koji žele da rade sa podacima i
koriste moćan alat za to.
Pored biblioteka Matplotlib i NumPy, Pandas je jedna od najkorišćenijih kada je u pitanju
data science oblast. Originalni autor je Wes McKinney a poslednja stabilna verzija
je 0.20.1 koja je izašla u maju 2017. godine. Što se tiče korišćenja, potrebno je poznavanje
osnova Python-a dok se iskustvo u korišćenju Pandas može imati ali nije obavezno.
Neke od osnovnih funkcionalnosti koje se mogu naći u besplatnoj Pandas biblioteci su:
Import i export podataka u različitim formatima (CSV, Txt, Excel, SQL, HDF5)
Statistika
5
Indexiranje, sortiranje, rangiranje
Čišćenje podataka
Filtriranje
Grupisanje (GroupBy)
Pivot
Rad sa vremenskim serijama (time series)
Vizualizacija podataka
Karakteristike:
Velika podrška i jaka zajednica
Aktivno se razvija
Ima opsežnu dokumentaciju
Odlično radi sa ostalim bibliotekama
Izgrađena na NumPy što znači da je brza
Slika 1. Pandas logo
2.2. NumPy
Jedna od najfundamentalnijih open source biblioteka za Python kada je u pitanju
proračunavanje je definitivno NumPy (Numerical Python).
Nudi pre svega matematičke funkcije koje vrše operacije na podacima. Ima karakteristiku
veoma brzog i efikasnog izvršavanja funkcija.
NumPy predstavlja proširenje na Python programskom jeziku dodajući podršku za velike,
višedimenzionalne nizove i matrice, zajedno sa velikim bibliotekama matematičkih funkcija
na visokom nivou koje posluju sa ovim nizovima. U 2005. godini Trevis Olifant stvorio je
NumPy.
NumPy rešava probleme sporosti delom putem obezbeđivanja multidimenzionalnih matrica i
funkcija i operatora koji rade efikasno na nizovima, što zahteva pisanje nekog koda uglavnom
za mali broj unutrašnjih petlji koristeći NumPy.
Slika 2. NumPy logo
6
2.3. Matplotlib
Matplotlib biblioteka je dizajnirana za laku i moćnu vizualizaciju podataka i postoji već više
od 14 godina. Poslednja stabilna verzija je 2.0.2 koja je izašla početkom maja 2017. godine.
Ova biblioteka je uz NumPy i Pandas vrlo ozbiljan konkurent naučnim, dobro poznatim
alatima (ali poprilično skupim) kao što su MatLab i Mathematica.
Ono što predstavlja manu kod Matplotlib-a je to što je poprilično low level što znači da je
potrebno da se napiše više linija koda kako bi se došlo do nekih naprednijih vizualizacija što
podrazumeva da je potrebno mnogo više truda i vremena nego kada se koriste high level
plaćeni alati ali svakako trud je vredan pokušaja.
Slika 3. Matplotlib logo
7
3. NetworkX
NetworkX je Python paket za kreiranje, manipulaciju i proučavanje strukture, dinamike i
funkcija složenih mreža.
Putem NetworkX-a mogu se pokrenuti i spremiti mreže u standardnom i nestandardnom
formatu podataka, generisati mnogi tipovi nasumičnih i klasičnih mreža, analizirati mrežna
struktura, izgrađivati mrežni modeli, dizajnirati novi mrežni algoritmi, crtati mreže i slično.
NetworkX pruža:
alate za proučavanje strukture i dinamike socijalnih, bioloških i infrastrukturnih
mreža;
standardni interfejs za programiranje i implementaciju grafova koji je pogodan za
mnoge primene;
brzo razvojno okruženje za saradničke, multidisciplinarne projekte;
interfejs prema postojećim numeričkim algoritmima i kodovima napisanim na C, C
++ i FORTRAN; i
sposobnost jednostavnog rada s velikim nestandardnim skupovima podataka.
Uz NetworkX možete učitati i uskladištiti mreže u standardnim i nestandardnim formatima
podataka, generisati različite vrste slučajnih i klasičnih mreža, analizirati mrežnu strukturu,
izgraditi mrežne modele, dizajnirati nove mrežne algoritme, nacrtati mreže i još mnogo toga.
Slika 4. NetworkX logo
8
4. Anaconda
Anaconda je besplatna i open source distribucija Python i R programskih jezika za naučno
računarstvo (nauka o podacima, aplikacije za mašinsko učenje, velika obrada podataka,
prediktivna analiza, itd.), koja ima za cilj da pojednostavi upravljanje paketima i
raspoređivanje. Anaconda distribuciju koristi više od 12 miliona korisnika i uključuje više od
1400 popularnih paketa podataka koji su pogodni za Windows, Linux i MacOS.
Anaconda distribucija dolazi sa više od 1.400 paketa, kao i Conda paket i menadžer
virtualnog okruženja nazvan Anaconda Navigator, tako da eliminiše potrebu za samostalnim
instaliranjem svake biblioteke.
Open source paketi mogu se pojedinačno instalirati iz repozitorijuma Anaconda pomoću
naredbe conda install ili pomoću naredbe install koja se instalira sa Anacondom. Pip paketi
pružaju mnoge karakteristike conda paketa i u većini slučajeva mogu raditi zajedno.
Prilagođeni paketi se mogu napraviti pomoću naredbe conda build, a mogu se deliti sa
drugima tako da ih prenesete u Anaconda Cloud, PyPI ili u druge repozitorijume.
Instalacija Anaconda2 uključuje Python 2.7 a Anaconda3 uključuje Python 3.7. Međutim,
možete stvoriti nova okruženja koja uključuju bilo koju verziju Python-a upakovanog sa
condom.
Anaconda Navigator je grafički korisnički interfejs za desktop računare (GUI) uključen u
Anaconda distribuciju koja korisnicima omogućuje pokretanje aplikacija i upravljanje
paketima, okruženjima i kanalima bez upotrebe komandnih linija. Navigator može tražiti
pakete na Anaconda Cloud-u ili u lokalnom repozitorijumu Anaconde, instalirati ih u
okruženje, pokrenuti pakete i ažurirati ih. Dostupan je za Windows, MacOS i Linux.
Sledeće aplikacije su dostupne po default-u u Navigatoru:
JupyterLab
Jupyter Notebook
QtConsole
Spyder
Glueviz
Orange
Rstudio
Visual Studio Code
4.1. Instalacija
Postupak instalacije Anaconde počinje klikom na link
https://www.anaconda.com/distribution/.
9
Slika 5. Početni izgled sajta
U zavisnoti od vrste operativnog sistema koji koristite (Windows, macOS, Linux) treba
izabrati odgovarajuću instalaciju vodeći računa da li je u pitanju 64-bitni ili 32-bitni
operativni sistem. U ovom slučaju biramo verziju 3.7.
Kada izaberete šta želite da instalirate, pojaviće Vam se ovaj prozor (kliknite na Save File) ili
će program automatski krenuti da se download-uje.
Slika 6. Čuvanje fajla
Kada pokrenete instalaciju, pojaviće Vam se sledeći prozor, kliknite na dugme Run.
10
Slika 7. Otvaranje i pokretanje fajla
Na sledećoj slici kliknite na dugme Next, a zatim na dugme I Agree.
Slika 8. Postupak instalacije I
U ovom slučaju na sledećoj slici biramo opciju Install for: Just me. Zatim, kliknite na dugme
Next.
Slika 9. Postupak instalacije II
11
Izaberite folder u kojem želite da sačuvate Anacondu, pa kliknite na dugme Next.
Slika 10. Postupak instalacije III
Na sledećoj slici označite opciju Register Anaconda as my default Python 3.7, zatim kliknite
na dugme Install. Posle toga na narednoj slici kliknite na dugme Next.
Slika 11. Postupak instalacije IV
12
Slika 11. Postupak instalacije V
Na sledećoj slici birate: ako želite da se instalira Visual Studio Code da biste mogli da *.py
fajl eksportujete u VS Code ekstenziju kliknite na dugme Instal Microsoft VSCode, a ako već
imate VS Code na računaru ili ako ne želite da ugradite ovu opciju kliknite na dugme Skip, a
zatim na narednoj slici na dugme Finish.
Slika 12. Postupak instalacije VI
13
Slika 13. Kraj instalacije
Slika 14. Izgled Anaconde Navigator
14
5. Spyder
Spyder je integrisano razvojno okruženje (IDE) otvorenog koda za naučno programiranje u
Python jeziku. Spyder se integriše sa nizom istaknutih paketa u naučnom Python steku,
uključujući NumPy, SciPy, Matplotlib, Pandas, IPython, SymPy i Cython, kao i drugi softveri
otvorenog koda. Objavljen je pod licencom MIT-a.
U početku kreiran i razvijen od strane Pierrea Raybauta 2009. godine, od 2012. Spyder je
održavan i kontinuirano poboljšavan od strane Python programera i zajednice.
Spyder se može proširiti sa plugin-ovima, uključuje podršku za interaktivne alate za proveru
podataka.
Ako želite da pokrenete Spyder-a, u Anaconda Navigator-u kliknite na dugme Launch ispod
ikonice Spyder.
Slika 15. Izgled Spyder-a
Važne komponente Spyder-a su Editor i IPython console.
Editor je višejezički uređivač sa pregledačem funkcija/klasa, alatima za analizu koda,
automatskim završetkom koda, horizontalnim/vertikalnim deljenjem i go-to-definition.
IPython console nam omogućava da izvršimo kod liniju po liniju.
15
6. Grafovi
Graf je struktura koja opisuje odnose između nekih objekata. Neformalno govoreći, grafove
čine tačke (čvorovi), koje predstavljaju neke objekte, i linije između njih (grane), koje
označavaju odnose između tih objekata. U literaturi graf se definiše kao uređeni par G = (V,
E), gde V predstavlja skup čvorova (V – vertices, nodes or points) a E skup grana koje
povezuju čvorove (E - edges, arcs or lines). Na sledećoj slici je primer grafa sa šest čvorova i
sedam grana.
Slika 16. Graf
Sledeći osnovni tipovi grafa su omogućeni kao Python klase: Graph, DiGraph, MultiGraph i
MultiDiGraph.
Graph - ova klasa implementira neusmeren graf. Ignoriše višestruke grane između dva
čvora. Dozvoljava self-loop edges.
DiGraph - ova klasa implementira usmeren graf. Omogućuje opšte operacije
usmerenog grafa i predstavlja podklasu klase Graph.
MultiGraph - ova klasa omogućava višestruke neusmerene grane između dva čvora.
MultiDiGraph je usmerena verzija MultiGraph-a.
6.1. Definisanje grafa
U IPython konzoli u Spyder-u potrebno je importovati networkx modul:
import network as nx
Ako se desi importing networkx fails, znači da Python ne može da instalira modul, i u tom
slučaju treba proveriti pythonpath.
Prazan graf se kreira na sledeći način:
16
Dodavanje jednog čvora se vrši na sledeći način:
Dodavanje više čvorova se vrši na sledeći način:
Dodavanje čvorova pomoću putanje se vrši na sledeći način:
Sjedinjavanje čvorova dva različita grafa se vrši na sledeći način:
17
Dodavanje grane se vrši na sledeći način:
Dodavanje još jedne grane se vrši na sledeći način:
Na poslednjem listing se vidi da su napravljena četiri čvora i dve grane. Prvo smo dodali
jednu granu, pa se dodavanjem te grane prave i dva čvora, a zatim smo dodali još jednu
granu, pa se dodavanjem i te grane prave još dva čvora. Na kraju štampamo sve i vidimo da
imamo graf koji ima dve odvojene grane odnosno graf koji nije povezan.
Dodavanje više grana se vrši na sledeći način:
18
Sjedinjavanje grana dva različita grafa se vrši na sledeći način:
Primer dodavanja čvorova (različitih vrednosti) i grana na graf:
19
Naredbe za izračunavanje broja čvorova i broja grana:
6.2. Modifikacija grafa
Uklanjanje pojedinačne grane, pojedinačnog čvora ili celog grafa se vrši na sledeći način:
20
Dodavanje čvorova koristeći range se vrši na sledeći način:
Dodavanje više grana istovremeno se vrši na sledeći način:
21
7. Generisanje grafova u NetworkX-u
Primer 1. Generisati graf sa slike u Python-u pomoću modula NetworkX.
Slika 17. Graf 1
Rešenje:
Primer 2. Generisati graf sa slike u Python-u pomoću modula NetworkX.
Slika 18. Graf 2
Rešenje:
22
Primer 3. Generisati graf sa slike u Python-u pomoću modula NetworkX.
Slika 19. Graf 3
Rešenje:
Primer 4. Generisati potpun graf – najgušći jednostavan graf (sa najvećim mogućim brojem
grana), tj. graf koji ima granu između svaka dva čvora u Python-u pomoću modula
NetworkX.
Slika 20. Graf 4
Rešenje:
23
Primer 4 na drugi način. Za početak u ovom radu će se pokazati kako se može generisati
potpuni graf sa proizvoljnim brojem čvorova koji imaju vrednost broja. Komanda je
nx.complete_graph(broj čvorova)
a ako uzmemo pet čvorova, onda je rešenje sledeće:
Nakon pokretanja programa (slika 21):
Slika 20. Pokretanje programa u editoru Spyder-a
u IPython konzoli se dobijaju svih pet čvorova i svih 10 grana
runfile('C:/Users/….py', wdir='C:/Users/….)
[0, 1, 2, 3, 4] [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Da bi se Primer 4 uradio pomoću komande nx.complete_graph(), potrebno je da se napiše
preoznačavanje čvorova grafa. Jedno od rešenja je sledeće:
Nakon pokretanja programa u IPython konzoli dobija se:
runfile('C:/Users/…..py', wdir='C:/Users/….)
[0, 1, 2, 3, 4] [(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
['A', 'B', 'C', 'D', 'E'] [('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('B', 'C'), ('B', 'D'), ('B', 'E'),
('C', 'D'), ('C', 'E'), ('D', 'E')]
Nastavak rada sa grafovima se nalazi u radu 2. tima.
24
8. Literatura
Materijal sa vežbi iz predmeta Sistemi veštačke inteligencije, školska 2018/2019 godina i
internet stranice:
[1] https://www.python.org/
[2] https://networkx.github.io/documentation/stable/tutorial.html
[3] https://www.anaconda.com/distribution/
[4] https://www.spyder-ide.org/
[5] https://pandas.pydata.org/
[6] https://matplotlib.org/
[7] http://www.numpy.org/
[8] https://skolakoda.org/teorija-grafova
25
9. Izvori preuzetih ilustracija
Slika broj 1 https://pandas.pydata.org/
Slika broj 2 http://www.numpy.org/
Slika broj 3 https://matplotlib.org/
Slika broj 4 https://networkx.github.io/documentation/stable/tutorial.html
Slika broj 16 https://en.wikipedia.org/wiki/Graph_(discrete_mathematics)
Slika broj 17 http://neenuprasad.blogspot.com/2013/09/basic-graph-theory-concepts-
konigsberg.html
Slika broj 18 https://www.includehelp.com/ds/shortest-path-between-two-nodes-in-
graph-using-djikstra-algorithm.aspx
Slika broj 19 http://informatika.stei.itb.ac.id/~rinaldi.munir/Matdis/2018-
2019/Makalah2018/Makalah-Matdis-2018-124.pdf
Slika broj 20 https://skolakoda.org/teorija-grafova
Recommended