導航:首頁 > 編程語言 > lda模型java實現

lda模型java實現

發布時間:2023-07-04 08:56:07

1. LDA 原理說明

LDA為latent Dirichlet allocation的簡稱,是一個生成式模型,是一種主題模型,無監督度學習方法。其基本假設是一篇文檔是一個詞袋,由多個片語成,與詞的順序無關,它可以有多個主題(topic),並且文檔中的詞都和這些主題相關。這里使用sparse dirichlet的原因是,一個主題中的詞的概率分布是被修剪過得,所以僅有一小部分詞的概率較大,這就和實際場景更加貼近

先定義幾個簡寫表示:
①詞袋錶示為D,詞袋中有V個詞,裡面有M篇文檔,每個文檔的長度為Ni(文檔中含有N個詞);
②α為每個文檔的主題分布的先驗dirichlet分布的參數;(這里簡單說明一下dirichlet分布,見文章最後)
③β為每個主題詞分布的先驗dirichlet分布的參數 ;
④Θi文檔i的主題分布,為多項式分布,但受到參數為α的Dirichlet先驗分布控制;
⑤φk為主題k的詞分布,k∈[0,K],為多項式分布,但受到參數為β的Dirichlet先驗分布控制;
⑥ωij為具體的詞,這是和①中的已知量,其他的均為變數;
⑦zij為第i篇文檔的第j個詞的主題;

統計說明如下:

從dirichlet分布α中取樣生成文檔i的主題分布Θ i (Θ i ~Dir(α),α<1)

從主題k的多項式分布φ k 中取樣生成的文檔i的第j個詞的主題z ij

從dirichlet分布β中取樣生成主題詞z ij 的詞語分布φz ij

從詞語的多項式分布φz ij 中重采樣最終生成詞語ω ij

那麼,模型的聯合分布(生成詞w的概率)為:

最終,文檔i的單詞分布集對Θ i 、φ求積分,對z ij 求和,(因為有一篇文檔假設由K個主題組成,每個主題k滿足多項式分布,並且文檔包含j個詞)得到:

根據p(ω i |α,β)的最大似然估計,最終可以通過EM/吉布斯采樣估計出模型中的參數。

對文檔中的所有詞遍歷一遍為其隨機分配一個主題(zij),即zij符合mult(1/K),將文檔i中k主題出現的次數、文檔i中主題數量和、k主題對應的某個詞的次數、主題k的總詞數,這4個變數都加1。
之後,開始重復迭代尋優。

例如,文檔i的詞ωij對應的主題為k,根據LDA中topic sample的概率分布sample出新的主題,更新對應的上述4個變數分布加1

迭代完成後,輸出主題-詞參數矩陣φ和文檔-主題矩陣Θ

beta分布的x∈[0,1],是實數,概率密度為x (α-1)(1-x) (β-1),其中α,β>0,這和bernoulli 分布形式上類似,但是bernoulli的x取值為0或1。

當選擇不同α和β時,beta分布的pdf為:

說明:

pdf為連續型變數的概率密度函數

beta分布是針對一個x變數,dirichlet分布是針對多個隨機變數,通常標記為Dir(α),表示連續多元概率分布,參數α>0,是beta分布的擴展,通常被用於貝葉斯統計中的一種先驗分布。

對於兩個隨機變數(k=2)的pdf分布如下圖:

dirichlet分布的pd如下所示:

共軛:假定一個先驗分布A,將該先驗分布的參數帶入另外的一個分布中,得到後驗證分布,如果該後驗分布和該先驗分布有相同的形式,則稱為共軛(conjugacy)。

beta分布是bernoulli(二項式分布)的共軛先驗分布為共軛,dirichlet為multinomial(多項式分布)的共軛先驗分布。

參考鏈接:

<u>https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation</u>

https://blog.csdn.net/MeituanTech/article/details/80804170

wiki中文版

2. 我是這樣一步步理解--主題模型(Topic Model)、LDA(案例代碼)

LDA可以分為以下5個步驟:

關於LDA有兩種含義,一種是線性判別分析(Linear Discriminant Analysis),一種是概率主題模型: 隱含狄利克雷分布(Latent Dirichlet Allocation,簡稱LDA) ,本文講後者。

按照wiki上的介紹,LDA由Blei, David M.、Ng, Andrew Y.、Jordan於2003年提出,是一種主題模型,它可以將文檔集 中每篇文檔的主題以概率分布的形式給出,從而通過分析一些文檔抽取出它們的主題(分布)出來後,便可以根據主題(分布)進行主題聚類或文本分類。同時,它是一種典型的詞袋模型,即一篇文檔是由一組詞構成,詞與詞之間沒有先後順序的關系。此外,一篇文檔可以包含多個主題,文檔中每一個詞都由其中的一個主題生成。

人類是怎麼生成文檔的呢?首先先列出幾個主題,然後以一定的概率選擇主題,以一定的概率選擇這個主題包含的詞彙,最終組合成一篇文章。如下圖所示(其中不同顏色的詞語分別對應上圖中不同主題下的詞)。

那麼LDA就是跟這個反過來: 根據給定的一篇文檔,反推其主題分布。

在LDA模型中,一篇文檔生成的方式如下:

其中,類似Beta分布是二項式分布的共軛先驗概率分布,而狄利克雷分布(Dirichlet分布)是多項式分布的共軛先驗概率分布。此外,LDA的圖模型結構如下圖所示(類似貝葉斯網路結構):

先解釋一下以上出現的概念。

至此,我們可以看到二項分布和多項分布很相似,Beta分布和Dirichlet 分布很相似。

如果想要深究其原理可以參考: 通俗理解LDA主題模型 ,也可以先往下走,最後在回過頭來看詳細的公式,就更能明白了。

總之, 可以得到以下幾點信息。

在講LDA模型之前,再循序漸進理解基礎模型:Unigram model、mixture of unigrams model,以及跟LDA最為接近的pLSA模型。為了方便描述,首先定義一些變數:

反過來,既然文檔已經產生,那麼如何根據已經產生好的文檔反推其主題呢?這個利用看到的文檔推斷其隱藏的主題(分布)的過程(其實也就是產生文檔的逆過程),便是 主題建模的目的:自動地發現文檔集中的主題(分布)。

文檔d和詞w是我們得到的樣本,可觀測得到,所以對於任意一篇文檔,其 是已知的。從而可以根據大量已知的文檔-詞項信息 ,訓練出文檔-主題 和主題-詞項 ,如下公式所示:

故得到文檔中每個詞的生成概率為:

由於 可事先計算求出,而 和 未知,所以 就是我們要估計的參數(值),通俗點說,就是要最大化這個θ。

用什麼方法進行估計呢,常用的參數估計方法有極大似然估計MLE、最大後驗證估計MAP、貝葉斯估計等等。因為該待估計的參數中含有隱變數z,所以我們可以考慮EM演算法。詳細的EM演算法可以參考之前寫過的 EM演算法 章節。

事實上,理解了pLSA模型,也就差不多快理解了LDA模型,因為LDA就是在pLSA的基礎上加層貝葉斯框架,即LDA就是pLSA的貝葉斯版本(正因為LDA被貝葉斯化了,所以才需要考慮歷史先驗知識,才加的兩個先驗參數)。

下面,咱們對比下本文開頭所述的LDA模型中一篇文檔生成的方式是怎樣的:

LDA中,選主題和選詞依然都是兩個隨機的過程,依然可能是先從主題分布{教育:0.5,經濟:0.3,交通:0.2}中抽取出主題:教育,然後再從該主題對應的詞分布{大學:0.5,老師:0.3,課程:0.2}中抽取出詞:大學。

那PLSA跟LDA的區別在於什麼地方呢?區別就在於:

PLSA中,主題分布和詞分布是唯一確定的,能明確的指出主題分布可能就是{教育:0.5,經濟:0.3,交通:0.2},詞分布可能就是{大學:0.5,老師:0.3,課程:0.2}。
但在LDA中,主題分布和詞分布不再唯一確定不變,即無法確切給出。例如主題分布可能是{教育:0.5,經濟:0.3,交通:0.2},也可能是{教育:0.6,經濟:0.2,交通:0.2},到底是哪個我們不再確定(即不知道),因為它是隨機的可變化的。但再怎麼變化,也依然服從一定的分布, 即主題分布跟詞分布由Dirichlet先驗隨機確定。正因為LDA是PLSA的貝葉斯版本,所以主題分布跟詞分布本身由先驗知識隨機給定。

換言之,LDA在pLSA的基礎上給這兩參數 加了兩個先驗分布的參數(貝葉斯化):一個主題分布的先驗分布Dirichlet分布 ,和一個詞語分布的先驗分布Dirichlet分布 。

綜上,LDA真的只是pLSA的貝葉斯版本,文檔生成後,兩者都要根據文檔去推斷其主題分布和詞語分布(即兩者本質都是為了估計給定文檔生成主題,給定主題生成詞語的概率),只是用的參數推斷方法不同,在pLSA中用極大似然估計的思想去推斷兩未知的固定參數,而LDA則把這兩參數弄成隨機變數,且加入dirichlet先驗。

所以,pLSA跟LDA的本質區別就在於它們去估計未知參數所採用的思想不同,前者用的是頻率派思想,後者用的是貝葉斯派思想。

LDA參數估計: Gibbs采樣 ,詳見文末的參考文獻。

推薦系統中的冷啟動問題是指在沒有大量用戶數據的情況下如何給用戶進行個性化推薦,目的是最優化點擊率、轉化率或用戶 體驗(用戶停留時間、留存率等)。冷啟動問題一般分為用戶冷啟動、物品冷啟動和系統冷啟動三大類。

解決冷啟動問題的方法一般是基於內容的推薦。以Hulu的場景為例,對於用 戶冷啟動來說,我們希望根據用戶的注冊信息(如:年齡、性別、愛好等)、搜 索關鍵詞或者合法站外得到的其他信息(例如用戶使用Facebook賬號登錄,並得 到授權,可以得到Facebook中的朋友關系和評論內容)來推測用戶的興趣主題。 得到用戶的興趣主題之後,我們就可以找到與該用戶興趣主題相同的其他用戶, 通過他們的歷史行為來預測用戶感興趣的電影是什麼。

