小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

《推薦系統(tǒng)》基于標(biāo)簽的用戶推薦系統(tǒng)

 DM成長(zhǎng)者 2017-05-08

原鏈接:http://blog.csdn.net/gamer_gyt/article/details/51684716

目錄:

1:聯(lián)系用戶興趣和物品的方式

2:標(biāo)簽系統(tǒng)的典型代表

3:用戶如何打標(biāo)簽

4:基于標(biāo)簽的推薦系統(tǒng)

5:算法的改進(jìn)

6:標(biāo)簽推薦

源代碼查看地址:github查看

一:聯(lián)系用戶興趣和物品的方式

    推薦系統(tǒng)的目的是聯(lián)系用戶的興趣和物品,這種聯(lián)系方式需要依賴不同的媒介。目前流行的推薦系統(tǒng)基本上是通過三種方式聯(lián)系用戶興趣和物品。

                                  

       1:利用用戶喜歡過的物品,給用戶推薦與他喜歡過的物品相似的物品,即基于item的系統(tǒng)過濾推薦算法(算法分析可參考:點(diǎn)擊閱讀

       2:利用用戶和興趣用戶興趣相似的其他用戶,給用戶推薦哪些和他們興趣愛好相似的其他用戶喜歡的物品,即基于User的協(xié)同過濾推薦算法(算法分析可參考:點(diǎn)擊閱讀

       3:通過一些特征聯(lián)系用戶和物品,給用戶推薦那些具有用戶喜歡的特征的物品,這里的特征有不同的表現(xiàn)形式,比如可以表現(xiàn)為物品的屬性集合,也可以表現(xiàn)為隱語義向量,而下面我們要討論的是一種重要的特征表現(xiàn)形式——標(biāo)簽


二:標(biāo)簽系統(tǒng)的典型代表

       pass掉那些國(guó)外網(wǎng)站,比如說豆瓣圖書(左),網(wǎng)易云音樂(右)

                

    標(biāo)簽系統(tǒng)確實(shí)能夠幫助用戶發(fā)現(xiàn)他們喜歡和感興趣的物品


三:用戶如何打標(biāo)簽

       在互聯(lián)網(wǎng)中每個(gè)人的行為都是隨機(jī)的,但其實(shí)這些表面的行為隱藏著很多規(guī)律,那么我們對(duì)用戶打的標(biāo)簽進(jìn)行統(tǒng)計(jì)呢,便引入了標(biāo)簽流行度,我們定義的一個(gè)標(biāo)簽被一個(gè)用戶使用在一個(gè)物品上,他的流行度就加1,可以如下代碼實(shí)現(xiàn):

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. #統(tǒng)計(jì)標(biāo)簽流行度  
  2. def TagPopularity(records):  
  3.     tagfreq = dict()  
  4.     for user, item ,tag in records:  
  5.         if tag not in tagfreq:  
  6.             tagfreq[tag] = 1  
  7.         else:  
  8.             tagfreq[tag] +=1  
  9.     return tagfreq  
      下面的是一個(gè)標(biāo)簽流行度分布圖,其也是符合典型的長(zhǎng)尾分布,他的雙對(duì)數(shù)曲線幾乎是一條直線

                                    

 

            在用戶看到一個(gè)物品時(shí),我們希望他打的標(biāo)簽是能夠準(zhǔn)確的描述物品內(nèi)容屬性的關(guān)鍵詞,但用戶往往不是按照我們的想法操作,而是可能給物品打上各種各樣奇奇怪怪的標(biāo)簽,此時(shí)便需要我們?nèi)斯ぞ庉嬕恍┨囟ǖ臉?biāo)簽供用戶選擇,Scott A. Golder 總結(jié)了Delicious上的標(biāo)簽,將它們分為如下幾類。

