推薦系統與深度學習-學習筆記三

僅供學習使用
書本的第四章,推薦系統的基礎算法
要花一些時間理解公式了。

4.1 基於內容的推薦算法

4.1.1 基於內容的推薦算法基本流程

  1. 分析內容,提取特徵。屬性、標籤等
  2. 計算用戶偏好
  3. 召回
  4. 排序

4.1.2 基於內容推薦的特徵提取

  • 詞頻
  • TFIDF

4.2 基於協同的推薦算法

from 1992

4.2.1 基於物品的協同算法

核心思想:給用戶推薦那些,和他們之前購買的物品相似的物品

  1. 假設有以下數據,用戶購買記錄
    在這裏插入圖片描述

  2. 爲每一個用戶構建購買矩陣,展示物品的共現次數
    在這裏插入圖片描述

  3. 將所有用戶的物品購買共現次數累加起來,形成共現次數矩陣C
    在這裏插入圖片描述

  4. 計算矩陣N,每一個物品被購買的次數

物品 被購買次數
i1i_{1} n1n_{1}=2
i2i_{2} n2n_{2}=4
i3i_{3} n3n_{3}=1
i4i_{4} n4n_{4}=2
i5i_{5} n5n_{5}=1
  1. 計算物品的相似度矩陣W
    Wi,j=Ci,jNiNj W_{i,j}=\frac{C_{i,j}}{\sqrt{N_{i}*N_{j}}}
    得到:
    W1,2=C1,2n1n2=224=0.707 W_{1,2}=\frac{C_{1,2}}{\sqrt{n_{1}*n_{2}}}=\frac{2}{\sqrt{2*4}}=0.707
    W1,4=C1,4n1n4=122=0.5 W_{1,4}=\frac{C_{1,4}}{\sqrt{n_{1}*n_{4}}}=\frac{1}{\sqrt{2*2}}=0.5
    W1,5=C1,5n1n5=121=0.707 W_{1,5}=\frac{C_{1,5}}{\sqrt{n_{1}*n_{5}}}=\frac{1}{\sqrt{2*1}}=0.707
    W2,3=C2,3n2n3=141=0.5 W_{2,3}=\frac{C_{2,3}}{\sqrt{n_{2}*n_{3}}}=\frac{1}{\sqrt{4*1}}=0.5
    W2,4=C2,4n2n4=242=0.707 W_{2,4}=\frac{C_{2,4}}{\sqrt{n_{2}*n_{4}}}=\frac{2}{\sqrt{4*2}}=0.707
    W2,5=C2,5n2n5=141=0.5 W_{2,5}=\frac{C_{2,5}}{\sqrt{n_{2}*n_{5}}}=\frac{1}{\sqrt{4*1}}=0.5
  • 以上是基於共同喜歡物品的用戶列表計算
  • 還可以考慮基於餘弦的相似度計算
  • 對於熱門物品,可以加入懲罰機制
## ItemCF算法

import math

def ItemSimilarity(train):
    C = dict()  #
    N = dict()  # 書本被購買用戶數
    for u, item in train.items():
        for i in item.keys():
            if i not in N.keys():
                N[i] = 0
            N[i] += 1
            for j in item.keys():
                if i == j:
                    continue
                if i not in C.keys():
                    C[i] = dict()
                if j not in C[i].keys():
                    C[i][j] = 0
                C[i][j] += 1
                
    W = dict()
    for i, related_items in C.items():
        if i not in W.keys():
            W[i] = dict()
        for j, cij in related_items.items():
            W[i][j] = cij / math.sqrt(N[i] * N[j])
    return W


train_data = {
    'A': {'i1': 1, 'i2': 1, 'i4': 1},
    'B': {'i1': 1, 'i4': 1},
    'C': {'i1': 1, 'i2': 1, 'i5': 1},
    'D': {'i2': 1, 'i3': 1},
    'E': {'i3': 1, 'i5': 1},
    'F': {'i2': 1, 'i4': 1}
}

W = ItemSimilarity(train_data)

print(W['i1'])
print(W['i2'])
print(W['i3'])
print(W['i4'])
print(W['i5'])
## ItemCF-餘弦算法
import math

def ItemSimilarity_cos(train):
    C = dict()  #
    N = dict()  # 
    for u, item in train.items():
        for i in item.keys():
            if i not in N.keys():
                N[i] = 0
            N[i] += item[i] * item[i]
            for j in item.keys():
                if i == j:
                    continue
                if i not in C.keys():
                    C[i] = dict()
                if j not in C[i].keys():
                    C[i][j] = 0
                C[i][j] += item[i] * item[j]
                
    W = dict()
    for i, related_items in C.items():
        if i not in W.keys():
            W[i] = dict()
        for j, cij in related_items.items():
            W[i][j] = cij / (math.sqrt(N[i]) * math.sqrt(N[j]))
    return W


train_data = {
    'A': {'i1': 1, 'i2': 1, 'i4': 1},
    'B': {'i1': 1, 'i4': 1},
    'C': {'i1': 1, 'i2': 1, 'i5': 1},
    'D': {'i2': 1, 'i3': 1},
    'E': {'i3': 1, 'i5': 1},
    'F': {'i2': 1, 'i4': 1}
}

W = ItemSimilarity_cos(train_data)

print(W['i1'])
print(W['i2'])
print(W['i3'])
print(W['i4'])
print(W['i5'])

餘弦計算公式:
wi,j=NiNjNiNj w_{i,j}=\frac{N_{i}\cdot N{j}}{||N_{i}||||N_{j}||}

總結:
學習了基於物品的協同過濾算法。
實現步驟:

  1. 給每個用戶,計算相同物品的共現次數矩陣
  2. 合併所有用戶的物品共現次數矩陣,形成C
  3. 統計每個商品的出現次數,形成矩陣N
  4. 計算物品相似度矩陣W, 計算公式:

Wi,j=Ci,jNiNj W_{i,j}=\frac{C_{i,j}}{\sqrt{N_{i}*N_{j}}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章