I'm trying to use Cosine Similarity in Python to compare users, but can't seem to get it quite right.
from math import*
ratings={'Mr. Perfect': {1: 1, 2: 2, 3: 1, 4: 3, 5: 3, 6: 1, 7: 3, 8: 1, 9: 2},
'The Progressive': {1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3},
'Mr. Villain': {1: 3, 2: 3, 3: 3, 4: 3, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3}}
def square_rooted(x):
return round(sqrt(sum([a*a for a in x])),3)
def cosine_similarity(x,y):
input1 = {}
input2 = {}
vector2 = []
vector1 =[]
if len(x) > len(y):
input1 = x
input2 = y
else:
input1 = y
input2 = x
vector1 = list(input1.values())
for k in input1.keys(): # Normalizing input vectors.
if k in input2:
vector2.append(float(input1[k]))
else :
vector2.append(float(0))
numerator = sum(a*b for a,b in zip(vector2,vector1))
denominator = square_rooted(vector1)*square_rooted(vector2)
return round(numerator/float(denominator),3)
print("Similarity between Perfect and Progressive")
print (cosine_similarity(ratings['Mr. Perfect'],ratings['The Progressive']))
print("Similarity between Villain and Progressive")
print (cosine_similarity(ratings['Mr. Villain'],ratings['The Progressive']))
Basically, found the formula here https://stackoverflow.com/questions/35980910/return-similar-score-based-on-two-dictionaries-similarity-in-python but I keep getting results of 1. Any ideas would be helpful!