表明物品是什么 比如是一只鳥,就會(huì)有“鳥”這個(gè)詞的標(biāo)簽;是豆瓣的首頁,就有一個(gè)標(biāo)簽叫“豆瓣”;是喬布斯的首頁,就會(huì)有個(gè)標(biāo)簽叫“喬布斯”。
表明物品的種類 比如在Delicious的書簽中,表示一個(gè)網(wǎng)頁類別的標(biāo)簽包括 article(文章)、blog(博客)、 book(圖書)等。
表明誰擁有物品 比如很多博客的標(biāo)簽中會(huì)包括博客的作者等信息。
表達(dá)用戶的觀點(diǎn) 比如用戶認(rèn)為網(wǎng)頁很有趣,就會(huì)打上標(biāo)簽funny(有趣),認(rèn)為很無聊,就會(huì)打上標(biāo)簽boring(無聊)。
用戶相關(guān)的標(biāo)簽 比如 my favorite(我最喜歡的)、my comment(我的評(píng)論)等。
用戶的任務(wù) 比如 to read(即將閱讀)、job search(找工作)

比如在豆瓣上,標(biāo)簽便被分為如下幾個(gè)類別

                                                                     


四:基于標(biāo)簽的推薦系統(tǒng)

       用戶用標(biāo)簽來描述對(duì)物品的看法,因此標(biāo)簽是聯(lián)系用戶和物品的紐帶,也是反應(yīng)用戶興趣的重要數(shù)據(jù)源,如何利用用戶的標(biāo)簽數(shù)據(jù)提高個(gè)性化推薦結(jié)果的質(zhì)量是推薦系統(tǒng)研究的重要課題。

       豆瓣很好地利用了標(biāo)簽數(shù)據(jù),它將標(biāo)簽系統(tǒng)融入到了整個(gè)產(chǎn)品線中。

       首先,在每本書的頁面上,豆瓣都提供了一個(gè)叫做“豆瓣成員常用標(biāo)簽”的應(yīng)用,它給出了這本書上用戶最常打的標(biāo)簽。

       同時(shí),在用戶給書做評(píng)價(jià)時(shí),豆瓣也會(huì)讓用戶給圖書打標(biāo)簽。

       最后,在最終的個(gè)性化推薦結(jié)果里,豆瓣利用標(biāo)簽將用戶的推薦結(jié)果做了聚類,顯示了對(duì)不同標(biāo)簽下用戶的推薦結(jié)果,從而增加了推薦的多樣性和可解釋性。

        一個(gè)用戶標(biāo)簽行為的數(shù)據(jù)集一般由一個(gè)三元組的集合表示,其中記錄(u, i, b) 表示用戶u給物品i打上了標(biāo)簽b。當(dāng)然,用戶的真實(shí)標(biāo)簽行為數(shù)據(jù)遠(yuǎn)遠(yuǎn)比三元組表示的要復(fù)雜,比如用戶打標(biāo)簽的時(shí)間、用戶的屬性數(shù)據(jù)、物品的屬性數(shù)據(jù)等。但是為了集中討論標(biāo)簽數(shù)據(jù),只考慮上面定義的三元組形式的數(shù)據(jù),即用戶的每一次打標(biāo)簽行為都用一個(gè)三元組(用戶、物品、標(biāo)簽)表示。

       1:試驗(yàn)設(shè)置

        本節(jié)將數(shù)據(jù)集隨機(jī)分成10份。這里分割的鍵值是用戶和物品,不包括標(biāo)簽。也就是說,用戶對(duì)物品的多個(gè)標(biāo)簽記錄要么都被分進(jìn)訓(xùn)練集,要么都被分進(jìn)測(cè)試集,不會(huì)一部分在訓(xùn)練集,另一部分在測(cè)試集中。然后,我們挑選1份作為測(cè)試集,剩下的9份作為訓(xùn)練集,通過學(xué)習(xí)訓(xùn)練集中的用戶標(biāo)簽數(shù)據(jù)預(yù)測(cè)測(cè)試集上用戶會(huì)給什么物品打標(biāo)簽。對(duì)于用戶u,令R(u)為給用戶u的長(zhǎng)度為N的推薦列表,里面包含我們認(rèn)為用戶會(huì)打標(biāo)簽的物品。令T(u)是測(cè)試集中用戶u實(shí)際上打過標(biāo)簽的物品集合。然后,我們利用準(zhǔn)確率(precision)和召回率(recall)評(píng)測(cè)個(gè)性化推薦算法的精度。

                                                             

         將上面的實(shí)驗(yàn)進(jìn)行10次,每次選擇不同的測(cè)試集,然后將每次實(shí)驗(yàn)的準(zhǔn)確率和召回率的平均值作為最終的評(píng)測(cè)結(jié)果。為了全面評(píng)測(cè)個(gè)性化推薦的性能,我們同時(shí)評(píng)測(cè)了推薦結(jié)果的覆蓋率(coverage)、多樣性(diversity)和新穎度。覆蓋率的計(jì)算公式如下:

                                                                        

