Vi har en idé om, hvad afstanden er mellem to punkter. Hvis vi har to prikker på et stykke papir, så véd vi, hvordan vi måler afstanden mellem dem. Hvis vi har to steder i vores dagligstue, så har vi også en idé om deres afstand.
Hvordan kan vi tale om afstand mellem to bøger? Vi vil nok forvente, at bøger indenfor samme genre ligger tæt på hinanden, eksempler:
Forestil dig, at vi har et genre-rum, hvor der er et punkt for hver eneste bog, og vi kan måle afstanden mellem dem. Dette vil give nye muligheder for at gå på opdagelse i litteraturen. Anbefalinger skabes ved at finde de nærmeste nabopunkter. En genre består af punkter i nærheden af hinanden. Dette gør, at vi kan bruge computeren til at udforske litteraturen.
På papir, i vores dagligstue såvel som i genrerummet, kan afstand defineres matematisk således: Hvis vi har to punkter, $a$ og $b$, så er afstanden mellem dem $\sqrt{(a-b)^2}$. I én dimension er det afstanden mellem to tal. Eksempel: afstanden mellem $1$ og $3$ er $2$, hvilket kan udregnes som $\sqrt{(1 - 3)^2} = \sqrt{(-2)^2} = \sqrt{4} = 2$. I to dimensioner er det afstanden mellem to prikker på et stykke papir, også kaldet den "Euklidiske afstand", $\sqrt{(x_a - x_b)^2 + (y_a - y_b)^2}$. Eksempel: afstanden mellem koordinaterne $(1,2)$ og $(4,6)$ er $5$ hvilket vi kan udregne som $\sqrt{(1-4)^2 + (2-6)^2} = \sqrt{3^2 + 4^2} = \sqrt{9 + 16} = \sqrt{25} = 5$. I tre dimensioner er det afstanden mellem to punkter i rummet, i.e. $\sqrt{(x_a - x_b)^2 + (y_a - y_b)^2 + (z_a - z_b)^2}$, - og det fortsætter på samme måde i fire, fem, seks, ... dimensioner.
I matematik kalder vi ofte koordinaterne for vektorer. Eksempelvis er en 5-dimensionel vektor, blot en liste af fem tal, og en 100-dimensionel vektor er en liste af hundrede tal.
Hvordan skaber vi et sådan genrerum? Vi har en masse statistik om lån på bibliotekerne. Hvis vi antager, at man ofte låner indenfor samme genre, så kan computeren ud fra disse data udregne et genrerum.
Jeg har udregnet et sådan genrerum for 10.000 biblioteksmaterialer, og i det følgende vil vi undersøge, om afstanden mellem bøger i genrerummet giver mening.
Når vi laver et program, må vi først fortælle computeren, hvilken funktionalitet vi har brug for: bibdata
indeholder bibliografiske data, og genrerummet, som jeg har beregnet. numpy
indeholder matematikfunktionalitet:
import bibdata
import numpy
I bibdata
er der en funktion, som returnerer titel/forfatter, hvis vi kommer med nummeret på et biblioteksmateriale:
bibdata.title_creator(8955)
Herover ser vi at bog nummer $8955$ er "Peter Plys". Ligeledes kan vi se de øvrige bøger, som vi vil eksperimentere med herunder:
[(book_number, bibdata.title_creator(book_number))
for book_number in [8955, 8214, 616, 580, 149, 278, 126, 29, 688]]
Disse kan derefter navngives, så de er lettere at arbejde med.
peter_plys = 8955
smilla = 8214
cirkeline = 616
cykelmyggen = 580
berlin = 149
paris = 278
strikning = 126
q84 = 29
kafka = 688
Vi kan finde punktet i genrerummet for en bog via bibdata.genres
. Selve genrerummet er 100-dimensionelt, så vektoren består af 100 tal. I programmering kaldes vektorer ofte for arrays.
bibdata.genres[peter_plys]
Som det næste vil vi definere en funktion, distance
, som udregner afstanden mellem to punkter/vektorer. Denne bruger funktionen numpy.linalg.norm(v)
, der udregner $\sqrt{v^2}$. Navnet linalg
står for "linær algebra", som er den del af matematikken, der blandt andet handler om at regne med vektorer.
def distance(a, b):
return numpy.linalg.norm(a - b)
Vi afprøver derefter funktionen ved at finde afstanden mellem $(1, 2)$ og $(4, 6)$. Dette skal være $5$, ligesom vi udregnede tidligere. Her bruger vi numpy.array
, som laver en liste af tal om til en vektor, så computeren kan regne på den.
distance(numpy.array([1, 2]), numpy.array([4, 6]))
Afstanden mellem "Peter Plys" og "Frøken Smilla" er:
distance(bibdata.genres[peter_plys], bibdata.genres[smilla])
Afstanden mellem "Cirkeline" og "Cykelmyggen Egon" er:
distance(bibdata.genres[cirkeline], bibdata.genres[cykelmyggen])
Afstanden mellem rejsebøger om "Berlin" og "Paris" er:
distance(bibdata.genres[berlin], bibdata.genres[paris])
Afstanden mellem rejsebog om "Berlin" og en håndarbejdsbog er:
distance(bibdata.genres[berlin], bibdata.genres[strikning])
Afstanden mellem to bøger af "Haruki Murakami" er:
distance(bibdata.genres[q84], bibdata.genres[kafka])
Konklusionen er, at afstanden mellem bøger i genrerummet faktisk giver mening. De tre forventninger, som jeg formulerede i starten af kapitlet, holder.
Bemærk at forventningerne blev formuleret, før eksperimenterne blev programmeret og kørt. Når man laver data science / videnskabelige eksperimenter, gælder det om først at formulere hypotese, og hvorledes man kan teste den, - og derefter, at udføre testen for, at se om hypotesen faktisk holder.