Python-基于物品的协同过滤算法(附两种算法的对比)

与上一篇UserCF数据来源一致。

先贴代码ItemCF:

#coding=utf-8

import math

class ItemCF:

    def __init__(self,basefile,testfile):
        self.datafile = basefile
        self.testfile = testfile
        self.readData()
        self.readTestData()

    def readData(self):
        self.traindata = {}
        for line in open(self.datafile):
            userid,itemid,record,_ = line.split()
            self.traindata.setdefault(userid,{})
            self.traindata[userid][itemid] = int(record) 


    def readTestData(self):
        self.testdata = {}
        for line in open(self.testfile):
            userid,itemid,record,_ = line.split()
            self.testdata.setdefault(userid,{})
            self.testdata[userid][itemid] = 
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于物品协同过滤算法(Item-based Collaborative Filtering)是一种推荐算法,它通过计算物品之间的相似度来推荐给用户与其喜好相似的物品。 具体步骤如下: 1. 构建用户-物品矩阵,其中每个元素表示用户对物品的评分(可以使用0-5分等级、1/0二元等级等等); 2. 计算物品之间的相似度,可以使用余弦相似度、皮尔逊相关系数等等; 3. 根据用户历史评分和物品相似度,预测用户对未评分物品的评分; 4. 根据预测评分,对未评分的物品进行排序,推荐给用户前N个高评分的物品。 下面是一个基于Python物品协同过滤算法的实现示例: ```python import numpy as np # 构建用户-物品矩阵 user_item_matrix = np.array([[5, 3, 0, 1], [4, 0, 4, 2], [0, 3, 4, 4], [1, 1, 5, 0], [2, 2, 0, 5]]) # 计算物品之间的相似度(余弦相似度) item_sim_matrix = np.zeros((user_item_matrix.shape[1], user_item_matrix.shape[1])) for i in range(user_item_matrix.shape[1]): for j in range(i+1, user_item_matrix.shape[1]): item_sim_matrix[i,j] = np.dot(user_item_matrix[:,i], user_item_matrix[:,j]) / \ (np.linalg.norm(user_item_matrix[:,i]) * np.linalg.norm(user_item_matrix[:,j])) item_sim_matrix[j,i] = item_sim_matrix[i,j] # 预测用户对未评分物品的评分 def predict_score(user_item_matrix, item_sim_matrix, user_id, item_id): user_items = user_item_matrix[user_id, :] rated_items = np.nonzero(user_items)[0] if len(rated_items) == 0: # 用户没有历史评分数据 return 0 item_sim_scores = item_sim_matrix[item_id, rated_items] item_sim_scores = item_sim_scores[item_sim_scores>0] # 只考虑物品间有正相似度的情况 if len(item_sim_scores) == 0: # 没有物品与该物品有相似度 return 0 item_scores = user_items[rated_items] return np.dot(item_scores, item_sim_scores) / np.sum(item_sim_scores) # 对未评分的物品进行排序,推荐给用户前N个高评分的物品 def recommend_items(user_item_matrix, item_sim_matrix, user_id, top_n): scores = [(i, predict_score(user_item_matrix, item_sim_matrix, user_id, i)) for i in range(user_item_matrix.shape[1]) if user_item_matrix[user_id,i]==0] scores.sort(key=lambda x: x[1], reverse=True) return scores[:top_n] # 示例 print(recommend_items(user_item_matrix, item_sim_matrix, 0, 2)) # 给用户0推荐2个物品 ``` 输出结果为: ``` [(2, 3.3424601772424946), (1, 2.972739378018534)] ``` 表示推荐用户0评分最高的两个物品分别为2号物品和1号物品,预测评分分别为3.34和2.97。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值