同樣地,對於物品冷啟動問題,我們也可以根據電影的導演、演員、類別、關鍵詞等信息推測該電影所屬於的主題,然後基於主題向量找到相似的電影,並將新電影推薦給以往喜歡看這 些相似電影的用戶。 可以使用主題模型(pLSA、LDA等)得到用戶和電影的主題。

以用戶為例,我們將每個用戶看作主題模型中的一篇文檔,用戶對應的特徵 作為文檔中的單詞,這樣每個用戶可以表示成一袋子特徵的形式。通過主題模型 學習之後,經常共同出現的特徵將會對應同一個主題,同時每個用戶也會相應地 得到一個主題分布。每個電影的主題分布也可以用類似的方法得到。

那麼如何解決系統冷啟動問題呢? 首先可以得到每個用戶和電影對應的主題向量,除此之外,還需要知道用戶主題和電影主題之間的偏好程度,也就是哪些主題的用戶可能喜歡哪些主題的電影。當系統中沒有任何數據時,我們需要一些先驗知識來指定,並且由於主題的數目通常比較小,隨著系統的上線,收集到少量的數據之後我們就可以對主題之間的偏好程度得到一個比較准確的估計。

通俗理解LDA主題模型

LDA模型應用:一眼看穿希拉里的郵件

【 機器學習通俗易懂系列文章 】

3. 請問那位高人有關於人臉識別lda演算法的實例,帶圖片庫最好,謝謝

clc
clear all
close all
clear memory
nump=40; %no_of_classes
nots=5; %no_of_training_set
D=pwd;
cd([D, '\ORLDatabase']);
[face,MAP]=imread('face1.bmp');
[a,b]=size(face);
counter=0;
for i=1:nump
for j=1:nots
file=['face' int2str((i-1)*10+j) '.bmp'];
[face,MAP]=imread(file);
grayface=ind2gray(face,MAP);
counter=counter+1;
X(counter,:)=double(reshape(grayface,a*b,1));
end
end
counter=0;
for i=1:nump
for j=nots+1:10
file=['face' int2str((i-1)*10+j) '.bmp'];
[face,MAP]=imread(file);
grayface=ind2gray(face,MAP);
counter=counter+1;
Y(counter,:)=double(reshape(grayface,a*b,1));
end
end
cd(D)
clear memory
clc
AVERAGE=mean(x')';
Average_Matrix=(ones(noc*nots,1)*AVERAGE')';
clear memory
Difference=double(x)-double(Average_Matrix);
[V,L]=eig(Difference'*Difference);
clear memory
[rr,cc]=size(L);
maxL=min(min(L));
for i=1:rr
for j=1:cc
if L(i,j)>maxL
maxL=L(i,j);
ii=i;
jj=j;
end
end
end
v=V(:,jj);
Lamda=max(max(L));
clear memory
counter=1;
for i=1:nump
for j=1:nots
new_X(counter,:)=v(i,:)'*(x(:,counter))';
counter=counter+1;
end
end
clear memory
counter=1;
for i=1:nump
for j=1:3-nots
new_Y(counter,:)=v(i,:)'*(y(:,counter))';
counter=counter+1;
end
end
clear memory

counter=0;holder=0;
for i=1:nump*(3-nots)
error=[];
for j=1:nump*nots
temp=(new_X(j,:)-new_Y(i,:));
distance=sqrt(temp*temp');
error=[error distance];
end
clear memory
Minimum_Error=max(error);
for k=1:nump*nots
if error(k)<Minimum_Error
Minimum_Error=error(k);
holder=k;
end
end
if ceil(holder/nots)==ceil(i/(3-nots))
counter=counter+1;
end
clear memory
end
clear memory
clear new_Y new_X v x y error Minimum_Error
LDA_Performance=(counter/(noc*(3-nots)))*100
clear counter

閱讀全文

與lda模型java實現相關的資料

熱點內容
逍遙安卓微信驗證 瀏覽:579
5g網路什麼時候普及河北邢台 瀏覽:709
編程和運營哪個更適合創業 瀏覽:893
尤里x怎麼升級 瀏覽:399
做業務績效考核需要哪些數據 瀏覽:433
dnf85版本劍魔刷圖加點 瀏覽:407
手機硬碟測試架可以讀取哪些數據 瀏覽:704
ug前後處理結算結果找不到文件 瀏覽:769
網頁框架拆分代碼 瀏覽:382
未來十年網路安全有什麼影響 瀏覽:362
win10更新後進不了劍靈 瀏覽:243
iphone471激活出錯 瀏覽:648
怎麼把文件拷到u盤 瀏覽:620
中伊簽署文件視頻 瀏覽:661
電信光寬頻網路不穩定 瀏覽:504
網路崗軟路由 瀏覽:995
黑莓z10在哪裡下載app 瀏覽:310
net批量下載文件 瀏覽:696
怎麼把蘋果一體機文件拷貝 瀏覽:117
sql文件怎麼寫 瀏覽:9

友情鏈接