1. 程式人生 > >推薦系統_基於內容的推薦

推薦系統_基於內容的推薦

關於推薦系統的演算法大概可以分類兩類:

        一類就是基於使用者或者基於商品的協同過濾,我們主要是通過使用者行為這個海量資料來挖掘出使用者在品味上的一些相似程度,或者說

商品的相似程度,然後我們在利用相似性來進行推薦。

       另一類就是更早期的,而且更加容易理解的推薦,即基於內容的推薦,其主要思想就是:我們首先給商品劃分一些屬性,

你也可以稱為分類,比如說,對汽車分為一些類別,比如微型車,中型車,大型車,豪華車等等,每一類中又可以在細分,例如按照馬力,門數等等,我們建立了這些屬性數

據以後,我們怎麼樣進行推送呢?當用戶看某一個商品的時候,可以給他推薦一些同類的,比如說它的屬性比較相近,或者分類在同一類裡面,或者說不是同一類但是是相近

的分類的這麼一些其它的汽車給他,這個就是一種稱為內容的推薦。還有一種就是根據使用者標籤進行的推薦,這個標籤就是我們給商品或者人打上的一些屬性資訊,這個跟前

面的分類的區別:其實標籤本質上也是一種分類,但是我們之前所說的對於汽車的分類可能是一種比較嚴肅的分類,比如說網站聘用了一些專業的編輯回來,這些編輯有比較

強的業務能力,他對這個專業裡面的知識理解的比較透徹,有這些人對這些商品進行分類;而標籤應該是那種比較隨意的,比較鬆散的,這個一般是由用家,玩家來做的,比

如說玩家看每一輛車,對這輛車打上一個標籤,例如可愛,大氣等等,或者說可能是機器給你加的,機器可能根據瀏覽的一些人的情況給這些商品加上標籤,對人的標籤也

是一樣,例如在移動公司裡面,在它的交換機上得到一個日誌,這個日誌記錄著使用者訪問網站的資訊,有了用的訪問的連結之後,可以通過這些連結把使用者訪問的網頁抓回來,

然後對抓回來的網頁做一些文字挖掘,比如分詞,提取一些關鍵字,然後分析一下這篇文章是屬於哪種型別的,比如說是科技類文章,旅遊類文章,電影類等等,可以知道用

戶是屬於那種型別的人,對什麼東西感興趣,例如使用者到週末經常看一些電影院,電影的網站,可能斷定該使用者是一個電影愛好者,移動就可以贈送給這個使用者電影票來繫結

該使用者。所以說不光是商品,人其實也可以打標籤,人的標籤可以是人與人之間打標籤,例如說qq上面給好友打標籤,作評價,也可以是機器給人打標籤,例如剛才所說的移

動公司的例子。  不論是專業編輯給它賦屬性也好,或者是業餘人士(使用者)隨意的給它打上標籤也好,也可能是機器打上去的,我們基於這種分類來做推薦的話,我們稱之為

基於內容的推薦(有些人稱之為基於標籤的推薦)。

 自己感覺隱語義模型就是使用機器給內容打上標籤,用來代替人工,隱語義模型給內容打上標籤,即分類。有分類了就可以進行推薦了。

隱語義模型的核心是通過隱含特徵(latent factor)聯絡使用者興趣和物品。

舉例:例如兩個使用者的讀書列表。使用者A的興趣涉及偵探小說、科普圖書以及一些計算機技術書,而使用者B的興趣比較集中在數學和機器學習方面。

那麼如何對A和B推薦圖書呢?

對於UserCF,首先需要找到和他們看了同樣書的其他使用者(興趣相似的使用者),然後給他們推薦那些使用者喜歡的其他書。

對於ItemCF,需要給他們推薦和他們已經看的書相似的書,比如作者B看了許多關於資料探勘的書,可以給他們推薦機器學習或者模式識別方面的書。

還有一種方法,可以對書和物品的興趣進行分類。對於某個使用者,首先得到他的興趣分類,然後從分類中挑選他可能喜歡的物品。

根據商品屬性/分類(基於內容的推薦)進行推薦的基本思路:

       1,怎樣給物品進行分類?用人或者專家來進行分類會產生許多的問題;用機器來進行分類(隱語義模型進行自動分類)

       2,怎樣確定使用者對哪些類別的商品有興趣(可能需要對感興趣程度量化衡量)?可能需要用權重來進行使用者感興趣的類別的描述,權重的設定怎麼來設定,使用機器來對使用者的行為進行分析,然後得出他對商品興趣的權值(隱語義模型中有一種很巧妙的方法可以解決這個問題);

      3,確定類別以後,要向用戶推薦這個類裡的哪些商品?怎樣確定商品在類裡的權重?類別中的哪些商品推薦給使用者呢?我們應該把類別按照次序從高到低進行排序,那怎麼確定該商品在該類別中的權重有多大呢?可以肯定基本不可能是用人來進行的,(隱語義模型有一種巧妙的辦法可以解決);

