日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

推荐算法--时效性(05)

發布時間:2023/12/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 推荐算法--时效性(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[i][j] 矩陣
  • C = dict()
  • N = dict()
  • for u,items in train.items():
  • for i,tui in items.items(): #原來是沒有 tui 的
  • N[i] += 1
  • for j, tuj in items.items():
  • if i == j:continue
  • C[i][j] += 1 / (1 + alpha * abs(tui - tuj))
  • #計算 W[i][j]
  • 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[u][v]
  • 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[u][v]
  • 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] # 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。