天天看点

python实现ItemCF算法

毕设要用到推荐算法,于是今天在在网上查找资料,找到这位仁兄的资料https://blog.csdn.net/Gamer_gyt/article/details/51346159

#!/usr/sbin/env python
# -*- coding:utf-8 -*-

import math
# ItemCF算法
def ItemSimilarity(train):
    # 物品-物品的共同矩阵
    C = dict()
    # 物品被多少个不同用户购买
    N = dict()
    for u, items in train.items():
        for i in items.keys():
            N.setdefault(i, 0)
            N[i] += 1
            C.setdefault(i, {})
            for j in items.keys():
                if i == j:
                    continue
                C[i].setdefault(j, 0)
                C[i][j] += 1
    # 计算相似度矩阵
    W = dict()
    for i, related_items in C.items():
        W.setdefault(i, {})
        for j, cij in related_items.items():
            W[i][j] = cij / math.sqrt(N[i] * N[j])
    return W

# 推荐前K个用户
def Recommend(train, user_id, W, K):
    rank = dict()
    action_item = train[user_id]
    for item, score in action_item.items():
        for j, wj in sorted(W[item].items(), key=lambda x:x[1], reverse=True)[0:K]:
            if j in action_item.keys():
                continue
            rank.setdefault(j, 0)
            rank[j] += score * wj
    print rank.items()
    return sorted(rank.items(), key=lambda x:x[1], reverse=True)

train = dict()
for line in open('requests.txt', 'r'):
    user, item, score = line.strip().split(",")
    train.setdefault(user, {})
    train[user][item] = float(score)
W = ItemSimilarity(train)
result = Recommend(train, '5', W, 3)
print result
           

requests.txt

1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.0
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0
           

将数据整理到excel表中

python实现ItemCF算法

最后验证输出结果为:

分别对1,2,3,4,5用户进行验证,发现可以推荐出最适合的,完成。

python实现ItemCF算法

最后还是感谢这位仁兄了https://blog.csdn.net/Gamer_gyt/article/details/51346159

初次研究算法这方面,有不足之处还请指导。