用Python2实现一个简单的推荐系统(用Python3会出现错误)

以下代码亲测修改后可以编译,如果出现错误请联系我:(代码虽有雷同,但是我已经修改正确率,绝对可用)

数据集在资源里面,请自行下载哈

import math
def load_matrix():
    matrix = {}
    f = open("d:\\train.csv")
    columns = f.readline().split(',')
    
    for line in f:
        scores = line.split(',')
        for i in range(len(scores))[1:]:
            matrix[(scores[0],columns[i])] = scores[i].strip("\n")
    return matrix

matrix = load_matrix()
print matrix

def sim_distance(matrix, row1, row2):
    columns = set(map(lambda l: l[1], matrix.keys()))
    si = filter(lambda l: matrix.has_key((row1, l)) and matrix[(row1, l)] != "" and matrix.has_key((row2, l))and matrix[(row2, l)] != "", columns)
    if len(si) == 0: return 0
    sum_of_distance = sum([pow(float(matrix[(row1, column)]) - float(matrix[(row2, column)]),2) for column in si])
    return 1 / (1 + math.sqrt(sum_of_distance))

print("\n")
print sim_distance(matrix, "Kai Zhou", "Shuai Ge")

def top_matches(matrix, row, similarity = sim_distance):
    rows = set(map(lambda l:l[0], matrix.keys()))
    scores = [(similarity(matrix, row, r), r) for r in rows if r != row]
    scores.sort()
    scores.reverse()
    return scores

person = "Kai Zhou"

print("\n")
print "top matc for:", person
print top_matches(matrix, person)

def transform(matrix):
    rows = set(map(lambda l: l[0], matrix.keys()))
    columns = set(map(lambda l :l[1], matrix.keys()))
    
    transform_matrix ={}
    for row in rows:
        for column in columns:
            transform_matrix[(column, row)] = matrix[(row, column)]
    return transform_matrix

trans_matrix = transform(matrix)

print("\n")
print "trans:", trans_matrix

film = "Friends"

print "\n"
print "top match for:", film
print top_matches(trans_matrix, film)

def get_recommendations(matrix, row, similarity = sim_distance):
    rows = set(map(lambda l: l[0], matrix.keys()))
    columns = set(map(lambda l : l[1], matrix.keys()))
    
    sum_of_column_sim = {}
    sum_of_column = {}
    
    for r in rows:
        if r == row: continue
        sim = similarity(matrix, row, r)
        if sim <=0 :continue
            
        for c in columns:
            if matrix[(r, c)] == "": continue
                        
            sum_of_column_sim.setdefault(c,0)
            sum_of_column_sim[c] += sim
            sum_of_column.setdefault(c,0)
            sum_of_column[c] += float(matrix[(r,c)]) * sim
            
    scores = [(sum_of_column[c] / sum_of_column_sim[c], c) for c in sum_of_column]
    scores.sort()
    scores.reverse()
    return scores

print "\n"
print get_recommendations(matrix, person)

 

程序运行结果如下:

{('Kai Zhou', 'Cougar Towm\n'): '2', ('mincat', 'Fargo'): '3.5', ('xiaoxiangrou', 'Fargo'): '2.5', ('alex', 'Friends'): '2.5', ('alex', 'Fargo'): '', ('fengzhi', 'Dawn of the Planet'): '', ('Mei Nv', 'RoboCop'): '3', ('mincat', 'Dawn of the Planet'): '1.5', ('Shuai Ge', 'Friends'): '', ('mincat', 'Friends'): '3', ('mincat', 'Bedtime Stories'): '3.5', ('alex', 'RoboCop'): '3.5', ('Shuai Ge', 'Cougar Towm\n'): '4.5', ('mincat', 'Cougar Towm\n'): '3', ('Shuai Ge', 'Bedtime Stories'): '3.5', ('fengzhi', 'Fargo'): '3.5', ('Shuai Ge', 'Dawn of the Planet'): '3', ('alex', 'Cougar Towm\n'): '4', ('mincat', 'RoboCop'): '5', ('alex', 'Bedtime Stories'): '3', ('Shuai Ge', 'Fargo'): '2.5', ('alex', 'Dawn of the Planet'): '', ('Shuai Ge', 'RoboCop'): '4', ('fengzhi', 'RoboCop'): '5', ('Mei Nv', 'Friends'): '3', ('Mei Nv', 'Bedtime Stories'): '4', ('Mei Nv', 'Fargo'): '2', ('Mei Nv', 'Cougar Towm\n'): '3', ('Kai Zhou', 'RoboCop'): '', ('xiaoxiangrou', 'RoboCop'): '3.5', ('Kai Zhou', 'Fargo'): '1', ('Mei Nv', 'Dawn of the Planet'): '2', ('xiaoxiangrou', 'Cougar Towm\n'): '3', ('fengzhi', 'Friends'): '3', ('Kai Zhou', 'Dawn of the Planet'): '', ('fengzhi', 'Bedtime Stories'): '4', ('xiaoxiangrou', 'Friends'): '2.5', ('Kai Zhou', 'Friends'): '4', ('Kai Zhou', 'Bedtime Stories'): '3', ('xiaoxiangrou', 'Dawn of the Planet'): '3', ('fengzhi', 'Cougar Towm\n'): '3', ('xiaoxiangrou', 'Bedtime Stories'): '3.5'}


