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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

协同过滤算法之通过Jaccard相似度计算推荐结果原理及代码实现

發布時間:2024/3/24 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协同过滤算法之通过Jaccard相似度计算推荐结果原理及代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • Jaccard相似度介紹
    • Jaccard相似度計算推薦結果代碼及實現
      • 基本介紹
      • Jaccard相似度計算代碼
      • 協同過濾推薦代碼實現

Jaccard相似度介紹

  • 兩個集合的交集元素個數在并集中所占的比例, 非常適用于布爾向量表示
  • 分子是兩個布爾向量做點積計算, 得到的就是交集元素的個數
  • 分母是兩個布爾向量做或運算, 再求元素和
  • 杰卡德相似度適用于隱式反饋數據(0,1布爾值),主要應用于是否收藏,是否點擊,是否加購物車。

簡單地來說就是交集/并集
J(A,B)=|A∩B|/|A∪B|

Jaccard相似度計算推薦結果代碼及實現

基本介紹

  • 我們通過簡單的一個DataFrame例子來實現其算法,最終輸出結果。通常有兩種協同過濾:基于用戶的協同過濾推薦(User-based CF)、基于物品的協同過濾推薦(Item-based CF)。這里我們會構建一個用戶+物品的DataFrame。

  • 這里為了方便,可以使用jupyternotebook進行書寫

import numpy as np import pandas as pdusers = ["Thomas", "Cauchy", "Alice", "Bob", "Alex"] items = ["iPad", "MacBook", "iPhone", "iWatch", "AirPods"] #用戶購買記錄數據集 datasets = [[1,0,1,1,0],[1,0,0,1,1],[1,0,1,0,0],[0,1,0,1,1],[1,1,1,0,1], ]df = pd.DataFrame(datasets,columns=items,index=users) print(df) print(df.index) print(df.columns)

Jaccard相似度計算代碼

#導入杰卡德相似度 from sklearn.metrics import jaccard_score #計算iPad和MacBook的相似度 jaccard_score(df['iPad'],df['MacBook']) #結果 0.2 #計算所有的數據兩兩的杰卡德相似系數 from sklearn.metrics.pairwise import pairwise_distances #計算所有的數據兩兩的杰卡德相似系數(1-jaccard距離就是相似度) user_similar = 1-pairwise_distances(df.values,metric='jaccard') user_similar = pd.DataFrame(user_similar,columns=users,index = users) #用戶相似度 user_similar

#以相同的思路我們來試著做一下物品的相似度(記住物品需要先進行轉置才可以計算) item_similar = 1-pairwise_distances(df.T.values,metric='jaccard') item_similar = pd.DataFrame(item_similar,columns=items,index = items) item_similar

協同過濾推薦代碼實現

  • 通過計算杰卡德相似度,已經得出了用戶相似度,接下來我們就需要進行協同過濾推薦了。
  • 實現協同過濾推薦有2個步驟:
  • 找出最相似的人或物品:TOP-N相似的人或物品
  • #為每一個用戶找到最相似的2個用戶#創建空的dict保存最終結果 topN_users = {} #遍歷每一行數據 for i in user_similar.index:#取出每一列數據, 刪除自己,按照相似度排序(降序)_df = user_similar.loc[i].drop([i])_df_sorted = _df.sort_values(ascending = False)#排序之后切片取出前兩個值,傳入空dicttop2 = list(_df_sorted.index[:2])topN_users[i] = top2

  • 根據相似的人或物品產生推薦結果
  • #根據topn的相似用戶構建推薦結果 rs_results={} for user,sim_users in topN_users.items():rs_result = set() #為每一用戶保存推薦結果for sim_user in sim_users:#將0替換為控制,去掉空值,做union聯合rs_result = rs_result.union(set(df.loc[sim_user].replace(0,np.nan).dropna().index))#過濾掉已經購買的商品(得到的結果需要減去user已經購買過的)rs_result -= set(df.loc[user].replace(0,np.nan).dropna().index)#將結果傳入到dict中rs_results[user] = rs_result

    總結

    以上是生活随笔為你收集整理的协同过滤算法之通过Jaccard相似度计算推荐结果原理及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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