余弦相似度公式:
其中
共現矩陣,記錄了同時愛好 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代表該使用者看過電影,不需要推薦。從...