K-NN

**''k''-nærmeste naboer** (*k*-NN) er en parameterfri algoritme innen klassifisering og regresjon. Det er en lat algoritme, som betyr at den ikke lager noen klassifiseringsmodell a priori, men i stedet utfører jobben i det den får et dokument som skal klassifiseres.

I tekst klassifisering vil man ved bruk av *k*-NN få tilbake den antatte klassen på ett gitt dokument, basert på majoriteten til de nærmeste naboene. I regresjon derimot vil man få verdien til objekter, som da er gjennomsnittet til alle verdiene til de *k-*nærmeste naboene.

I begge disse tilfellene kan det være bra å vekte de forskjellige naboene sin innflytelse på resultatet etter distansen til subjektet. På denne måten vil de nærmeste naboene bety mer enn de som er lengre vekke.

## Algoritme
*k-*NN blir sett på som en av de simpleste algoritmene for klassifisering som finnes. Algoritmen har bare 2 steg;
#Plasser alle objekter i ett plan med dimensjoner som representerer hver attributt.
#Finn de *k-*nærmeste naboene av objektet, ved bruk av en likhets-score.
#Gi objektet en klasse fra flertallet av de k-nærmeste naboene.

*k* er et heltall som må bli bestemt for hver implementasjon. Hvilket tall *k* skal være, vil variere basert på for eksempel størrelsen på læresettet. Det er lurt å teste forskjellige verdier for *k*, for å se hvilken som fungerer best. Man kan sjekke dette ved hjelp av et testsett, altså et sett med objekter som man vet den korrekte klassifiseringen på, men som man ikke gir til algoritmen. Dermed kjører man algoritmen på settet og ser hvor mange den klassifiserer rett.

De nærmeste naboene er tatt ut fra et «læresett», som er et sett med objekter som er korrekt klassifisert. Metoden kalles derfor en veiledet algoritme. For å finne ut hvilken av disse som er nærmest dokumentet som klassifiseres, er det vanlig å bruke trigonometriske funksjoner. Dette er en måte å sammenligne forskjellen mellom to vectorer, i dette tilfellet alle attributtene til dokumentene. Det går også an å bruke evklidsk avstand mellom to dokumenter. Når man har disse rangeringene, kan man også bruke avstandsvekting for å påvirke resultatet.

En fordel med *k-*NN er at den bare baserer seg på objektet den skal klassifisere, i stedet for en stor global klassifiseringsmodell.
Dette kan gjøre det mer nøyaktig enn for eksempel ved et beslutningstre, da man bare vurderer egenskaper som er relevante for objektet.

## Dimensjonsreduksjon
Dersom datasettet man skal kjøre *k-*NN på har for mange attributter, vil det føre til algoritmen får det vanskelig å klassifisere rett. Irrelevante/uviktige attributter kalles støy. Man kan løse problemet med støy med dimensjonsreduksjon. Dette gjør man ved å bruke en metrikk som: *information gain*, *mutual information* eller *chi-square* for å nevne noen. Dette er matematiske funksjoner som vise hvor mye attributter betyr for beskrivelsen av en klasse. Ved å bruke disse til å finne de viktigste attributtene kan man redusere mengden attributter helt ned til 1-10% av original mengden uten å miste mye informasjon.

*k-*NN er utsatt for ''overfitting''. Dette betyr at dersom en bruker for mange attributter til å beskrive dokumentene, kan det bli for detaljert. Dette kan påvirke effektiviteten til algoritmen på dokumenter utenfor treningssettet da det er for spesifikt koblet mot treningssettet og dermed får problemer med nye dokumenter utenfor det.

## Finne rett ''k''
Det er vanlig å kjøre algoritmen noen ganger med forskjellig *k* for å finne den optimale verdien til *k*, men det er også mulig å bruke heuristiske metoder for gjøre det. En av disse er hyperparameteroptimisering.

Et stort antall *k* er bra for å redusere støyen i datasettet, men betyr også at å skille mellom klassene blir vanskeligere for algoritmen.

Dersom man har ett datasett med bare to klasser, er det bra å velge ett oddetall som *k*, da det ikke kan bli like mange av hver klasse i resultatet.

## ''k''-NN i regresjon
*k*-NN kan bli brukt for å finne kontinuerlige variabler. En slik metode er å bruke ett vektet gjennomsnitt, som er vektet med invers dokument frekvens.
#Regn ut Euclidean eller Mahalanobis distansen fra subjektet til objekter fra treningssettet.
#Ranger objektene etter distansen.
#Finn det optimale nummeret for k ved bruk av heuristikk. Dette kan man bruke kross-validasjon for.
#Kalkuler ett vektet gjennomsnitt av invers distansen med de k nærmeste objektene.

## Referanser

## Litteratur
* Baeza-Yates, R. Ribeiro-Neto, B. "Modern information retrieval, the concepts and technology behind search". p.&nbsp;299-300.