0.252650308587


top matc for: Kai Zhou
[(0.3333333333333333, 'Mei Nv'), (0.29429805508554946, 'xiaoxiangrou'), (0.2857142857142857, 'alex'), (0.2553967929896867, 'mincat'), (0.252650308587072, 'Shuai Ge'), (0.2474401533514073, 'fengzhi')]


trans: {('Friends', 'alex'): '2.5', ('Bedtime Stories', 'alex'): '3', ('Dawn of the Planet', 'mincat'): '1.5', ('Cougar Towm\n', 'alex'): '4', ('Dawn of the Planet', 'fengzhi'): '', ('Dawn of the Planet', 'xiaoxiangrou'): '3', ('Fargo', 'Kai Zhou'): '1', ('Bedtime Stories', 'mincat'): '3.5', ('RoboCop', 'Kai Zhou'): '', ('Cougar Towm\n', 'xiaoxiangrou'): '3', ('Bedtime Stories', 'Shuai Ge'): '3.5', ('Bedtime Stories', 'fengzhi'): '4', ('RoboCop', 'mincat'): '5', ('Fargo', 'alex'): '', ('RoboCop', 'xiaoxiangrou'): '3.5', ('Dawn of the Planet', 'Shuai Ge'): '3', ('RoboCop', 'Mei Nv'): '3', ('Cougar Towm\n', 'fengzhi'): '3', ('Cougar Towm\n', 'Shuai Ge'): '4.5', ('Bedtime Stories', 'Mei Nv'): '4', ('Fargo', 'fengzhi'): '3.5', ('Dawn of the Planet', 'Mei Nv'): '2', ('Friends', 'Shuai Ge'): '', ('RoboCop', 'Shuai Ge'): '4', ('Friends', 'Kai Zhou'): '4', ('Bedtime Stories', 'Kai Zhou'): '3', ('Fargo', 'mincat'): '3.5', ('Cougar Towm\n', 'Mei Nv'): '3', ('Bedtime Stories', 'xiaoxiangrou'): '3.5', ('RoboCop', 'fengzhi'): '5', ('Friends', 'fengzhi'): '3', ('Friends', 'xiaoxiangrou'): '2.5', ('Fargo', 'Shuai Ge'): '2.5', ('Fargo', 'xiaoxiangrou'): '2.5', ('Friends', 'Mei Nv'): '3', ('Dawn of the Planet', 'Kai Zhou'): '', ('Friends', 'mincat'): '3', ('RoboCop', 'alex'): '3.5', ('Cougar Towm\n', 'Kai Zhou'): '2', ('Cougar Towm\n', 'mincat'): '3', ('Fargo', 'Mei Nv'): '2', ('Dawn of the Planet', 'alex'): ''}


top match for: Friends
[(0.3483314773547883, 'Dawn of the Planet'), (0.32037724101704074, 'Bedtime Stories'), (0.28172904669025317, 'Cougar Towm\n'), (0.2402530733520421, 'RoboCop'), (0.23582845781094, 'Fargo')]


[(3.9277923180363326, 'RoboCop'), (3.5884028580189917, 'Bedtime Stories'), (3.39829616075994, 'Cougar Towm\n'), (2.7952197928380182, 'Friends'), (2.7430523811470855, 'Fargo'), (2.369162549851047, 'Dawn of the Planet')]

参考此博客:https://blog.csdn.net/jiyang_1/article/details/50177281

但是对其代码进行了修改,并说明只能在Python2中使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值