算法筆記(2)-推薦系統(tǒng)之協(xié)同過濾算法

本節(jié)講述推薦系統(tǒng)之協(xié)同過濾算法,協(xié)同過濾算法包括兩類,一種基于用戶的協(xié)同過濾算法,另外一種基于項的協(xié)同過濾算法。


基于用戶的協(xié)同過濾算法

通過相似用戶進行推薦,給用戶推薦和他興趣形似的其他用戶喜歡的物品。

算法步驟如下:

1.用戶-商品數據轉換成用戶-商品矩陣;

2.計算用戶-商品矩陣中的用戶之前的相似度;

3.利用用戶之間的相似度為用戶中沒有打分的項打分;

代碼實現如下:

def user_based_recommend(data, w, user):
    '''基于用戶相似性為用戶user推薦商品
    input:  data(mat):用戶商品矩陣
            w(mat):用戶之間的相似度
            user(int):用戶的編號
    output: predict(list):推薦列表
    '''
    m, n = np.shape(data)
    interaction = data[user, ]  # 用戶user與商品信息
    
    # 1、找到用戶user沒有互動過的商品
    not_inter = []
    for i in range(n):
        if interaction[0, i] == 0:  # 沒有互動的商品
            not_inter.append(i)
    
    # 2、對沒有互動過的商品進行預測
    predict = {}
    for x in not_inter:
        item = np.copy(data[:, x])  # 找到所有用戶對商品x的互動信息
        for i in range(m):  # 對每一個用戶
            if item[i, 0] != 0:  # 若該用戶對商品x有過互動
                if x not in predict:
                    predict[x] = w[user, i] * item[i, 0]
                else:
                    predict[x] = predict[x] + w[user, i] * item[i, 0]
    # 3、按照預測的大小從大到小排序
    return sorted(predict.items(), key=lambda d:d[1], reverse=True)

基于項的協(xié)同過濾算法

通過相似項進行推薦,為用戶推薦與其打過分的項相似的項。

算法步驟如下:

1.用戶-商品數據轉換成商品-用戶矩陣;

2.計算商品-用戶矩陣中的商品之前的相似度;

3.利用商品之間的相似度為用戶中沒有打分的項打分;

代碼實現如下:

def item_based_recommend(data, w, user):
    '''基于商品相似度為用戶user推薦商品
    input:  data(mat):商品用戶矩陣
            w(mat):商品與商品之間的相似性
            user(int):用戶的編號
    output: predict(list):推薦列表
    '''
    m, n = np.shape(data) # m:商品數量 n:用戶數量
    interaction = data[:,user].T # 用戶user的互動商品信息
    
    # 1、找到用戶user沒有互動的商品
    not_inter = []
    for i in range(n):
        if interaction[0, i] == 0: # 用戶user未打分項
            not_inter.append(i)
            
    # 2、對沒有互動過的商品進行預測
    predict = {}
    for x in not_inter:
        item = np.copy(interaction) # 獲取用戶user對商品的互動信息
        for j in range(m): # 對每一個商品
            if item[0, j] != 0: # 利用互動過的商品預測
                if x not in predict:
                    predict[x] = w[x, j] * item[0, j]
                else:
                    predict[x] = predict[x] + w[x, j] * item[0, j]
    # 按照預測的大小從大到小排序
    return sorted(predict.items(), key=lambda d:d[1], reverse=True)

相似度的度量方法有以下三種:



1)歐式距離



2)皮爾遜相關系數

3)余弦相似度


?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容