推薦系統(基於關聯規則和基於協同過濾)

2021-09-29 17:07:24 字數 4380 閱讀 6843

① 找到和目標使用者興趣相似的使用者集合,三種常用的使用者相似度指標是皮爾遜相關係數、余弦相關係數和傑卡德相關係數

② 根據使用者相似度和相似個k個使用者的得分,加權計算分數,得到目標使用者對商品的評分

③找到這個集合中的使用者所喜歡的,並且目標使用者沒有聽說過的物品推薦給目標使用者。

注意:各相似使用者的評分應該減去均值進行計算,最終代入目標使用者的均值+加權得分為目標使用者的得分

#構建乙個基於使用者的推薦

def recommendation_mean(uid,iid,similar,k=10):

"""減去平均數的計算方法"""

score = 0

weight = 0

user_id_action = freq_matrix[uid,:] #使用者user_id 對所有商品的行為評分

item_id_action = freq_matrix[:,iid] #物品item_id 得到的所有使用者評分

user_id_similar = similar[uid,:] #使用者user_id 對所有使用者的相似度

similar_index = np.argsort(user_id_similar)[-(k+1):-1] #最相似的k個使用者的index(除了自己)

user_id_i_mean = np.sum(user_id_action)/user_id_action[user_id_action!=0].size#

for j in similar_index :

if item_id_action[j]!=0:

user_id_j_action = freq_matrix[j,:]

user_id_j_mean = np.sum(user_id_j_action)/user_id_j_action[user_id_j_action!=0].size

score += user_id_similar[j]*(item_id_action[j]-user_id_j_mean)

weight += abs(user_id_similar[j])

if weight==0:

return 0

else:

return user_id_i_mean + score/weight

#構建**函式

def predict_mean(similar):

"""**函式的功能: 傳入相似度矩陣, 通過對每個使用者和每個物品進行計算, 計算出乙個推薦矩陣"""

user_count = freq_matrix.shape[0]#使用者數

item_count = freq_matrix.shape[1]#商品數

predic_matrix = np.zeros((user_count,item_count))

for uid in range(user_count):

for iid in range(item_count):

if freq_matrix[uid,iid] == 0:

predic_matrix[uid,iid] = recommendation_mean(uid,iid,similar)

return predic_matrix

def get_recommendation(user_prediction_matrix,k=5):

# 將使用者**資料, 構建成乙個dataframe

recommendation_df = pd.dataframe(user_prediction_matrix,columns=dfpivot.columns,index=dfpivot.index)

# 將資料進行轉換

recommendation_df = recommendation_df.stack().reset_index()

# 對列名進行修改

recommendation_df.rename(columns=,inplace=true)

# 根據使用者id列進行分組

grouped = recommendation_df.groupby("使用者id")

# 得到分組後的前幾個資料

# 刪除掉使用者id列

topk = topk.drop(["使用者id"],axis=1)

# 刪除掉多餘的索引

topk.index = topk.index.droplevel(1)

# 索引重排

topk.reset_index(inplace=true)

return topk

① 計算物品之間的相似度;

其中,|n(i)|是喜歡物品i的使用者數,|n(j)|是喜歡物品j的使用者數,|n(i)&n(j)|是同時喜歡物品i和物品j的使用者數。

②根據物品的相似度和使用者的歷史行為給使用者生成推薦列表;

這裡的n(u)代表使用者喜歡的物品的集合,s(j,k)是和物品j最相似的的k個物品的集合,wij是物品j和i的相似度,r_ui代表使用者u對物品i的興趣。該公式的含義是,和使用者歷史上最感興趣的物品月相似的物品,越有可能在使用者的推薦列表中獲得比較高的排名。

項集(item):同時出現的項的集合,k項集即包含k個元素的項集;在本例中,是1項集,是2項集;

支援度:在事務資料庫 d 中所包含的專案集 x的所有事務數稱作項集 x 的支援數, 記為 x 。support( x)=|x|/|d|*100%

支援度衡量關聯規則重要性

置信度: 在事務資料庫 d 中支援項集 x 的事務中支援項集 y 的百分比稱作規則 xy 在事務資料庫 d 中的置信度。

置信度衡量關聯規則的準確度

提公升度:即在事件x出現的情況下事情y出現的概率,相較於整體情況下事件y出現的概率,提公升了多少倍。

lift(x->y) = lift(y->x) = conf(x->y)/supp(y) = conf(y->x)/supp(x) = p(xy)/(p(x)p(y))

1.假設資料庫為 d 由使用者設定最小支援度 min_sup, 首先產生頻繁項集 l;

2.再由頻繁 k- 1 項集通過連線步連線成為 k 項集( 在 d 中,每個候選 k 項集為 min_sup 的 k 項成為頻繁 k 項

集) ,驗證 l 是不是包含 k 項集中的所有 k-1 子集, 重複此步驟,直到找不到更高的頻繁專案集為止。

搜尋頻繁項集函式的偽**實現如下:

findfrequent(ratings,nowitemsets,minsupport)://ratings 使用者評

分counts = {}//存放項和對應計數的字典

for user,reviews in ratings:

for itemset in nowitemsets://遍歷現有項集

if itemset is subset of reviews://判斷是否是子集

for otheritems in reviews - itemset://遍歷未出

現在項集中的項

superset = itemset | set(otheritems)//生成超集

counts[superset] += 1//增加計數

return counts

抽取候選關聯規則的偽**如下:

candidaterules =[]//候選關聯規則列表

for itemsetlen, itemsetcounts in frequentitems:

for itemset in itemsetcounts.keys():

for conclusion in itemset://遍歷項集中的每一項把它作為結論

premise = itemset - set(conclusion)//項集中的其他項作為前提

candidaterules.add ((premise,conclusion))//向列表中新增候選規則

1.對資料庫的掃瞄次數過多;

2.apriori演算法會產生大量的中間項集;

3.採用唯一支援度;

基於關聯規則的推薦綜述

基於關聯規則的推薦思想類似基於物品的協同過濾推薦 啤酒與尿布 關聯分析中最有名的例子就是 啤酒與尿布 原來,在美國,婦女們經常會囑咐她們的丈夫下班以後給孩子買一點尿布回來,而丈夫在買完尿布後,大都會順手買回一瓶自己愛喝的啤酒 由此看出美國人愛喝酒 商家通過對一年多的原始交易記錄進行詳細的分析,發現了...

推薦系統 基於使用者和基於物品的協同過濾演算法的比較

首先回顧一下,協同過濾演算法主要有兩種,一種是基於使用者的協同過濾演算法 usercf 另一種是基於物品的協同過濾演算法 itemcf 基於使用者的協同過濾演算法主要有兩步 1 找到和目標使用者興趣相似的使用者集合 2 找到這個集合中的使用者喜歡的,且目標使用者沒有聽說過的物品推薦給目標使用者。基於...

推薦系統 基於使用者的協同過濾系統

1.什麼是基於使用者的協同過濾演算法?簡單來說,給使用者推薦和她興趣相投的其她使用者喜歡的物品。2.實施步驟 a.構建使用者的特徵維度 b.求使用者間的相識度 c.計算推薦結果 還是通過乙個例子來說吧!需要注意的點 1.在計算使用者相似度的前,我們需要構建使用者的特徵矩陣,這個特徵矩陣不能用維度為電...