Göm meny
Gäller för: HT25

Storseminarium 3.3 - Experimentering

Innan seminariet ska du ha gått igenom Inför seminariet nedan och gjort tillhörande quiz. Syftet med detta är att du ska bekanta dig med innehållet så eventuella frågor kan redas ut under seminariet.

Denna sida visar en del av det som kommer att diskuteras på seminariet. Det kan hända att handledarna också tar upp andra uppgifter som inte behöver något specifikt studiematerial och då syns dessa uppgifter inte på sidan.

Inför seminariet

Under seminariet

Ni kommer att arbeta med uppgifterna tillsammans i mindre grupper, där ni diskuterar och förklarar för varandra, handledarna kommer att finnas till hjälp som under vanligt labb pass. Efter varje uppgift går handledarna igenom sin lösning i helklass, då finns möjlighet att ställa frågor och presentera alternativa lösningar.

OBS! Använd Python som miniräknare vid behov när ni löser uppgifterna nedan.

Vektorer

Vektoraddition

  • Vilken punkt i planet når vi om vi börjar i punkten $(1, 2)$ och sedan rör oss med vektorn $\mathbf{v} = (3, 4)$?

  • I förhållande till vår startposition, hur långt har vi förflyttat oss i varje riktning om vi först, följer vektorn $\mathbf{v_1} = (8, 0, 8)$, sedan $\mathbf{v_2} = (7, 6, 2)$ och slutligen $\mathbf{v_3} = (0, 7, 2)$? För enklare diskussion så kallar vi riktningarna för $x$, $y$ och $z$ där $x$ är den första komponenten, $y$ är den andra komponenten och $z$ är den tredje komponenten.

Skalärprodukter

  • Beräkna skalärprodukten av vektorerna $\mathbf{a} = (1, 1, 9)$ och $\mathbf{b} = (9, 6, 7)$.

  • Beräkna längden $|\mathbf{a}|$ av vektorn $\mathbf{a} = (1, 1, 9)$.

  • Beräkna längden $|\mathbf{b}|$ av vektorn $\mathbf{b} = (9, 6, 7)$.

Vinkeln mellan två vektorer

En annan definition av skalärprodukten är

$$ \mathbf{a} \cdot \mathbf{b} = |\mathbf{a}| |\mathbf{b}| \cos(\theta) $$

där $\theta$ är vinkeln mellan vektorerna, $\mathbf{a} \cdot \mathbf{b}$ är skalärprodukten av vektorerna och $|\mathbf{a}|$ och $|\mathbf{b}|$ är längderna av vektorerna.

Om vi arbetar om den formeln med vanliga algebraiska regler (vilket går bra eftersom $\mathbf{a} \cdot \mathbf{b}$, $|\mathbf{a}|$, $|\mathbf{b}|$ och $\cos(\theta)$ alla är vanliga tal) så kan vi härleda att cosinus för vinkeln mellan två vektorer $\mathbf{a}$ och $\mathbf{b}$ kan beräknas med hjälp av formeln

$$ \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{|\mathbf{a}| |\mathbf{b}|} $$.

Använd formeln och resultaten ovan för att beräkna cosinus för vinkeln mellan vektorerna $\mathbf{a} = (1, 1, 9)$ och $\mathbf{b} = (9, 6, 7)$? Använd gärna Python som miniräknare.

Vad kan vi använda detta till?

I exemplet ovan var vårt vektorrum tredimensionellt och vi kan ganska enkelt föreställa oss hur vinkeln mellan vektorerer kan ha tillämpningar i t.ex. tredimensionella simuleringar, 3D-grafik eller spel. Något som är lite svårare att föreställa sig är när vektorerna har väldigt många dimensioner, t.ex. 100 eller 1000 dimensioner. Eller varför inte 784?

