協同過濾推薦算法代碼實作
- 建構資料集
- 相似度計算
- 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"]))
# 計算所有的資料兩兩的傑卡德相似系數
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)
# 計算物品間相似度
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)