剛才我們也說過了不適用機器,用專業的人員,編輯來對商品進行整理分類,賦予權重的話其實會有許多問題(這裡做下總結):

      使用專業人員(編輯)對商品進行整理分類,但這樣會產生成本和效率瓶頸
      受限於編輯的專業水平,編輯的意見未必能代表使用者的意見
      分類的粒度難於控制
      如果商品有多個分類,很難考慮周全
      多維度,多規角分類
      編輯很難決定商品在類別裡的權重

        為了解決上面的問題,研究人員提出:為什麼我們不從資料出發,自動地找到那些類,然後進行個性化推薦?於是,隱含語義分析(latent variable analysis)出現了。隱含語義分析技術因為採取基於使用者行為統計的自動聚類,較好地解決了上面提出的5個問題。

      隱含語義技術從誕生到今天產生了很多著名的模型和方法,其中和該技術相關且耳熟能詳的名詞有pLSA、LDA、隱含類別模型(latent  class  model)、隱含主題模型(latent  topic  model)、矩陣分解(matrix  factorization)。這些技術和方法在本質上是想通的,其中很多方法都可以用於個性化推薦系統。下來以LFM為例介紹隱含語義分析在推薦系統中的應用。

隱語義模型(LFM(latent foctor model))

關鍵公式:

舉例如下:

我們後面要做的事情就是抽樣產生一個學習集,比如使用者在網站上對商品的評分,例如使用者對電影的評價,這種叫顯性學習集,即使用者主動的對一些商品進行了打分,隱形學習集:使用者並沒表現

出對某個商品的喜愛程度,他只是通過自己的一些行為,暗示了他的喜愛,比如說他經常瀏覽哪些商品,或者購買過哪些商品,購買過明顯就是一個喜愛行為,我們可以通過使用者的行為推測出他

的喜愛程度。不論用哪種資料集,我們以上面給出的關鍵公式建立一個數學模型,通過學習資料來對這個模型進行訓練求解,求解出puk和qik。這個就是隱語義模型的基本思想。

LFM的前世今生:

源於對SVD(奇異值分解)方法的改進,傳統SVD是線性代數典型問題,具體見:http://zh.wikipedia.org/wiki/%E5%A5%87%E5%BC%82%E5%80%BC%E5%88%86%E8%A7%A3
SVD可用於推薦系統評分矩陣補全,但由於計算量太大,實際上只是適用於覎模很小的系統
Simon Funk改進SVD(Funk-SVD),後來被稱為Latent Factor Model(SVD是純矩陣問題,運算過程中會產生一巨大的矩陣,一般適合比較小的系統,Fuck改進以後,他不用矩陣計算,變成

用迭代計算,使用梯度下降法來求解,比較容易計算。即用梯度下降演算法解決一個SVD問題)
項亮書第187頁

隱語義模型的適用性:

LFM可以很好地解決之前所提到的困難
不能存在編輯的主觀評判或專業因素限制,所有的分類和權重都來自於演算法對使用者資料進行的客觀統計分析,只存在這模型適用性問題。也丌會額外產生編輯的人力成本開銷。
分類數k是先驗指定,通過k可以控制分類的粒度
LFM中,商品針對每個類都可以計算權重,是天生的多分類,多維度

關於訓練集:

       對於每個使用者u,訓練集包含了u喜歡的商品和不感興趣的物品
       LFM在顯性反饋資料(即使用者精確給出正負面評價資料)上工作良好,精度很高
       隱性反饋資料,這類資料的特點是隻有正樣本(購物籃資料,使用者點選資料),沒有負樣本
       在隱性反饋資料下產生負樣本的幾種方法:

然後喜歡設定rui為1,不喜歡設定為rui為0(最簡單)

常見同類問題求解思路:

最大似然(類似於訓練貝葉斯信念網路和EM演算法)

轉化為求解損失凼數極小值問題(採用梯度下降演算法求解):

LFM損失函式極值用梯度下降法求解:

LFM中的重要引數:

模型中隱特徵個數(嘗試,根據經驗)
梯度下降法中選取的學習速率
損失凼數中的懲罰項係數lambda
訓練集的負樣本/正樣本比例ratio(一般取1)

LFM SVD奇異值分解求解:


一下是項亮的書裡面的截圖


“隱語義”的真正背景

摘自:http://blog.csdn.net/wangran51/article/details/7408406

LSA(latent semantic analysis)潛在語義分析,也被稱為LSI(latent semantic index),是Scott Deerwester, Susan T. Dumais等人在1990年提出來的一種新的索引和檢索方法。該方法和傳統向量空間模型(vector space model)一樣使用向量來表示詞(terms)和文件(documents),並通過向量間的關係(如夾角)來判斷詞及文件間的關係;而不同的是,LSA將詞和文件對映到潛在語義空間,從而去除了原始向量空間中的一些“噪音”,提高了資訊檢索的精確度。

場景:


利用SVD求解LSA
        分析文件集合,建立Term-Document矩陣。
        對Term-Document矩陣進行奇異值分解。
        對SVD分解後的矩陣進行降維,也就是奇異值分解一節所提到的低階近似。
        使用降維後的矩陣構建潛在語義空間,或重建Term-Document矩陣。

例子:




然後對分解後的矩陣降維,這裡保留{S}的最大兩個奇異值,相應的{W}{P}矩陣如圖,注意{P}在公式中需要轉置。

到了這一步後,我們有兩種處理方法,論文Introduction to Latent Semantic Analysis是將降維後的三個矩陣再乘起來,重新構建了{X}矩陣如下:


觀察{X}矩陣和{X^}矩陣可以發現:

{X}中human-C2值為0,因為C2中並不包含human單詞,但是{X^}中human-C2為0.40,表明human和C2有一定的關係,為什麼呢?因為C2:”A survey of user opinion of computer system response time”中包含user單詞,和human是近似詞,因此human-C2的值被提高了。同理還可以分析其他在{X^}中數值改變了的詞。

基於標籤的推薦系統

         推薦系統的目的是聯絡使用者的興趣和物品,這種聯絡需要依賴不同的媒體。目前流行的推薦系統基本上通過3中方式聯絡使用者興趣和物品。如下圖
第一種方式是利用使用者喜歡過的物品,給使用者推薦與他喜歡過的物品相似的物品,這就是前面提到的基於物品的演算法。第二種方式是利用和使用者興趣相似的其他使用者,給使用者推薦那些和他們興趣愛好相似的其他使用者喜歡的物品,這是前面提到的基於使用者的演算法。除了這兩種方法,第三種重要的方式是通過一些特徵聯絡使用者和物品,給使用者推薦那些具體使用者喜歡的特徵的物品。這裡的特徵有不同的表現方式,比如可以表現為物品的屬性集合(比如對於圖書,屬性集合包括作者、出版社、主題和關鍵詞等),也可以表現為隱語義向量(latent factor vector),這可以通過前面提示的隱語義模型得到,下面討論一種重要的特徵表現方式----標籤。根據給物品打標籤的物件的不同,標籤應用一般分為兩種:一種是讓作者或者專家或者機器給物品打標籤(LFM);另一種是讓普通使用者給物品打標籤;
標籤跟分類有什麼不一樣的呢?前面說過了,分類一般是由專業人員或者機器(例如:LFM)打上的,標籤是有使用者自由打上的。 使用者為什麼要打標籤呢?
基於標籤的推薦系統的思想:
即: 怎麼進行推薦呢?例如一個使用者進來,就找找最後一個矩陣ui中使用者對應的一行,裡面有很多歌pui,看看那個pui是最大的,就把那個商品推薦給他。

        前面這個公式傾向於給熱門標籤對應的熱門物品很大的權重,因此會造成推薦熱門的物品給使用者,從而降低推薦結果的新穎性。例如現在有一部電影

正在很熱門的播放,多半都會把這個電影推薦給你,但是這部電影其實不需要推薦給你你也知道,這就是說推薦系統推薦給你的東西不是新穎的。推薦

給你也沒有什麼用處,其實你估計也知道了(熱門),這對於推薦系統沒有多大的意義,所以我們可能需要改進推薦系統,來糾正這種情況,來防止一些

過熱的物品,過熱的標籤干擾到我們這個推薦系統的新穎性,這裡所採取的方法是TF-IDF

TagBasedTFIDF(應用TF-IDF的思想):

前面這個公式傾向於給熱門標籤對應的熱門物品很大的權重,因此會造成推薦熱門的物品給使用者,從而降低推薦結果的新穎性。另外,這個公式利用使用者的

標籤向量對使用者興趣建模,其中每個標籤都是使用者使用過的標籤,而標籤的權重是使用者使用該標籤的次數。這種建模方法的缺點是給熱門標籤過大的權重,從而不能反映

使用者個性化的興趣。這裡我們借鑑TF-IDF的思想,對這一共識進行改進:



這樣,熱門的東西就不會被反覆的給推薦出來了。


假如一個使用者他比較新,舉例來說,假如一個商品剛放到這個系統裡面沒多久,這個時候可能使用者打的標籤可能很少,

這個樣子就不好推薦,例如購買東西,購買的東西多了就很好的推薦,如果一個人只買了一個商品,就不好推薦,如果

這個人什麼都沒有購買,就更難進行推薦。這個時候我們就可能需要對他的標籤進行擴充套件,比如說你使用過某一個標籤,

我可能在這個標籤上獲得的物品不是很多,甚至可能沒有人使用過這個標籤,但是如果我找出與這個標籤相似的標籤,

那麼相對來說我可能獲得的物品就可能多一些,我們可以這這些標籤認為是同一個標籤,那麼這樣就好了。那麼現在的關鍵

就是要挖掘出那些新的相似的標籤出來,標籤的相似度怎麼計算呢?公式如下:

通過這個就可以獲得一些相似的標籤出來,