user Collaborative Filtering

---恢复内容开始---

算法步骤:

1.计算用户相似度

2. 对于特定用户,选出k个最相似的用户,将这些用户评价过的前k好的物品推荐给该用户
 
用户相似度 度量
其中|N(u)|表示用户u评价过的物品的数量,|N(i)|为物品i的流行度,即物品i被多少用户评价过
这里物品流行度越高,它在相似度的度量上作用越小(两人都买了《新华字典》,并不是因为喜好)
 
实现:
1. 先获取每个物品 对应的 对其进行评价的用户的列表 iu
  如:商品A   ---  [用户2,用户3,用户4]
    商品B   ---  [用户1,用户5,用户2]
def item_user(self,data):

        iu = dict()

        groups = data.groupby([1])

        for item,group in groups:

            iu[item]=set(group.ix[:,0])

        

        return iu
2. 获取每个用户 对应的 评价过的物品的列表  ui
    如:用户2  ---  [商品A,商品B]
def user_item(self,data):

        ui = dict()

        groups = data.groupby([0])

        for item,group in groups:

            ui[item]=set(group.ix[:,1])

        

        return ui

3.遍历列表iu上的每一个商品,计算相似度

   比如对商品A,则用户2和用户3之间,相似度加   1/log(1+3)/sqrt(2*1)
   --3是商品A的流行度(3个用户评价过它),2*1表示用户2评价过的商品数乘以用户3评价过的商品数
def similarityMatrix(self):

        matrix=dict()

        N = dict()

        for item,users in self.iu.items():

            add = 1.0/(1+math.log(len(users)))

            for v in users:

                if v not in N:

                    N[v] = 1

                else:

                    N[v] += 1

                

                for u in users:

                    if v==u:

                        continue

                    if v not in matrix:

                        matrix[v] = dict();

                    

                    if u not in matrix[v]:

                        matrix[v][u] = 0;

                        

                    matrix[v][u]+=add;

                        

        for v in matrix.keys():

            for u in matrix[v].keys():

                matrix[v][u] /= math.sqrt(N[u]*N[v])

            matrix[v] = sorted(matrix[v].items(),lambda x,y:cmp(x[1],y[1]),reverse=True);

            

        return matrix

4.推荐

def getRecommend(self,user):

        userItem=self.ui[user]

        simiusers=self.simiMatrix[user]

        rank = dict()

        for i in range(len(simiusers)):

            if i>=self.k:

                break

            for item in self.ui[simiusers[i][0]]:

                if item in userItem:

                    continue

                if item not in rank:

                    rank[item]=0

                rank[item]+=simiusers[i][1]*1

        rank = sorted(rank.items(),lambda x,y:cmp(x[1],y[1]),reverse=True)[0:self.k];

        return [ele[0] for ele in rank]

---恢复内容结束---

你可能感兴趣的:(filter)