接下來我們用物品標(biāo)簽向量的余弦相似度度量物品之間的相似度。對(duì)于每個(gè)物品i,item_tags[i]存儲(chǔ)了物品i的標(biāo)簽向量,其中item_tags[i][b]是對(duì)物品i打標(biāo)簽b的次數(shù),那么物品i和j的余弦相似度可以通過如下程序計(jì)算。

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. #計(jì)算余弦相似度  
  2. def CosineSim(item_tags,i,j):  
  3.     ret = 0  
  4.     for b,wib in item_tags[i].items():     #求物品i,j的標(biāo)簽交集數(shù)目  
  5.         if b in item_tags[j]:  
  6.             ret += wib * item_tags[j][b]  
  7.     ni = 0  
  8.     nj = 0  
  9.     for b, w in item_tags[i].items():      #統(tǒng)計(jì) i 的標(biāo)簽數(shù)目  
  10.         ni += w * w  
  11.     for b, w in item_tags[j].items():      #統(tǒng)計(jì) j 的標(biāo)簽數(shù)目  
  12.         nj += w * w  
  13.     if ret == 0:  
  14.         return 0  
  15.     return ret/math.sqrt(ni * nj)          #返回余弦值  
       在得到物品之間的相似度度量后,我們可以用如下公式計(jì)算一個(gè)推薦列表的多樣性:

                                            

      Python實(shí)現(xiàn)為:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. #計(jì)算推薦列表多樣性  
  2. def Diversity(item_tags,recommend_items):  
  3.     ret = 0  
  4.     n = 0  
  5.     for i in recommend_items.keys():  
  6.         for j in recommend_items.keys():  
  7.             if i == j:  
  8.                 continue  
  9.             ret += CosineSim(item_tags,i,j)  
  10.             n += 1  
  11.     return ret/(n * 1.0)  

     推薦系統(tǒng)的多樣性為所有用戶推薦列表多樣性的平均值。
     至于推薦結(jié)果的新穎性,我們簡(jiǎn)單地用推薦結(jié)果的平均熱門程度(AveragePopularity)度量。對(duì)于物品i,定義它的流行度item_pop(i)為給這個(gè)物品打過標(biāo)簽的用戶數(shù)。而對(duì)推薦系統(tǒng),我們定義它的平均熱門度如下:

                                                   

       2:一個(gè)簡(jiǎn)單的算法

       拿到了用戶標(biāo)簽行為數(shù)據(jù),相信大家都可以想到一個(gè)最簡(jiǎn)單的個(gè)性化推薦算法。這個(gè)算法的
       描述如下所示。
        統(tǒng)計(jì)每個(gè)用戶最常用的標(biāo)簽。
        對(duì)于每個(gè)標(biāo)簽,統(tǒng)計(jì)被打過這個(gè)標(biāo)簽次數(shù)最多的物品。
        對(duì)于一個(gè)用戶,首先找到他常用的標(biāo)簽,然后找到具有這些標(biāo)簽的最熱門物品推薦給這個(gè)用戶。
       對(duì)于上面的算法,用戶u對(duì)物品i的興趣公式如下:

                                                                    

        這里,B(u)是用戶u打過的標(biāo)簽集合,B(i)是物品i被打過的標(biāo)簽集合,nu,b是用戶u打過標(biāo)簽b的次數(shù),nb,i是物品i被打過標(biāo)簽b的次數(shù)。本章用SimpleTagBased標(biāo)記這個(gè)算法。
        在Python中,我們遵循如下約定:
        用 records 存儲(chǔ)標(biāo)簽數(shù)據(jù)的三元組,其中records[i] = [user, item, tag];
        用 user_tags 存儲(chǔ)nu,b,其中user_tags[u][b] = nu,b;
        用 tag_items存儲(chǔ)nb,i,其中tag_items[b][i] = nb,i。
        如下程序可以從records中統(tǒng)計(jì)出user_tags和tag_items:

[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;">#從records中統(tǒng)計(jì)出user_tags和tag_items  
  2. def InitStat(records):  
  3.     user_tags = dict()  
  4.     tag_items = dict()  
  5.     user_items = dict()  
  6.     for user, item, tag in records.items():  
  7.         addValueToMat(user_tags, user, tag, 1)  
  8.         addValueToMat(tag_items, tag, item, 1)  
  9.         addValueToMat(user_items, user, item, 1)</span>  
       統(tǒng)計(jì)出user_tags和tag_items之后,我們可以通過如下程序?qū)τ脩暨M(jìn)行個(gè)性化推薦:
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;">#對(duì)用戶進(jìn)行個(gè)性化推薦  
  2. def Recommend(user):  
  3.     recommend_items = dict()  
  4.     tagged_items = user_items[user]  
  5.     for tag, wut in user_tags[user].items():  
  6.         for item, wti in tag_items[tag].items():  
  7.             #if items have been tagged, do not recommend them  
  8.             if item in tagged_items:  
  9.                 continue  
  10.             if item not in recommend_items:  
  11.                 recommend_items[item] = wut * wti  
  12.             else:  
  13.                 recommend_items[item] += wut * wti  
  14.     return recommend_items  
  15. </span>  

五:算法的改進(jìn)

      再次回顧四中提出的簡(jiǎn)單算法

                                                                   

     該算法存在許多缺點(diǎn),比如說對(duì)于熱門商品的處理,數(shù)據(jù)洗漱性的處理等,這也是在推薦系統(tǒng)中經(jīng)常會(huì)遇見的問題

      1:TF-IDF

      前面這個(gè)公式傾向于給熱門標(biāo)簽對(duì)應(yīng)的熱門物品很大的權(quán)重,因此會(huì)造成推薦熱門的物品給用戶,從而降低推薦結(jié)果的新穎性。另外,這個(gè)公式利用用戶的標(biāo)簽向量對(duì)用戶興趣建模,其中每個(gè)標(biāo)簽都是用戶使用過的標(biāo)簽,而標(biāo)簽的權(quán)重是用戶使用該標(biāo)簽的次數(shù)。這種建模方法的缺點(diǎn)是給熱門標(biāo)簽過大的權(quán)重,從而不能反應(yīng)用戶個(gè)性化的興趣。這里我們可以借鑒TF-IDF的思想,對(duì)這一公式進(jìn)行改進(jìn):

                                                                   

         這里,記錄了標(biāo)簽b被多少個(gè)不同的用戶使用過。這個(gè)算法記為TagBasedTFIDF。

         同理,我們也可以借鑒TF-IDF的思想對(duì)熱門物品進(jìn)行懲罰,從而得到如下公式:
                                                                  
         其中, 記錄了物品i被多少個(gè)不同的用戶打過標(biāo)簽。這個(gè)算法記為TagBasedTFIDF++。

         2:數(shù)據(jù)稀疏性

          在前邊的算法中,用戶興趣和物品的聯(lián)系是通過B(u) B(i)交集得到的,但是對(duì)于新用戶,這個(gè)交集的結(jié)果將會(huì)非常小,為了提高推薦結(jié)果的可靠性,這里我們要對(duì)標(biāo)簽進(jìn)行擴(kuò)展,,比如若用戶曾經(jīng)用過“推薦系統(tǒng)”這個(gè)標(biāo)簽,我們可以將這個(gè)標(biāo)簽的相似標(biāo)簽也加入到用戶標(biāo)簽集合中,比如“個(gè)性化”、“協(xié)同過濾”等標(biāo)簽。
          進(jìn)行標(biāo)簽擴(kuò)展的方法有很多,比如說話題模型(參考博客),這里遵循簡(jiǎn)單原則介紹一種基于鄰域的方法。
          標(biāo)簽擴(kuò)展的本質(zhì)是找到與他相似的標(biāo)簽,也就是計(jì)算標(biāo)簽之間的相似度。最簡(jiǎn)單的相似度可以是同義詞。如果有一個(gè)同義詞詞典,就可以根據(jù)這個(gè)詞典進(jìn)行標(biāo)簽擴(kuò)展。如果沒有這個(gè)詞典,我們可以從數(shù)據(jù)中統(tǒng)計(jì)出標(biāo)簽的相似度。
          如果認(rèn)為同一個(gè)物品上的不同標(biāo)簽具有某種相似度,那么當(dāng)兩個(gè)標(biāo)簽同時(shí)出現(xiàn)在很多物品的標(biāo)簽集合中時(shí),我們就可以認(rèn)為這兩個(gè)標(biāo)簽具有較大的相似度。對(duì)于標(biāo)簽b,令N(b)為有標(biāo)簽b的物品的集合,n_{b,i}為給物品i打上標(biāo)簽b的用戶數(shù),我們可以通過如下余弦相似度公式計(jì)算標(biāo)簽b和標(biāo)簽b'的相似度:
                                                                 

        3:標(biāo)簽清理

          不是所有標(biāo)簽都能反應(yīng)用戶的興趣。比如,在一個(gè)視頻網(wǎng)站中,用戶可能對(duì)一個(gè)視頻打了一個(gè)表示情緒的標(biāo)簽,比如“不好笑”,但我們不能因此認(rèn)為用戶對(duì)“不好笑”有興趣,并且給用戶推薦其他具有“不好笑”這個(gè)標(biāo)簽的視頻。相反,如果用戶對(duì)視頻打過“成龍”這個(gè)標(biāo)簽,我們可以據(jù)此認(rèn)為用戶對(duì)成龍的電影感興趣,從而給用戶推薦成龍其他的電影。同時(shí),標(biāo)簽系統(tǒng)里經(jīng)常出現(xiàn)詞形不同、詞義相同的標(biāo)簽,比如recommender system和recommendation engine就是兩個(gè)同義詞。
          標(biāo)簽清理的另一個(gè)重要意義在于將標(biāo)簽作為推薦解釋。如果我們要把標(biāo)簽呈現(xiàn)給用戶,將其作為給用戶推薦某一個(gè)物品的解釋,對(duì)標(biāo)簽的質(zhì)量要求就很高。首先,這些標(biāo)簽不能包含沒有意義的停止詞或者表示情緒的詞,其次這些推薦解釋里不能包含很多意義相同的詞語。
          一般來說有如下標(biāo)簽清理方法:
          去除詞頻很高的停止詞;
          去除因詞根不同造成的同義詞,比如 recommender system和recommendation system;
          去除因分隔符造成的同義詞,比如 collaborative_filtering和collaborative-filtering。
        為了控制標(biāo)簽的質(zhì)量,很多網(wǎng)站也采用了讓用戶進(jìn)行反饋的思想,即讓用戶告訴系統(tǒng)某個(gè)標(biāo)簽是否合適。

