电影推荐实例(python源代码)

# -*- coding: utf-8 -*-
"""
Created on Tue Sep 29 18:50:33 2015


@author: tanyouwei
"""




from math import sqrt
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, "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} 
        } 


#pearson 距离  
def pearson(rate1,rate2): 
    sum_xy = 0
    sum_x=0
    sum_y=0
    sum_x2=0
    sum_y2=0
    n=0  
    for key in rate1: 
        if key in rate2: 
            n+=1
            x=rate1[key] 
            y=rate2[key] 
            sum_xy += x*y 
            sum_x +=x 
            sum_y +=y 
            sum_x2 +=x*x 
            sum_y2 +=y*y 
    #计算距离     
    if n==0: 
        return 0
    else: 
        sx=sqrt(sum_x2-(pow(sum_x,2)/n))
        sy=sqrt(sum_y2-(pow(sum_y,2)/n))
        if sx<>0 and sy<>0:
            denominator=(sum_xy-sum_x*sum_y/n)/sx/sy
        else:
            denominator=0
    return denominator


#返回最近距离用户 
def computeNearestNeighbor(username,users): 
    distances = [] 
    for key in users: 
        if key<>username: 
            distance = pearson(users[username],users[key]) 
            distances.append((distance,key))  
    distances.sort()           
    return distances
    
'''
#推荐一人
def recommend(username,users): 
    #获得最近用户的name     
    nearest = computeNearestNeighbor(username,users)[0][1]
    recommendations =[] 
    #得到最近用户的推荐列表     
    neighborRatings = users[nearest] 
    for key in neighborRatings:
        if not key in users[username]: 
            recommendations.append((key,neighborRatings[key])) 
    recommendations.sort(key=lambda rat:rat[1], reverse=True) 
    return recommendations


if __name__ == '__main__': 
    #print computeNearestNeighbor('Hailey',users)     
    print recommend('Hailey', users)


'''




#推荐多人
def recommend(username,users):
    #获得最近用户的name
    near=[]
    for i in range(3):
        nearest = computeNearestNeighbor(username,users)[i][1]
        near.append(nearest)
    recommendations = []
    #得到最近用户的推荐列表
    for i in near:
        neighborRatings = users[i]
        for key in neighborRatings:
            if not key in users[username]:
                recommendations.append((key,neighborRatings[key]))
    recommendations.sort(key=lambda rat:rat[1], reverse=True)
    return recommendations


if __name__ == '__main__': 
    #print computeNearestNeighbor('Hailey',users)
    for i in users:
        print '{username} 的推荐电影是: '.format(username=i)
        print recommend(i, users)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值