機器學習 LDA初始和應用

2021-08-21 00:22:21 字數 3419 閱讀 6982

一、前述

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 維子...