协同过滤

  • 协同过滤-乐队评级
#!/usr/bin/python
# -*- coding: UTF-8 -*-

users={"Angelica":{"Blues Traveler":3.5,"Broken Bells":2.0,"Norah Jones":4.5,"Phoenix":5.0,"Slightly Stoopid":1.5,"The Strokes":2.5,"Vampire Weekend":2.0},

       "Bill":{"Blues Traveler":2.0,"Broken Bells":3.5,"Deadmau5":4.0,"Phoenix":2.0,"Slightly Stoopid":3.5,"Vampire Weekend":3.0},

       "Chan":{"Blues Traveler":5.0,"Broken Bells":1.0,"Deadmau5":1.0,"Norah Jones":3.0,"Phoenix":5.0,"Slightly Stoopid":1.0},

       "Dan":{"Blues Traveler":3.0,"Broken Bells":4.0,"Deadmau5":4.5,"Phoenix":3.0,"Slightly Stoopid":4.5,"The Strokes":4.0,"Vampire Weekend":2.0},

       "Hailey":{"Broken Bells":4.0,"Deadmau5":1.0,"Norah Jones":4.0,"The Strokes":4.0,"Vampire Weekend":1.0},

       "Jordyn":{"Broken Bells":4.5,"Deadmau5":4.0,"Norah Jones":5.0,"Phoenix":5.0,"Slightly Stoopid":4.5,"The Strokes":4.0,"Vampire Weekend":4.0},

       "Sam":{"Blues Traveler":5.0,"Broken Bells":2.0,"Norah Jones":3.0,"Phoenix":5.0,"Slightly Stoopid":4.0,"The Strokes":5.0},

       "Veronica":{"Blues Traveler":3.0,"Norah Jones":5.0,"Phoenix":4.0,"Slightly Stoopid":2.5,"The Strokes":3.0}
}

def manhattan(rating1,rating2):
    """Computes the Manhattan distance,Both rating1 and rating2 are
    dictionaries of the form {'The Strokes':3.0,'Slightly Stoopid':2.5 ...}"""
    distance = 0
    for key in rating1:
        if key in rating2:
            distance += abs(rating1[key]-rating2[key])
    return distance

print manhattan(users['Hailey'],users['Veronica'])
print manhattan(users['Hailey'],users['Jordyn'])

print

def computeNearestNeighbor(username,users):
    """creates a sorted list of users based on their distance to username"""
    distances = []
    for user in users:
        if user != username:
            distance = manhattan(users[user],users[username])
            distances.append((distance,user))
    # sort based on distance -- closest first
    distances.sort()
    return distances

print computeNearestNeighbor("Hailey",users)
print

def recommend(username,users):
    """Give list of recommendations"""
    # first find nearest neighbor rated that user didn't
    nearest = computeNearestNeighbor(username,users)[0][1]
    recommendations = []
    # now find bands neighbor rated that user didn't
    neighborRatings = users[nearest]
    userRatings = users[username]
    for artist in neighborRatings:
        if not artist in userRatings:
            recommendations.append((artist,neighborRatings[artist]))
    # using the fn sorted for variety - sort is more efficient
    return sorted(recommendations,key=lambda artistTuple:artistTuple[1],reverse=True)

print recommend('Hailey',users)
print recommend('Sam',users)
print recommend('Angelica',users)

你可能感兴趣的:(协同过滤)