生活随笔
收集整理的這篇文章主要介紹了
推荐算法--时效性(05)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時效性
推薦系統應該考慮時間效應,因為用戶的興趣是有時間變化的。用戶一年前喜歡的東西現在不一定感興趣,相比于推薦過去喜歡的物品,推薦用戶近期喜歡的物品更有參考價值。而在新聞更是如此,推薦過去跟用戶興趣一致的新聞已經失去了意義。每個系統時間效應的大小不同,比如時間對電影的作用就沒有新聞那么明顯。要考慮時效性,必須加入時間參數,比如三元組(用戶,物品,時間)代替簡單的二元組(用戶,物品)。給定時間 T ,一般化的時間衰減公式為:
其中??是物品 i 最近的流行度,是時間衰減參數,對于時效性明顯的系統,應該越大。代碼實現如下:
def RecentPopularity (records, alpha, T) :ret = dict() for user, item ,tm in records:if tm > T:continue addToDict(ret , item, 1 /(1.0 + alpha * (T - tm))) return ret
時效性的 ItemCF 算法
前面提到的 ItemCF 算法有兩個核心組成,(1)物品相似度矩陣(2)基于用戶歷史行為做推薦
(1)加入時效性考慮,用戶在相隔很短的時間內喜歡的物品的相似度應該高于時間跨度比較大的用戶喜歡物品之間的相似度。原來的物品相似度公式為:
在得到時間信息(用戶對物品產生行為的時間)后,加入時間衰減函數的公式如下:
衰減項中,其中?是用戶u 對物品 i 產生行為的時間。f 函數的意義是,用戶對物品 i 和物品 j 產生行為的時間越遠,則??越小。可以找到很多數學衰減函數,比如
是時間衰減參數,它的取值在不同的系統中不同。系統用戶興趣變化的越快,應該越大。改進后的 ItemCF 算法的物品相似度矩陣計算代碼如下所示:
def ItemSimilarity (train, alpha) :C = dict() N = dict() for u,items in train.items():for i,tui in items.items(): N[i] += 1 for j, tuj in items.items():if i == j:continue C[i][j] += 1 / (1 + alpha * abs(tui - tuj)) W = dict() for i, related_items in C.items():for j, cij in related_items.items():W[i][j] = cij / math.sqrt(N[i] * N[j]) return W
除了考慮時間對物品相似度的影響,還要考慮時間信息對推薦預測的影響。一般來說,用戶最近的喜好應該和用戶興趣關系更大,需要將時間比較久的過去的喜歡的物品加上時間衰減函數。
其中??是現在的時間,?是用戶u 對 物品 i 評價過的時間。 代碼修改如下:
def Recommendation (train, user_id, W, K,t0) :rank = dict() ru = train[user_id] for i,pi in ru.items():rui, tui = pi for j, wji in sorted(W[i].items, key = itemgetter(1 ), reverse = True )[0 :K]:if j in ru.keys():continue rank[j] += rui * wji / (1 + beta * (t0 - tui)) return rank
時效性的 UserCF 算法
類似 ItemCF ,UserCF 也有兩個核心。(1)計算用戶相似度矩陣(2)基于相似用戶興趣做推薦
(1)加入時效性考慮,如果兩個用戶在比較近的時間里有共同的喜好,則比在不同時間段用戶有相同喜好的參考意義更大。回顧原來的用戶相似度公式如下:
其中 N(u) 是用戶 u 喜歡的物品集合,N(v) 是用戶 v 喜歡的物品集合。加入時間衰減因子修正公式如下:
其中??是用戶 u 喜歡物品 i 的時間,?是用戶 v 喜歡物品 i 的時間。代碼如下:
def UserSimilarity (train) :item_users = dict() for u, items in train.items():for i, tui in items.items():if i not in item_users:item_users[i] = dict() item_users[i][u] = tui C = dict() N = dict() for i, users in item_users.items():for u,tui in users.items():N[u] += 1 for v,tvi in user.items():if u == v:continue C[u][v] += 1 / (1 + alpha * abs(tui - tvi)) W = dict() for u, related_users in C.items():for v,cuv in related_users.items():W[u][v] = cuv / math.sqrt(N[u] * N[v]) return W
同樣地,處了考慮時間信息對用戶相似度矩陣的影響,還應該考慮時間信息對推薦算法的影響。找到相似的用戶后,認為推薦相似用戶近期感興趣的物品比推薦過去感興趣的物品更有意義。原來的 UserCF 算法中用戶 u 對物品 i 的興趣公式如下:
加入時間衰減函數后,改進 UserCF 推薦公式如下:
其中?代表現在的時間,?代表相似的用戶 v 喜歡物品 i 的時間。改進后的推薦算法代碼如下:
def Recommend (user, t0, train, W) :rank = dict() interacted_items = train[user] for v, wuv in sorted(W[user].items, key = itemgetter(1 ), reverse = True )[0 :K]:for i, pi in train[v].items:rvi, tvi = pi if i in interacted_items:continue rank[i] += wuv * rvi / (1 + alpha * (t0 - tvi)) return rank
總結
以上是生活随笔 為你收集整理的推荐算法--时效性(05) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。