No need for algorithms, or recommendation systems. You have:
For each user a have a bunch of features.
As long as they're numeric, or can be made numeric (e.g. aggregating the values or one-hot-encoding them), you already have distances. What you may not have is the proper variance across the feature space, i.e. features are scaled in different orders of magnitude.
If you know the exact weight of the features in relation to user similarity you may try to tune (scale) the features by hand. Otherwise you can simply make every feature have mean 0 and standard deviation 1. In other words, per feature subtract the mean from all points and divide by the current standard deviation. (sklearn
has a StandardScaler
that does exactly that.)
In the scaled dataset, from any point (user), you can just calculate euclidean distance to any other point. And the closest the points the more similar the pair of user will be. i.e. top $N$ similar users to a user are just the $N$ closest points.
Plain euclidean distance works in many cases. If euclidean distance does not work for the problem at hand, then you can explore more complex possibilities: starting from manhattan distance, through minkowski distance (combination of euclidean and manhattan distances).