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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于用户行为分析的推荐算法

發(fā)布時(shí)間:2024/3/26 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于用户行为分析的推荐算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 基于用戶行為分析的推薦算法
    • 用戶行為數(shù)據(jù)簡介
    • 用戶行為分析
      • 用戶活躍度和物品流行度的分布
      • 用戶活躍度和物品流行度的關(guān)系
    • 實(shí)驗(yàn)設(shè)計(jì)和算法測評
      • 數(shù)據(jù)集
      • 實(shí)驗(yàn)設(shè)計(jì)
      • 評測指標(biāo)
    • 基于領(lǐng)域的算法
      • 基于用戶的協(xié)同過濾算法
    • 源代碼實(shí)現(xiàn)

基于用戶行為分析的推薦算法

這種算法稱為協(xié)同過濾算法,協(xié)同過濾是指用戶可以齊心協(xié)力,通過不斷的和網(wǎng)站互動(dòng),使自己的推薦列表能夠過濾掉自己不感興趣的物品,從而越來越滿足自己的需求。

用戶行為數(shù)據(jù)簡介

用戶行為數(shù)據(jù)最簡單的存在形式是日志。很多互聯(lián)網(wǎng)業(yè)務(wù)會(huì)把原始日志按照用戶行為匯總成為會(huì)話日志(session log),其中每個(gè)會(huì)話代表一次用戶行為和對應(yīng)的服務(wù),如展示日志,點(diǎn)擊日志。

用戶行為在個(gè)性化推薦系統(tǒng)中一般分為顯性反饋行為(explicit feedback)和隱性反饋行為(implicit feedback)。explicit feedback包括用戶明確表示對物品的喜好的行為。implicit feedback 是指那些不能明確反應(yīng)用戶喜好的行為。與explicit feedback相比,隱性反饋雖然不明確,但是數(shù)量龐大。

顯性反饋數(shù)據(jù)隱性反饋數(shù)據(jù)
用戶興趣明確不明確
數(shù)量很少龐大
存儲(chǔ)數(shù)據(jù)庫分布式文件系統(tǒng)
實(shí)時(shí)讀取實(shí)時(shí)有延遲
正負(fù)反饋都有只有正反饋

用戶行為分析

在利用用戶行為數(shù)據(jù)設(shè)計(jì)推薦算法之前,首先需要對用戶行為數(shù)據(jù)進(jìn)行分析,了解數(shù)據(jù)中蘊(yùn)含的一般規(guī)律,這樣才能對算法的設(shè)計(jì)起到指導(dǎo)作用。以下用戶行為數(shù)據(jù)的普遍規(guī)律。

用戶活躍度和物品流行度的分布

互聯(lián)網(wǎng)上很多數(shù)據(jù)分布都滿足power Law也稱長尾分布。

f(x)=αxkf(x)=\alpha x^kf(x)=αxk
研究發(fā)現(xiàn),用戶行為數(shù)據(jù)也滿足power law分布,fi(k)f_i (k)fi?(k)為被k個(gè)用戶產(chǎn)生行為的物品數(shù),fu(k)f_u(k)fu?(k)為對k個(gè)物品產(chǎn)生行為的用戶數(shù)。即
fi(k)=αikiβf_i(k)=\alpha_i k^\beta_ifi?(k)=αi?kiβ?fu(k)=αukuβf_u(k)=\alpha_u k^\beta_ufu?(k)=αu?kuβ?

用戶活躍度和物品流行度的關(guān)系

根據(jù)這個(gè)規(guī)律可以發(fā)現(xiàn),用戶越活躍,越傾向于冷門物品。

僅僅基于用戶行為數(shù)據(jù)設(shè)計(jì)的推薦算法一般稱為協(xié)同過濾算法。學(xué)術(shù)界對協(xié)同過濾算法提出了很多方法,如:基于領(lǐng)域的方法,隱語義模型、基于圖的隨機(jī)游走算法等。應(yīng)用最廣泛的是:

  • 基于用戶的協(xié)同過濾算法 這種算法給用戶推薦和他興趣相似的其他用戶喜歡的物品
  • 基于物品的協(xié)同過濾算法 這種算法給用戶推薦和他之前喜歡的物品相似的物品

實(shí)驗(yàn)設(shè)計(jì)和算法測評

數(shù)據(jù)集

