基於物品的協同過濾演算法 ItemCF

2021-09-29 09:27:05 字數 3199 閱讀 6488

余弦相似度公式:

其中

共現矩陣,記錄了同時愛好 i 和 j  的數量:

根據余弦相似度公式計算相似度:

# 初始化使用者評分資料

def inituserscore(self):

user_score_dict = ,

"b": ,

"c": ,

"d": ,

}return user_score_dict

# 計算item之間的相似度

def itemsimilarity(self):

itemsim = dict()

# 得到每個物品有多少使用者產生過行為

item_user_count = dict()

# 共現矩陣

count = dict()

for user, item in self.user_score_dict.items():

for i in item.keys():

item_user_count.setdefault(i, 0)

if self.user_score_dict[user][i] > 0.0:

item_user_count[i] += 1

for j in item.keys():

count.setdefault(i, {}).setdefault(j, 0)

if (

self.user_score_dict[user][i] > 0.0

and self.user_score_dict[user][j] > 0.0

and i != j

):count[i][j] += 1

# 共現矩陣 -> 相似度矩陣

for i, related_items in count.items():

itemsim.setdefault(i, dict())

for j, cuv in related_items.items():

itemsim[i].setdefault(j, 0)

itemsim[i][j] = cuv / item_user_count[i]

return itemsim

# 計算item之間的相似度 優化後

def itemsimilaritybest(self):

itemsim = dict()

# 得到每個物品有多少使用者產生過行為

item_user_count = dict()

# 共現矩陣

count = dict()

for user, item in self.user_score_dict.items():

for i in item.keys():

item_user_count.setdefault(i, 0)

if self.user_score_dict[user][i] > 0.0:

item_user_count[i] += 1

for j in item.keys():

count.setdefault(i, {}).setdefault(j, 0)

if (

self.user_score_dict[user][i] > 0.0

and self.user_score_dict[user][j] > 0.0

and i != j

):count[i][j] += 1

# 共現矩陣 -> 相似度矩陣

for i, related_items in count.items():

itemsim.setdefault(i, dict())

for j, cuv in related_items.items():

itemsim[i].setdefault(j, 0)

itemsim[i][j] = cuv / math.sqrt(item_user_count[i] * item_user_count[j])

return itemsim

# **使用者對item的評分

def preuseritemscore(self, usera, item):

score = 0.0

for item1 in self.items_sim[item].keys():

if item1 != item:

score += (

self.items_sim[item][item1] * self.user_score_dict[usera][item1]

)return score

# 為使用者推薦物品

def recommend(self, usera):

# 計算usera 未評分item的可能評分

user_item_score_dict = dict()

for item in self.user_score_dict[usera].keys():

# if self.user_score_dict[usera][item] <= 0:

user_item_score_dict[item] = self.preuseritemscore(usera, item)

return user_item_score_dict

if __name__ == "__main__":

ib = itemcf()

print(ib.recommend("c"))

基於物品的協同過濾演算法

核心思想 給使用者推薦那些和他們之前喜歡的物品相似的物品。不同於基於內容的推薦,基於物品的協同過濾中的相似主要是利用使用者行為的集體智慧型。相似度的計算計算相似度的實現方式是多種多樣的 對物品的喜愛程度並不能單純的使用二值屬性來評價,很多資料集包含了使用者對物品的詳細評分資料,將評分資料進一步引入到...

基於物品的協同過濾演算法

輸入 輸入 物品使用者行為矩陣,行為矩陣中的元素只有0和1,0代表行為的負類,1代表行為的正類。比如不喜歡與喜歡 不點贊與點讚 不收藏與收藏。輸出 輸出1 根據輸入可計算得到物品相似度矩陣 前言 基於物品的協同過濾演算法適用於物品數明顯小於使用者數的場景,適用於長尾物品豐富,使用者個性化需求強烈的領...

協同過濾演算法之基於item

現在要給所有的使用者推薦電影 首先我們要計算電影之間的相似度,相似度用皮爾遜相關來求電影之間的相似性。求出相識度如下表所示 比如我們要給a推薦電影,那麼根據a看過的電影與其他電影相似度,進行加權評分,得出要給a推薦的電影。如表是我們要給所有使用者推薦的電影,其中0代表該使用者看過電影,不需要推薦。從...