user Collaborative Filtering

---恢復內容開始---算法

算法步驟:ui

1.計算用戶類似度spa

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上的每個商品,計算類似度code

   好比對商品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.推薦blog

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]

---恢復內容結束---get

相關文章
相關標籤/搜索