采用GroupLens提供的MovieLens數(shù)據(jù)集,該數(shù)據(jù)集包含3個(gè)不同版本,選用中等大小的數(shù)據(jù)集,包含6000多用戶對4000多部電影的100萬條評分。該數(shù)據(jù)集是一個(gè)評分?jǐn)?shù)據(jù)集。著重研究隱反饋數(shù)據(jù)集中的TopN推薦問題,因此忽略數(shù)據(jù)集中的評分紀(jì)錄。TopN的推薦任務(wù)是預(yù)測用戶會(huì)不會(huì)給某部電影評分,而不是預(yù)測用戶在準(zhǔn)備對電影評分的前提下給電影評多少分。

實(shí)驗(yàn)設(shè)計(jì)

首先,將用戶行為數(shù)據(jù)集均勻隨機(jī)分成M份(M=8),挑選一份作為測試集,其余的作為訓(xùn)練集。在訓(xùn)練集上建立用戶興趣模型,并在測試集上對用戶行為進(jìn)行預(yù)測,統(tǒng)計(jì)相應(yīng)的評測指標(biāo)。為了保證評測指標(biāo)并不是過擬合的結(jié)果,需要進(jìn)行M次試驗(yàn),并且每次都使用不同的測試集。然后取M次試驗(yàn)的評測指標(biāo)的平均值作為最終的評測指標(biāo)。

下面代碼為將用戶評分文件中的數(shù)據(jù)分成訓(xùn)練集合測試集的過程。

def get_datas(input_file,M,k,seed) : #將用戶評分文件中的數(shù)據(jù)分成訓(xùn)練集合測試集"""get rating informationArgs: input_file:user rating fileM: 數(shù)據(jù)分成的份數(shù)k: 實(shí)驗(yàn)選取的測試集seed: 隨機(jī)種子Return: two listsone:train datasanother:test datas"""if not os.path.exists(input_file) :return [],[]linenum = 0train_data = []test_data = []fp = open(input_file)random.seed(seed)for line in fp :if linenum == 0 :linenum += 1continue item = line.strip().split(',')if len(item) < 4:continueif random.randint(0,M) == k :test_data.append([item[0],item[1],item[2]])else :train_data.append([item[0],item[1],item[2]])fp.close()return train_data,test_data

這里,每次選取不同的k和相同的隨機(jī)種子seed,進(jìn)行M次實(shí)驗(yàn)就可以得到M個(gè)不同的訓(xùn)練集和測試集,然后分別進(jìn)行實(shí)驗(yàn),用M次實(shí)驗(yàn)的平均值作為最后的評測指標(biāo)。這樣做主要就是為了防止某次實(shí)驗(yàn)結(jié)果是過擬合的結(jié)果(overf itting)。