Datasetet MNIST består av bilder på handskrivna siffror. Varje bild är 28 pixlar hög och 28 pixlar bred, alltså totalt 784 pixlar. Vi kan representera varje bild som en vektor med 784 komponenter där varje komponent representerar ljusstyrkan i motsvarande pixel i bilden. Vi kan alltså tänka oss att varje bild är en punkt i ett 784-dimensionellt rum. När vi säger “tänka oss” så menar vi att vi kan använda samma matematiska verktyg som fungerar i 2 eller 3 dimensioner och applicera dem på 784 dimensioner, även om vi inte kan föreställa oss det rent visuellt.

Här är några exempel på bilder från MNIST:

Exempelbilder från MNIST. By Suvanjanprasai - Own work, CC BY-SA 4.0, Link

Varje svart ruta med en vit siffra i bilden ovan är en 28x28 pixlar stor bild som kan representeras som en vektor med 784 komponenter. Vi kan nu använda skalärprodukter för att jämföra bilder med varandra. T.ex. kan vi beräkna vinkeln mellan två bilder och se om de är lika eller olika.

Vi ska nu titta på några exempel. Ladda ner filen mnist_utils.pyc och lägg den i samma katalog som kodfilen ni arbetar i. Den innehåller ett minimalt dataset med de 100 första bilderna i MNIST representerade som vektorer. Den innehåller också några hjälpfunktioner för att ladda och visa bilder från MNIST samt för att beräkna längden och skalärprodukten av vektorer.

Vi kan nu importera filen med nedanstående kod:

1
import mnist_utils as mu

Själva datasetet kan vi nu komma åt som mu.dataset. Datasetet är en dict med siffrorna 0-9 som nycklar och listor med vektorer som värden. Vektorerna representerar bilder av handskrivna siffror. Vi kan kontrollera hur många bilder vi har av varje siffra i datasetet:

1
2
for digit in range(10):
    print(f"Number of images for digit {digit}: {len(mu.dataset[digit])}")

Varje vektor är en lista med 784 tal mellan 0 och 255 som representerar ljusstyrkan i varje pixel i bilden. För att visualisera en bild kan vi använda funktionen mu.pprint_mnist(vector) där vector är en vektor från datasetet. Prova att köra koden nedan för att först se själva vektorn, och sedan se en visualisering av bilden som den representerar.

1
2
3
4
5
def show_example(digit, index):
    vector = mu.dataset[digit][index]
    print(vector)
    mu.pprint_mnist(vector)
show_example(0, 0)  # Visa vektorn för den första bilden av siffran 0

Nu till själva uppgiften. Skriv en funktion angle_between_images(image1, image2) som tar två bilder (vektorer) som argument och returnerar vinkeln mellan dem i grader. Använd formeln för vinkeln mellan två vektorer som vi härledde ovan och funktionerna mu.dot(a, b) för att beräkna skalärprodukten av två vektorer a och b, samt mu.length(v) för att beräkna längden av en vektor v. Det finns också en funktion mu.cos2degrees(cosine_val) som konverterar cosinusvärdet av vinkeln till grader. Använd dessa funktioner i implementationen.

Välj två olika bilder av samma siffra, t.ex. två olika bilder av siffran 0. För att underlätta jämförelsen av bilderna kan vi använda funktionen mu.pprint_mnist_sbs(vec1, vec2) som visar två bilder sida vid sida.

Beräkna vinkeln mellan de två bilderna med hjälp av angle_between_images(vec1, vec2). Vad blir vinkeln? Är den liten eller stor? Vad händer om du väljer två bilder av olika siffror, t.ex. en bild av siffran 0 och en bild av siffran 1? Vad blir vinkeln då?

MNIST-datasetet återkommer i AI-kursen då ni kommer bearbeta datan med hjälp av neurala nät. I kurserna om språkteknologi kommer ni att få se hur den här vektorlikhetsidén kan användas för att representera ord, meningar eller dokument som vektorer i ett högdimensionellt rum. Då kan vi använda vinklar och avstånd för att jämföra och analysera betydelsen av ord, eller likheten mellan meningar.

Repetition

Om ni har tid över är detta ett lämpligt tillfälle att repetera uppgifter från tidigare seminarier som ni kanske inte hann med då, eller som ni vill öva mer på.


Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-10-10