Product aanbevelingen made easy

-

Veel sites doen het al: Productaanbevelingen. Spotify, Amazon en ook bol.com zijn slechts enkele bedrijven die zich hiermee bezig houden. Je koopt een bepaald product bij bol.com, en opeens weet de website wat jij nog meer leuk vindt. Wat nog veel enger is, dat het meestal nog klopt ook!

Productaanbevelingen van Amazon

Deze blogpost gaat over een vrij simpel aanbeveling systeem, die bovendien ook redelijk werkt! Aangezien het onderwerp te groot is voor één blogpost, zal ik het verspreiden over meerdere posts. We gaan een werkende proof of concept bouwen die films aanraad, en misschien zelfs aan multi threading denken.

Maar voordat de technische lol begint eerst wat theorie. We gaan gebruik maken van de Pearson correlatiecoëfficiënt. Niet meteen weg klikken, het is eigenlijk best interessant.

De Pearson correlatiecoëfficiënt formule kan gebruikt worden om afstanden te bepalen tussen bepaalde groep punten. Onze aanbevelingssysteem gaat van het principe uit dat vergelijkbare mensen waarschijnlijk behoefte hebben aan vergelijkbare dingen. Het maakt hierbij niet uit wat de eigenschappen zijn van de dingen die aangeraden moeten worden, omdat alleen gekeken wordt naar de klant en zijn waarderingen. Maar welke klanten lijken op elkaar, iedereen is toch uniek? In zekere zin wel, maar hier komt Pearson tevoorschijn. Hiermee kunnen we namelijk afstand bepalen tussen twee klanten.

Laten we met een klein voorbeeld beginnen. We hebben een site met een aantal films die mensen kunnen waarderen. 1 voor slecht en 5 voor heel goed. We pakken van deze site drie bezoekers waarvan we een aanbeveling willen maken.

Bezoekers

Item/score

Vergelijkbaarheid

Aanbevolen items

Bezoeker 1

Diehard – 5

Looper – 4

Rambo – 5

Vergelijkbaar met klant 2

 Terminator

Bezoeker 2

Diehard – 4

Looper – 5

Titanic – 1

Terminator – 5

Vergelijkbaar met klant 1

Rambo

Bezoeker 3

Avatar – 2

Grease – 3

Titanic – 5

Tegengestelde mening klant 2

Geen

Bezoeker 1 heeft in dit voorbeeld interesse in twee items waar bezoeker 2 ook interesse in heeft. Beiden hebben een hoge score voor deze items, dus ze hebben ongeveer dezelfde voorkeuren voor die films. Hun afstand is dus laag.

Aanbeveling voor bezoeker 1

Aanbeveling voor bezoeker 1

Echter heeft bezoeker 2 een item bezocht die bezoeker 1 nog niet heeft bezocht, en deze is ook goed gewaardeerd. Deze kan aan bezoeker 1 aangeraden worden.

Bezoeker 2 heeft echter meerdere vergelijkbare bezoekers. Deze worden gesorteerd op relevantie. Omdat bezoeker 2 een lagere afstand heeft met bezoeker 1 dan bezoeker 3, zullen de aanbevolen items van bezoeker 1 komen. Bezoeker 2 en 3 hebben wel een item gemeen, maar de afstand ligt zover uit elkaar als maar kan. Hun smaak lijkt hierdoor tegenovergesteld.

Bezoeker 3 heeft echter maar één item gemeen met bezoeker 2. Maar deze hebben tegengestelde waarderingen. Dat betekent dus dat producten die door de één hoog gewaardeerd worden, zeker niet aangeraden moet worden. Hij valt dus helaas buiten de boot.

Klinkt redelijk logisch, maar wat is die magische Pearson Correlatiecoëfficiënt dan.

x    Waardering van bezoeker

y    Waardering van een andere bezoeker

r    Correlatie

Dat ziet er eng uit, maar dat valt eigenlijk wel mee. Het vreemdste teken \sum staat voor sommatie. Dus alles wat erachter staat wordt opgeteld per waardering. Dat streepje bovenop de x en de y staat voor gemiddelde, in dit geval dus de gemiddelde waardering van de gebruiker. In de volgende blogpost gaan we dit in code zetten, dan wordt het al snel een stuk duidelijker.

De uitkomst van deze formule geeft de gelijkenis aan van de gebruikers met een waarde tussen -1 en 1. Waarbij r = 1 de hoogste gelijkenis is, r = 0 geen gelijkenis en tenslotte r = -1 voor tegengestelde gelijkenis. Dat is eigenlijk alles wat je nodig hebt! Je weet welke mensen vergelijkbare smaak hebben. Door dit voor elke bezoeker te doen, komt er een lijst uit met gegevens over welke gebruikers dezelfde smaak hebben.

Mensen die het meest op elkaar lijken zijn gelukkig meestal niet exact hetzelfde. De ‘match’ heeft wellicht een paar dingen die hoog gewaardeerd zijn, die de bezoeker zelf nog niet kent. Die kan je dan aanraden, tenslotte hebben ze dezelfde smaak. En waarom zouden we daar stoppen. Door de 20 meest relevante personen te pakken, weet je zeker dat er wel iets leuks tussen zit. Jij geeft de bezoeker relevante content en de bezoeker blijft langer actief op jouw website. Ideaal toch?

Volgende blogpost ga ik met Java aan de slag om een werkend voorbeeld te maken.