http://blog.csdn.net/pipisorry/article/details/45665779html
主題模型LDA的應用
拿到這些topic後繼續後面的這些應用怎麼作呢:
除了推斷出這些主題,LDA還能夠推斷每篇文章在主題上的分佈。例如,X文章大概有60%在討論「空間探索」,30%關於「電腦」,10%關於其餘主題。node
這些主題分佈能夠有多種用途:
聚類: 主題是聚類中心,文章和多個類簇(主題)關聯。聚類對整理和總結文章集合頗有幫助。參看Blei教授和Lafferty教授對於Science雜誌的文章生成的總結。點擊一個主題,看到該主題下一系列文章。
特徵生成:LDA能夠生成特徵供其餘機器學習算法使用。如前所述,LDA爲每一篇文章推斷一個主題分佈;K個主題便是K個數值特徵。這些特徵能夠被用在像邏輯迴歸或者決策樹這樣的算法中用於預測任務。
降維:每篇文章在主題上的分佈提供了一個文章的簡潔總結。在這個降維了的特徵空間中進行文章比較,比在原始的詞彙的特徵空間中更有意義。python
排序:The very best ways to sort large databases of unstructured text is to use a technique called Latent Dirichlet allocation (LDA).算法
皮皮blog編程
應用於推薦系統
在使用LDA(Latent Dirichlet Allocation)計算物品的內容類似度時,咱們能夠先計算出物品在話題上的分佈,而後利用兩個物品的話題分佈計算物品的類似度。好比,若是兩個物品的話題分佈類似,則認爲兩個物品具備較高的類似度,反之則認爲兩個物品的類似度較低。計算分佈的類似度能夠利用KL散度來計算:
DKL(p||q)=∑i∈Xp(i)ln(p(i)/q(i),其中p和q是兩個分佈,KL散度越大說明分佈的類似度越低。機器學習
[基於主題模型的學術論文推薦系統研究]編程語言
隱語義模型LFM和LSI,LDA,Topic Model其實都屬於隱含語義分析技術,是一類概念,他們在本質上是相通的,都是找出潛在的主題或分類。這些技術一開始都是在文本挖掘領域中提出來的,近些年它們也被不斷應用到其餘領域中,並獲得了不錯的應用效果。好比,在推薦系統中它可以基於用戶的行爲對item進行自動聚類,也就是把item劃分到不一樣類別/主題,這些主題/類別能夠理解爲用戶的興趣。
對於一個用戶來講,他們可能有不一樣的興趣。就以做者舉的豆瓣書單的例子來講,用戶A會關注數學,歷史,計算機方面的書,用戶B喜歡機器學習,編程語言,離散數學方面的書, 用戶C喜歡大師Knuth, Jiawei Han等人的著做。那咱們在推薦的時候,確定是向用戶推薦他感興趣的類別下的圖書。那麼前提是咱們要對全部item(圖書)進行分類。那如何分呢?你們注意到沒有,分類標準這個東西是因人而異的,每一個用戶的想法都不同。拿B用戶來講,他喜歡的三個類別其實均可以算做是計算機方面的書籍,也就是說B的分類粒度要比A小;拿離散數學來說,他既能夠算做數學,也可當作計算機方面的類別,也就是說有些item不能簡單的將其劃歸到肯定的單一類別;拿C用戶來講,他傾向的是書的做者,只看某幾個特定做者的書,那麼跟A,B相比它的分類角度就徹底不一樣了。
顯然咱們不能靠由單我的(編輯)或team的主觀想法創建起來的分類標準對整個平臺用戶喜愛進行標準化。
此外咱們還須要注意的兩個問題:ide
- 咱們在可見的用戶書單中歸結出3個類別,不等於該用戶就只喜歡這3類,對其餘類別的書就一點興趣也沒有。也就是說,咱們須要瞭解用戶對於全部類別的興趣度。
- 對於一個給定的類來講,咱們須要肯定這個類中每本書屬於該類別的權重。權重有助於咱們肯定該推薦哪些書給用戶。
下面咱們就來看看LFM是如何解決上面的問題的?對於一個給定的用戶行爲數據集(數據集包含的是全部的user, 全部的item,以及每一個user有過行爲的item列表),使用LFM對其建模後,咱們能夠獲得以下圖所示的模型:(假設數據集中有3個user, 4個item, LFM建模的分類數爲4)
R矩陣是user-item矩陣,矩陣值Rij表示的是user i 對item j的興趣度,這正是咱們要求的值。對於一個user來講,當計算出他對全部item的興趣度後,就能夠進行排序並做出推薦。LFM算法從數據集中抽取出若干主題,做爲user和item之間鏈接的橋樑,將R矩陣表示爲P矩陣和Q矩陣相乘。其中P矩陣是user-class矩陣,矩陣值Pij表示的是user i對class j的興趣度;Q矩陣式class-item矩陣,矩陣值Qij表示的是item j在class i中的權重,權重越高越能做爲該類的表明。因此LFM根據以下公式來計算用戶U對物品I的興趣度
咱們發現使用LFM後,
- 咱們不須要關心分類的角度,結果都是基於用戶行爲統計自動聚類的,全憑數據本身說了算。
- 不須要關心分類粒度的問題,經過設置LFM的最終分類數就可控制粒度,分類數越大,粒度約細。
- 對於一個item,並非明確的劃分到某一類,而是計算其屬於每一類的機率,是一種標準的軟分類。
- 對於一個user,咱們能夠獲得他對於每一類的興趣度,而不是隻關心可見列表中的那幾個類。
- 對於每個class,咱們能夠獲得類中每一個item的權重,越能表明這個類的item,權重越高。
那麼,接下去的問題就是如何計算矩陣P和矩陣Q中參數值。通常作法就是最優化損失函數來求參數。在定義損失函數以前,咱們須要準備一下數據集並對興趣度的取值作一說明。函數
數據集應該包含全部的user和他們有過行爲的(也就是喜歡)的item。全部的這些item構成了一個item全集。對於每一個user來講,咱們把他有過行爲的item稱爲正樣本,規定興趣度RUI=1,此外咱們還須要從item全集中隨機抽樣,選取與正樣本數量至關的樣本做爲負樣本,規定興趣度爲RUI=0。所以,興趣的取值範圍爲[0,1]。
採樣以後原有的數據集獲得擴充,獲得一個新的user-item集K={(U,I)},其中若是(U,I)是正樣本,則RUI=1,不然RUI=0。損失函數以下所示:
上式中的
是用來防止過擬合的正則化項,λ須要根據具體應用場景反覆實驗獲得。損失函數的優化使用隨機梯度降低算法:
- 經過求參數PUK和QKI的偏導肯定最快的降低方向;
- 迭代計算不斷優化參數(迭代次數事先人爲設置),直到參數收斂。
其中,α是學習速率,α越大,迭代降低的越快。α和λ同樣,也須要根據實際的應用場景反覆實驗獲得。本書中,做者在
MovieLens
數據集上進行實驗,他取分類數F=100,α=0.02,λ=0.01。
【注意】:書中在上面四個式子中都缺乏了
綜上所述,執行LFM須要:
- 根據數據集初始化P和Q矩陣(這是我暫時沒有弄懂的地方,這個初始化過程究竟是怎麼樣進行的,還懇請各位童鞋予以賜教。)
- 肯定4個參數:分類數F,迭代次數N,學習速率α,正則化參數λ。
LFM的僞代碼能夠表示以下:學習
- def LFM(user_items, F, N, alpha, lambda):
- #初始化P,Q矩陣
- [P, Q] = InitModel(user_items, F)
- #開始迭代
- For step in range(0, N):
- #從數據集中依次取出user以及該user喜歡的iterms集
- for user, items in user_item.iterms():
- #隨機抽樣,爲user抽取與items數量至關的負樣本,並將正負樣本合併,用於優化計算
- samples = RandSelectNegativeSamples(items)
- #依次獲取item和user對該item的興趣度
- for item, rui in samples.items():
- #根據當前參數計算偏差
- eui = eui - Predict(user, item)
- #優化參數
- for f in range(0, F):
- P[user][f] += alpha * (eui * Q[f][item] - lambda * P[user][f])
- Q[f][item] += alpha * (eui * P[user][f] - lambda * Q[f][item])
- #每次迭代完後,都要下降學習速率。一開始的時候因爲離最優值相差甚遠,所以快速降低;
- #當優化到必定程度後,就須要放慢學習速率,慢慢的接近最優值。
- alpha *= 0.9
當估算出P和Q矩陣後,咱們就可使用(*)式計算用戶U對各個item的興趣度值,並將興趣度值最高的N個iterm(即TOP N)推薦給用戶。
總結來講,LFM具備成熟的理論基礎,它是一個純種的學習算法,經過最優化理論來優化指定的參數,創建最優的模型。
[使用LFM(Latent factor model)隱語義模型進行Top-N推薦]
[主題模型LDA及其在微博推薦&廣告算法中的應用]
皮皮blog
LDA主題模型用於BUG修復人推薦
[缺陷修復人預測(Bug Triaging)]
[LDA主題模型用於BUG修復人推薦《DRETOM: developer recommendation based on topic models for bug resolution》]
[主題模型在文本挖掘中的應用.pdf]
from:
http://blog.csdn.net/pipisorry/article/details/45665779
ref: