一、前述
lda是一種非監督機器學習技術,可以用來識別大規模文件集(document collection)或語料庫(corpus)中潛藏的主題資訊。它採用了詞袋(bag of words)的方法,這種方法將每一篇文件視為乙個詞頻向量,從而將文字資訊轉化為了易於建模的數字資訊。但是詞袋方法沒有考慮詞與詞之間的順序,這簡化了問題的複雜性,同時也為模型的改進提供了契機。每一篇文件代表了一些主題所構成的乙個概率分布,而每乙個主題又代表了很多單詞所構成的乙個概率分布。由於 dirichlet分布隨機向量各分量間的弱相關性(之所以還有點「相關」,是因為各分量之和必須為1),使得我們假想的潛在主題之間也幾乎是不相關的,這與很多實際問題並不相符,從而造成了lda的又乙個遺留問題。
二、具體過程
對於語料庫中的每篇文件,lda定義了如下生成過程(generativeprocess):
1.對每一篇文件,從主題分布中抽取乙個主題;
2.從上述被抽到的主題所對應的單詞分布中抽取乙個單詞;
3.重複上述過程直至遍歷文件中的每乙個單詞。
語料庫中的每一篇文件與t(通過反覆試驗等方法事先給定)個主題的乙個多項分布 (multinomialdistribution)相對應,將該多項分布記為θ。每個主題又與詞彙表(vocabulary)中的v個單詞的乙個多項分布相對應,將這個多項分布記為φ。
三、案例
高斯分為主題二,是因為有一定的概率。
如此反覆,當各個概率分布不再發生變化時,即完成了收斂和訓練過程
訓練思想仍然是em演算法(摁住乙個,去計算另乙個)
對比k-means
實際工程過程中:
每乙個主題對每乙個詞都有乙個基本出現次數(人工設定)
每一篇文章在各個主題上都有乙個基本出現詞數
步驟:
1.根據主題分布和主題-單詞模型,找尋每個
單詞所對應的主題
2.根據單詞主題重新確定主題分布
1,2反覆,直到主題分布穩定 最終得到兩個模型:
1.每篇文章的主題分布
2.每個主題產生詞的概率
用途:
1.根據文章的主題分布,計算文章之間的相似性
2.計算各個詞語之間的相似度
四、**
# -*- coding: utf-8 -*-
import jieba
from sklearn.feature_extraction.text import countvectorizer
from sklearn.decomposition import latentdirichletallocation
for i in range(4):
with open('./data/nlp_test%d.txt' % i, encoding='utf-8') as f:
document = f.read()
document_cut = jieba.cut(document)
result = ' '.join(document_cut)
print(result)
with open('./data/nlp_test%d.txt' % (i+10), 'w', encoding='utf-8') as f2:
f2.write(result)
f.close()
f2.close()
# 從檔案匯入停用詞表
stpwrdpath = "./data/stop_words.txt"
stpwrd_dic = open(stpwrdpath, 'r', encoding='utf-8')
stpwrd_content = stpwrd_dic.read()
# 將停用詞表轉換為list
stpwrdlst = stpwrd_content.splitlines()
stpwrd_dic.close()
print(stpwrdlst)
# 向量化 不需要tf_idf
corpus =
for i in range(4):
with open('./data/nlp_test%d.txt' % (i+10), 'r', encoding='utf-8') as f:
res = f.read()
print(res)
cntvector = countvectorizer(stop_words=stpwrdlst)
cnttf = cntvector.fit_transform(corpus)
print(cnttf)
# 列印輸出對應關係
# 獲取詞袋模型中的所有詞
wordlist = cntvector.get_feature_names()
# 元素a[i][j]表示j詞在i類文字中的權重
weightlist = cnttf.toarray()
# 列印每類文字的詞語權重,第乙個for遍歷所有文字,第二個for便利某一類文字下的詞語權重
for i in range(len(weightlist)):
print("-------第", i, "段文字的詞語權重------")
for j in range(len(wordlist)):
print(wordlist[j], weightlist[i][j])
lda = latentdirichletallocation(n_components=3,#3個話題
learning_method='batch',
random_state=0)
docres = lda.fit_transform(cnttf)
print(docres)
print("主題的詞分布如下:")
print(lda.components_)
機器學習公式推導 LDA
lda是一種降維的演算法,也可以用來做特徵選擇和聚類。以二維平面為例,平面上有2類樣本點,我們希望將二維平面上的2類樣本點投影到一條直線上,從二維到一維,這可不就降維了嗎?那麼怎麼找到最合適的投影的直線呢?我們期望的目標是,投影之後,同類之間靠得更近,異類之間離得更遠,也就是類內小,類間大。lda的...
機器學習 主題模型(二) pLSA和LDA
plsa概率潛在語義分析 lda潛在狄瑞雷克模型 plsa 有過擬合問題,就是求d,z,w plsa由lsa發展過來,而早期lsa的實現主要是通過svd分解。plsa的模型圖如下 公式中的意義如下 具體可以參考2010龍星計畫 機器學習中對應的主題模型那一講 在 googlenews persona...
機器學習 LDA與PCA演算法
linear discriminant analysis 用途 資料預處理中的降維,分類任務 歷史 ronald a.fisher在1936年提出了線性判別方法 線性判別分析 lda 目標 lda關心的是能夠最大化類間區分度的座標軸成分 將特徵空間 資料集中的多維樣本 投影到乙個維度更小的 k 維子...