Priprema: Python, biblioteke i podaci

Modul 3 · Lekcija 1 od 7 · Veštačka inteligencija

U ovom modulu veštačku inteligenciju više ne samo objašnjavamo – programiramo je. Koristimo Python, jezik koji se najviše koristi u mašinskom učenju. U prvoj lekciji pripremamo računar, učitavamo tabelu sa podacima i crtamo je.

Predznanje: promenljive, liste, petlje i funkcije u Pythonu – ako ti nešto od toga nije jasno, ponovi lekcije Liste, Petlje i Funkcije.

Šta nam treba

  • Python 3 – ako ga još nemaš, pogledaj lekciju Instalacija i prvi program.
  • Editor: Thonny (najjednostavniji za početnike) ili VS Code.
  • Tri biblioteke:
    • numpy – brzo računanje sa brojevima i tabelama;
    • matplotlib – crtanje grafika;
    • scikit-learn – gotovi algoritmi mašinskog učenja (koristimo ih tek u lekciji 16).

Instalacija biblioteka

Otvori Command Prompt (Windows: taster Start, ukucaj cmd) i upiši:

pip install numpy matplotlib scikit-learn

U programu Thonny isto možeš da uradiš preko menija Tools → Manage packages: potraži svaku biblioteku i klikni Install.

Proveri da li je sve instalirano ovim programom:

# Provera: da li su instalirane biblioteke za ovaj modul
import sys

print("Python verzija:", sys.version.split()[0])

for ime in ["numpy", "matplotlib", "sklearn"]:
    try:
        modul = __import__(ime)
        print(f"{ime:12} OK, verzija {modul.__version__}")
    except ImportError:
        print(f"{ime:12} NIJE instaliran – pokreni: pip install {ime if ime != 'sklearn' else 'scikit-learn'}")

Ispis (brojevi verzija kod tebe mogu biti drugačiji):

Python verzija: 3.13.18
numpy        OK, verzija 2.5.3
matplotlib   OK, verzija 3.11.2
sklearn      OK, verzija 1.9.1

Podaci: tabela sa voćem

Kroz ceo modul koristimo istu malu tabelu: 30 plodova (jabuke, banane i pomorandže), za svaki plod masa u gramima i dužina u centimetrima, i oznaka – koja je to vrsta. Ovakav fajl zove se CSV (vrednosti razdvojene zarezom) i može da se otvori i u Excelu.

U folderu u kome čuvaš programe napravi fajl voce.csv i u njega iskopiraj ovaj tekst:

Fajl voce.csv:

masa,duzina,vrsta
152,7.5,jabuka
168,8.0,jabuka
140,7.2,jabuka
185,8.6,jabuka
175,8.1,jabuka
160,7.8,jabuka
195,8.9,jabuka
148,7.4,jabuka
172,8.3,jabuka
158,7.6,jabuka
120,19.0,banana
135,20.5,banana
118,17.5,banana
128,18.2,banana
140,21.0,banana
125,19.6,banana
132,18.8,banana
115,17.0,banana
138,20.1,banana
122,18.5,banana
210,8.4,pomorandza
230,8.9,pomorandza
195,8.0,pomorandza
245,9.3,pomorandza
220,8.7,pomorandza
205,8.2,pomorandza
238,9.1,pomorandza
185,7.9,pomorandza
215,8.6,pomorandza
250,9.5,pomorandza

Prvi red je zaglavlje (nazivi kolona); svaki sledeći red je jedan primer. U Pythonu reč pomorandža pišemo bez slova ž (pomorandza) da bismo izbegli probleme sa slovima u nazivima.

Program 1: čitanje tabele

# Čitanje tabele voce.csv i brojanje primera po vrsti
import csv

podaci = []                                  # lista redova: (masa, duzina, vrsta)
with open("voce.csv", encoding="utf-8") as f:
    for red in csv.DictReader(f):            # svaki red je rečnik: {"masa": "152", ...}
        podaci.append((float(red["masa"]), float(red["duzina"]), red["vrsta"]))

print("Ukupno primera:", len(podaci))
print("Prva tri reda:", podaci[:3])

broj = {}                                    # koliko ima primera svake vrste
for masa, duzina, vrsta in podaci:
    broj[vrsta] = broj.get(vrsta, 0) + 1
print("Po vrstama:", broj)

# prosečna masa svake vrste
for vrsta in broj:
    mase = [m for m, d, v in podaci if v == vrsta]
    print(f"{vrsta:11} prosečna masa: {sum(mase) / len(mase):.1f} g")

Ispis programa:

