eerk

Posted on

# Creating a recommender system in 10 lines of javascript

I've been dabbling in Machine Learning algorithms for Javascript, coming from a background of front-end development.

AI and Machine Learning can get complex very quickly, but I found that some basic algorithms, such as a decision tree or nearest neighbour, are easy to grasp and can still be surprisingly powerful.

In this super short tutorial we use K-Nearest-Neighbour to find people who have similar interests to you.

KNN is basically the pythagorean theorem. It compares a point in a space to several other points and tells you which is the closest.

Check this codepen to see an example

The "K" in KNN stands for the amount of points you want to check. If we use a K of 1 we just get the point closest to us.

## Using the X,Y axes as data

The trick of using KNN is that we can use the X,Y axes to project data. If we want to plot cats and dogs, we could draw their body weight on the X axis, and their ear length on the Y axis.

If we draw an unknown animal in this same plot, it should be easy to see if it's a cat or a dog, just by checking which are the closest animals.

From the above examples you might get the impression that good old pythagoras was just a two-dimensional character. But fascinatingly, his formula doesn't care how many dimensions there are.

We can add a third dimension and still draw it in a graph. But we could add many more, and the math still works.

In the example of pets, we could add many more pet features to find out what kind of pet we're dealing with.

In pseudo code it could look like this:

``````let pet = {ears:2, weight:92, height:14, speed:93}
let prediction = knn.predict(pet)
// returns: "Jaguar"
``````

KNN gives us the ability to classify data by pretending all the features are distances

## How about those 10 lines of javascript?

Let's use this algorithm to create a recommendation system. We'll find a person that has similar interests to ourselves.

We will use this 9-years-old github repo which still seems to work! Pythagoras himself is a lot older so I don't see any problem here.

``````npm install knear
``````

We are going to teach the algorithm that every point is a unique person, and all the features of that person are their interests. Then, by finding the one closest person, you can find your match.

``````import knn from 'knear'

const data = [
{ cooking: 1, painting: 10, name: 'erik' },
{ cooking: 0, painting: 1, name: 'bob' },
{ cooking: 10, painting: 1, name: 'ellen' },
{ cooking: 4, painting: 6, name: 'jill' },
{ cooking: 3, painting: 8, name: 'ramon' },
]

const machine = new knn.kNear(1)
for (let d of data) {
machine.learn([d.cooking, d.painting], d.name)
}
``````

``````const prediction = machine.classify([1,9])
``````

In this example we are only interested in cooking and painting (in any order), but you can add as many features as you want.