推薦程序(更新查看地址:github   //  數(shù)據(jù)集下載):
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. #!/usr/bin/env python  
  2. #-*-coding:utf-8-*-  
  3. import random    
  4. #統(tǒng)計(jì)各類數(shù)量    
  5. def addValueToMat(theMat,key,value,incr):    
  6.     if key not in theMat: #如果key沒出先在theMat中    
  7.         theMat[key]=dict();    
  8.         theMat[key][value]=incr;    
  9.     else:    
  10.         if value not in theMat[key]:    
  11.             theMat[key][value]=incr;    
  12.         else:    
  13.             theMat[key][value]+=incr;#若有值,則遞增    
  14.     
  15. user_tags = dict();    
  16. tag_items = dict();    
  17. user_items = dict();    
  18. user_items_test = dict();#測(cè)試集數(shù)據(jù)字典    
  19.     
  20. #初始化,進(jìn)行各種統(tǒng)計(jì)    
  21. def InitStat():    
  22.     data_file = open('delicious.dat')    
  23.     line = data_file.readline();     
  24.     while line:    
  25.         if random.random()>0.1:#將90%的數(shù)據(jù)作為訓(xùn)練集,剩下10%的數(shù)據(jù)作為測(cè)試集    
  26.             terms = line.split("\t");#訓(xùn)練集的數(shù)據(jù)結(jié)構(gòu)是[user, item, tag]形式    
  27.             user=terms[0];    
  28.             item=terms[1];    
  29.             tag=terms[2];    
  30.             addValueToMat(user_tags,user,tag,1)    
  31.             addValueToMat(tag_items,tag,item,1)    
  32.             addValueToMat(user_items,user,item,1)    
  33.             line = data_file.readline();    
  34.         else:    
  35.             addValueToMat(user_items_test,user,item,1)    
  36.     data_file.close();       
  37.       
  38. #推薦算法    
  39. def Recommend(usr):    
  40.     recommend_list = dict();    
  41.     tagged_item = user_items[usr];#得到該用戶所有推薦過的物品    
  42.     for tag_,wut in user_tags[usr].items():#用戶打過的標(biāo)簽及次數(shù)    
  43.         for item_,wit in tag_items[tag_].items():#物品被打過的標(biāo)簽及被打過的次數(shù)    
  44.             if item_ not in tagged_item:#已經(jīng)推薦過的不再推薦    
  45.                 if item_ not in recommend_list:    
  46.                     recommend_list[item_]=wut*wit;#根據(jù)公式    
  47.                 else:    
  48.                     recommend_list[item_]+=wut*wit;    
  49.     return sorted(recommend_list.iteritems(), key=lambda a:a[1],reverse=True)  
  50.   
  51. InitStat()  
  52. recommend_list = Recommend("48411")  
  53. # print recommend_list  
  54. for recommend in recommend_list[:10]:  #興趣度最高的十個(gè)itemid  
  55.     print recommend  
運(yùn)行結(jié)果:
('912', 610)
('3763', 394)
('52503', 238)
('39051', 154)
('45647', 147)
('21832', 144)
('1963', 143)
('1237', 140)
('33815', 140)
('5136', 138)

六:標(biāo)簽推薦

        當(dāng)用戶瀏覽某個(gè)物品時(shí),標(biāo)簽系統(tǒng)非常希望用戶能夠給這個(gè)物品打上高質(zhì)量的標(biāo)簽,這樣才能促進(jìn)標(biāo)簽系統(tǒng)的良性循環(huán)。因此,很多標(biāo)簽系統(tǒng)都設(shè)計(jì)了標(biāo)簽推薦模塊給用戶推薦標(biāo)簽。
       1:為什么給用戶推薦標(biāo)簽
             方便用戶輸入標(biāo)簽 讓用戶從鍵盤輸入標(biāo)簽無疑會(huì)增加用戶打標(biāo)簽的難度,這樣很多用戶不愿意給物品打標(biāo)簽,因此我們需要一個(gè)輔助工具來減小用戶打標(biāo)簽的難度,從而提高用戶打標(biāo)簽的參與度。
            提高標(biāo)簽質(zhì)量 同一個(gè)語義不同的用戶可能用不同的詞語來表示。這些同義詞會(huì)使標(biāo)簽的詞表變得很龐大,而且會(huì)使計(jì)算相似度不太準(zhǔn)確。而使用推薦標(biāo)簽時(shí),我們可以對(duì)詞表進(jìn)行選擇,首先保證詞表不出現(xiàn)太多的同義詞,同時(shí)保證出現(xiàn)的詞都是一些比較熱門的、有代表性的詞。
      2:標(biāo)簽推薦的四種簡(jiǎn)單算法
       a:給用戶u推薦整個(gè)系統(tǒng)里最熱門的標(biāo)簽(這里將這個(gè)算法稱為PopularTags)令tags[b]為標(biāo)簽b的熱門程度,那么這個(gè)算法的實(shí)現(xiàn)如下:
 
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendPopularTags(user,item, tags, N):  
  2.     return sorted(tags.items(), key=itemgetter(1), reverse=True)[0:N]    </span>  
       b:給用戶u推薦物品i上最熱門的標(biāo)簽(這里將這個(gè)算法稱為ItemPopularTags)。令item_tags[i][b]為物品i被打上標(biāo)簽b的次數(shù)
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendItemPopularTags(user,item, item_tags, N):  
  2.     return sorted(item_tags[item].items(), key=itemgetter(1), reverse=True)[0:N]</span>  
       c:是給用戶u推薦他自己經(jīng)常使用的標(biāo)簽(這里將這個(gè)算法稱為UserPopularTags)。令user_tags[u][b]為用戶u使用標(biāo)簽b的次數(shù)
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendUserPopularTags(user,item, user_tags, N):  
  2.     return sorted(user_tags[user].items(), key=itemgetter(1), reverse=True)[0:N]</span>  
       d:前面兩種的融合(這里記為HybridPopularTags),該方法通過一個(gè)系數(shù)將上面的推薦結(jié)果線性加權(quán),然后生成最終的推薦結(jié)果。
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">def RecommendHybridPopularTags(user,item, user_tags, item_tags, alpha, N):  
  2.     max_user_tag_weight = max(user_tags[user].values())  
  3.     for tag, weight in user_tags[user].items():  
  4.         ret[tag] = (1 – alpha) * weight / max_user_tag_weight  
  5.     </span>  
[python] view plain copy
在CODE上查看代碼片派生到我的代碼片
  1. <span style="font-family:Microsoft YaHei;font-size:14px;">    max_item_tag_weight = max(item_tags[item].values())  
  2.     for tag, weight in item_tags[item].items():  
  3.         if tag not in ret:  
  4.             ret[tag] = alpha * weight / max_item_tag_weight  
  5.         else:  
  6.             ret[tag] += alpha * weight / max_item_tag_weight  
  7.     return sorted(ret[user].items(), key=itemgetter(1), reverse=True)[0:N]</span>  
注意在上面的實(shí)現(xiàn)中,我們?cè)趯蓚€(gè)列表線性相加時(shí)都將兩個(gè)列表按最大值做了歸一化,這樣的好處是便于控制兩個(gè)列表對(duì)最終結(jié)果的影響,而不至于因?yàn)槲锲贩浅衢T而淹沒用戶對(duì)推薦結(jié)果的影響,或者因?yàn)橛脩舴浅;钴S而淹沒物品對(duì)推薦結(jié)果的影響。


             

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多