Ukupno primera: 30
Prva tri reda: [(152.0, 7.5, 'jabuka'), (168.0, 8.0, 'jabuka'), (140.0, 7.2, 'jabuka')]
Po vrstama: {'jabuka': 10, 'banana': 10, 'pomorandza': 10}
jabuka      prosečna masa: 165.3 g
banana      prosečna masa: 127.3 g
pomorandza  prosečna masa: 219.3 g
  • csv.DictReader čita red po red i svaki red pretvara u rečnik, npr. {"masa": "152", "duzina": "7.5", "vrsta": "jabuka"}.
  • Brojevi se čitaju kao tekst, pa ih pretvaramo funkcijom float().
  • Prosečne mase već nešto govore: banane su najlakše, pomorandže najteže – ali jabuke i pomorandže se delimično preklapaju.

Program 2: grafik

# Crtanje podataka: svaka tačka je jedan plod (x = masa, y = dužina)
import csv
import matplotlib.pyplot as plt

podaci = []
with open("voce.csv", encoding="utf-8") as f:
    for red in csv.DictReader(f):
        podaci.append((float(red["masa"]), float(red["duzina"]), red["vrsta"]))

boje = {"jabuka": "red", "banana": "gold", "pomorandza": "darkorange"}
oblici = {"jabuka": "o", "banana": "s", "pomorandza": "^"}

for vrsta in boje:
    x = [m for m, d, v in podaci if v == vrsta]
    y = [d for m, d, v in podaci if v == vrsta]
    plt.scatter(x, y, c=boje[vrsta], marker=oblici[vrsta], label=vrsta, edgecolors="black")

plt.xlabel("masa (g)")
plt.ylabel("dužina (cm)")
plt.title("Voće: masa i dužina")
plt.legend()
plt.grid(alpha=0.3)
plt.show()
Grafik: jabuke, banane i pomorandže kao tačke prema masi i dužini
Svaka tačka je jedan plod. Banane su same gore levo, a jabuke i pomorandže su blizu jedna drugoj.

Grafik je najbolji prvi korak u svakom projektu mašinskog učenja: odmah vidimo da je bananu lako prepoznati po dužini, a da je razlikovanje jabuke od pomorandže teže – za to će nam trebati obe osobine.

Za čas (nastavnicima): trajanje 45 minuta; pribor: računari sa instaliranim Pythonom.
Prvih 15 minuta instalacija i provera; zatim učenici kucaju program za čitanje, a na kraju crtaju grafik i opisuju šta vide na njemu.

Česte zablude

  • „Za AI treba poseban programski jezik“ – Python je običan jezik; posebne su biblioteke i podaci.
  • „Što više biblioteka, to bolje“ – za prve korake dovoljni su obični Python, liste i petlje – biblioteke koristimo kada razumemo šta rade.

Zadaci za vežbu

Pokušaj prvo sam, pa tek onda otvori rešenje.

  1. Ispiši masu najteže i najlakše jabuke.
  2. Dodaj u voce.csv tri kruške (npr. 180 g i 10 cm) i prikaži ih zelenom bojom na grafiku.
  3. Izračunaj prosečnu dužinu svake vrste.
Rešenje 1: najteža i najlakša jabuka
# Zadatak: najteža i najlakša jabuka
import csv

jabuke = []
with open("voce.csv", encoding="utf-8") as f:
    for red in csv.DictReader(f):
        if red["vrsta"] == "jabuka":
            jabuke.append(float(red["masa"]))

print("Najteža jabuka:", max(jabuke), "g")
print("Najlakša jabuka:", min(jabuke), "g")

Ispis programa:

Najteža jabuka: 195.0 g
Najlakša jabuka: 140.0 g
Rešenje 2: kruške na grafiku

Na kraj fajla voce.csv dodaj redove:

180,10.2,kruska
165,9.8,kruska
195,10.6,kruska

U programu za grafik dodaj boju i oblik za novu vrstu: boje = {..., "kruska": "green"} i oblici = {..., "kruska": "D"}. Petlja for vrsta in boje će je sama nacrtati.

Rešenje 3: prosečna dužina
# Zadatak: prosečna dužina svake vrste
import csv

duzine = {}                                   # vrsta -> lista dužina
with open("voce.csv", encoding="utf-8") as f:
    for red in csv.DictReader(f):
        duzine.setdefault(red["vrsta"], []).append(float(red["duzina"]))

for vrsta, lista in duzine.items():
    print(f"{vrsta:11} prosečna dužina: {sum(lista) / len(lista):.1f} cm")

Ispis programa:

jabuka      prosečna dužina: 7.9 cm
banana      prosečna dužina: 19.0 cm
pomorandza  prosečna dužina: 8.7 cm

Po dužini se banane jasno izdvajaju, a jabuke i pomorandže su skoro iste.

Proveri znanje

Otvori kviz

Kviz: priprema za AI u Pythonu

1. Kojom komandom se instaliraju biblioteke?




2. Šta je CSV fajl?




3. Zašto se vrednosti iz CSV fajla pretvaraju funkcijom float()?




4. Šta se vidi na grafiku voća?