評測指標(biāo)

  • 準(zhǔn)確率/召回率
    對用戶u推薦N個(gè)物品,記為(R(u)R(u)R(u)),令用戶在測試集上喜歡的物品集合為(T(u)T(u)T(u)),然后通過準(zhǔn)確率/召回率評測推薦算法的精度:
    recall=∑u∣R(u)andT(u)∑u∣T(u)∣recall=\frac{\sum_u |R(u) and T(u)}{\sum_u |T(u)|} recall=u?T(u)u?R(u)andT(u)?
    precision=∑u∣R(u)andT(u)∑u∣R(u)∣precision=\frac{\sum_u |R(u) and T(u)}{\sum_u |R(u)|} precision=u?R(u)u?R(u)andT(u)?
    召回率描述有多少比例的用戶-物品評分紀(jì)錄包含在最終的推薦列表中,而準(zhǔn)確率描述最終的推薦列表中有多少比例是發(fā)生過的用戶-評分紀(jì)錄。
  • 覆蓋率
    覆蓋率反映推薦算法發(fā)掘長尾的能力,覆蓋率越高,說明推薦算法越能夠?qū)㈤L尾中的物品推薦給用戶。
    Coverage=?u∈UR(u)ICoverage=\frac{\bigcup_{u\in U}R(u) }{I}Coverage=I?uU?R(u)?
  • 新穎度
    用推薦列表中的物品的平均流行度度量推薦結(jié)果的新穎度,如果推薦出的物品都很熱門,說明推薦的新穎度較低,否則說明推薦結(jié)果比較新穎。
  • 基于領(lǐng)域的算法

    基于用戶的協(xié)同過濾算法

    基于用戶的協(xié)同過濾算法就是將興趣相同的人喜歡的物品推薦給你。
    包括兩個(gè)步驟:

  • 找到和目標(biāo)用戶興趣相同的用戶集合
  • 找到這個(gè)集合中的用戶喜歡的,且目標(biāo)用戶沒有聽過的物品推薦給目標(biāo)用戶
  • 步驟1的關(guān)鍵就是計(jì)算兩個(gè)用戶的興趣相似度。這里,主要利用行為的相似度計(jì)算興趣的相似度。給定用戶uuuvvv,令N(u)N(u)N(u)為用戶uuu曾經(jīng)有過正反饋的物品集合,令N(v)N(v)N(v)為用戶vvv曾經(jīng)有過正反饋的物品集合。計(jì)算方法有兩種:

    • jaccard公式 :Wuv=∣N(u)?N(v)∣∣N(u)?N(v)∣W_{uv}=\frac{|N(u)\bigcap N(v)|}{|N(u)\bigcup N(v)|}Wuv?=N(u)?N(v)N(u)?N(v)?
    • 通過余弦相似度計(jì)算 :Wuv=∣N(u)?N(v)∣∣N(u)∣∣N(v)∣W_{uv}=\frac{|N(u)\bigcap N(v)|}{\sqrt{|N(u)||N(v)|}}Wuv?=N(u)N(v)?N(u)?N(v)?

    源代碼實(shí)現(xiàn)

    import os import math import numpy as np import random NumOfMovies = 9000 NumOfUsers = 700def get_data(file):"""讀取數(shù)據(jù)"""if not os.path.exists(file):return {}fp = open(file)data = {}linenum = 0for line in fp:if linenum == 0:linenum += 1continueline = line.split(',')userid,itemid = int(line[0]),int(line[1])if userid not in data:data[userid] = []data[userid].append(itemid)fp.close()return datadef split_data(data,M,k,seed):#將數(shù)據(jù)劃分成為測試集和訓(xùn)練集test = {}train = {}random.seed(seed)for user,items in data.items():for i in items:if random.randint(0,M) == k:if user not in test:test[user] =[]test[user].append(i)else:if user not in train:train[user] = []train[user].append(i)return train,testdef UserSimilarity(train):#得到用戶相似集合W#建立電影用戶倒排表item_user = {}for u,items in train.items():for i in items:if i not in item_user:item_user[i] = []item_user[i].append(u)#計(jì)算C[u][v]即u和v共同觀看的電影數(shù)C = {}N = np.zeros([NumOfUsers],dtype = np.int32)user_related = {}for i,users in item_user.items():for u in users:N[u] += 1if u not in C:C[u] = {}for v in users:if u == v:continueif v not in C[u]:C[u][v] = 0C[u][v] += (1/math.log(1+len(users)))if u not in user_related:user_related[u] = []user_related[u].append(v)#求用戶相似矩陣WW = np.zeros([NumOfUsers,NumOfUsers],dtype = np.float)for u,users in C.items():for v in users:W[u][v] += C[u][v] / math.sqrt(N[u] * N[v])return W ,user_relateddef recommend(User,train,K,N,W,user_related):#通過相似矩陣W給用戶產(chǎn)生推薦recordk_user = {}rank ={}for v in user_related[User]:k_user[v] = W[User][v]k_user = sorted(k_user.items(),key = lambda x:x[1],reverse = True)[:K]for v,w in k_user:for item in train[v] :if item in train[User]:continueif item not in rank:rank[item] = 0rank[item] += wrank = sorted(rank.items(),key = lambda x:x[1],reverse = True)[:N]return rankdef Recall(train,test,N,k,W,user_related):#計(jì)算召回率hit = 0totla = 0for user in train:tu =test[user]rank = recommend(user,train,k,N,W,user_related)for item in rank :if item[0] in tu :hit += 1totla += len(tu)return hit/(totla*1.0)def Precision(train,test,N,k,W,user_related):#計(jì)算召回率hit = 0totla = 0for user in train:tu =test[user]rank = recommend(user,train,k,N,W,user_related)for item in rank :if item[0] in tu :hit += 1totla += len(rank)return hit/(totla*1.0)if __name__ == "__main__":data = get_data(r"F:\個(gè)性化推薦算法\UserCF\data\ratings.csv")train,test = split_data(data,2,1,1)del dataW,user_relatde = UserSimilarity(train)recall = Recall(train,test,10,10,W,user_relatde)precision = Precision(train,test,10,10,W,user_relatde)print(recall,precision)

    注:以上參考《推薦系統(tǒng)實(shí)踐》一書

    總結(jié)

    以上是生活随笔為你收集整理的基于用户行为分析的推荐算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。