基于物品的协同过滤算法的原理:
基于物品的协同过滤算法给用户推荐那些和他们之前喜欢的物品相似的物品。不过ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算用户之间的相似度,也就是说物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B(这一点也是基于物品的协同过滤算法和基于内容的推荐算法最主要的区别)。同时,基于物品的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释,用于解释的物品都是用户之前喜欢的或者购买的物品。
算法主要分为两步:
一、计算物品之间的相似度;
二、根据物品的相似度和用户的历史行为给用户生成推荐列表;
第一步计算物品相似度根据公式:
N(i)表示喜欢物品i的用户数,N(j)表示喜欢物品j的用户数,两个求交表示同时喜欢i和j的用户数。
上面公式说明如果两个物品同时属于很多用户的兴趣列表,那么它们很有可能属于同一个领域,即具有很大的相似度。
第二步是在生成相似度基础上给用户生成推荐列表,公式为:
Pui表示用户u对物品i的感兴趣程度。求和公式下N(u)表示用户u感兴趣的物品,S(j,k)表示与物品j最相似的物品的集合。Wij表示i与j的相似度。rui表示用户u对物品i的兴趣(对于隐反馈数据集,r=1)。
参考代码:
# -*- coding: utf-8 -*-
'''
Created on 2017年9月18日
@author: Jason.F
'''
import math
import random
import os
from itertools import islice
class ItemBasedCF:
def __init__(self, datafile = None):
self.datafile = datafile
self.readData()
self.splitData()
def readData(self,datafile = None):
self.datafile = datafile or self.datafile
self.data = []
file = open(self.datafile,'r')
for line in islice(file, 1, None): #file.readlines():
userid, itemid, record = line.split(',&#