天天看點

協同過濾推薦算法代碼實作建構資料集相似度計算User-Based CFItem-Based CF

協同過濾推薦算法代碼實作

  • 建構資料集
  • 相似度計算
  • User-Based CF
  • Item-Based CF

建構資料集

users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 使用者購買記錄資料集
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],
]
import pandas as pd

df = pd.DataFrame(datasets,
                  columns=items,
                  index=users)
print(df)
           

相似度計算

# 直接計算某兩項的傑卡德相似系數
from sklearn.metrics import jaccard_score
# 計算Item A 和Item B的相似度
print(jaccard_score(df["Item A"], df["Item B"]))
           
協同過濾推薦算法代碼實作建構資料集相似度計算User-Based CFItem-Based CF
協同過濾推薦算法代碼實作建構資料集相似度計算User-Based CFItem-Based CF
# 計算所有的資料兩兩的傑卡德相似系數
from sklearn.metrics.pairwise import pairwise_distances
# 計算使用者間相似度
user_similar = 1 - pairwise_distances(df.values, metric="jaccard")
user_similar = pd.DataFrame(user_similar, columns=users, index=users)
print("使用者之間的兩兩相似度:")
print(user_similar)
           
協同過濾推薦算法代碼實作建構資料集相似度計算User-Based CFItem-Based CF
# 計算物品間相似度
item_similar = 1 - pairwise_distances(df.values, metric="jaccard")
item_similar = pd.DataFrame(item_similar, columns=items, index=items)
print("物品之間的兩兩相似度:")
print(item_similar)
           

User-Based CF

import pandas as pd
import numpy as np
from pprint import pprint

users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 使用者購買記錄資料集
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)

# 計算所有的資料兩兩的傑卡德相似系數
from sklearn.metrics.pairwise import pairwise_distances
# 計算使用者間相似度
user_similar = 1 - pairwise_distances(df.values, metric="jaccard")
user_similar = pd.DataFrame(user_similar, columns=users, index=users)
print("使用者之間的兩兩相似度:")
print(user_similar)

topN_users = {}
# 周遊每一行資料
for i in user_similar.index:
    # 取出每一列資料,并删除自身,然後排序資料
    _df = user_similar.loc[i].drop([i])
    _df_sorted = _df.sort_values(ascending=False)

    top2 = list(_df_sorted.index[:2])
    topN_users[i] = top2

print("Top2相似使用者:")
pprint(topN_users)
           

這部分代碼由于python2和python3的沖突 還沒有改完

rs_results = {}
# 建構推薦結果
for user, sim_users in topN_users.items():
    rs_result = set()    # 存儲推薦結果
    for sim_user in sim_users:
        # 建構初始的推薦結果
        rs_result = rs_result.union(set(df.ix[sim_user].replace(0,np.nan).dropna().index))
    # 過濾掉已經購買過的物品
    rs_result -= set(df.ix[user].replace(0,np.nan).dropna().index)
    rs_results[user] = rs_result
print("最終推薦結果:")
pprint(rs_results)
           

Item-Based CF

import pandas as pd
import numpy as np
from pprint import pprint

users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 使用者購買記錄資料集
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)

# 計算所有的資料兩兩的傑卡德相似系數
from sklearn.metrics.pairwise import pairwise_distances
# 計算物品間相似度
item_similar = 1 - pairwise_distances(df.T, metric="jaccard")
item_similar = pd.DataFrame(item_similar, columns=items, index=items)
print("物品之間的兩兩相似度:")
print(item_similar)

topN_items = {}
# 周遊每一行資料
for i in item_similar.index:
    # 取出每一列資料,并删除自身,然後排序資料
    _df = item_similar.loc[i].drop([i])
    _df_sorted = _df.sort_values(ascending=False)

    top2 = list(_df_sorted.index[:2])
    topN_items[i] = top2

print("Top2相似物品:")
pprint(topN_items)

rs_results = {}
# 建構推薦結果
for user in df.index:    # 周遊所有使用者
    rs_result = set()
    for item in df.ix[user].replace(0,np.nan).dropna().index:   # 取出每個使用者目前已購物品清單
        # 根據每個物品找出最相似的TOP-N物品,建構初始推薦結果
        rs_result = rs_result.union(topN_items[item])
    # 過濾掉使用者已購的物品
    rs_result -= set(df.ix[user].replace(0,np.nan).dropna().index)
    # 添加到結果中
    rs_results[user] = rs_result

print("最終推薦結果:")
pprint(rs_results)
           

繼續閱讀