1. 程式人生 > >LDA的python實現之模型引數訓練

LDA的python實現之模型引數訓練

原文地址 http://blog.csdn.net/u010551621/article/details/45258573

最近看了不少關於主題模型的東西,要說起主題模型,現在最火的當然是LDA, LDA全稱是Latent Dirichlet Allocation(隱狄利克雷分佈), 而不是Linear Discriminant Analysis, 相信大家很多都對lda的理解感到痛苦不已,因為裡面涉及到的數學推導實在是太多了,從gamma函式,beta分佈,狄利克雷分佈,馬爾可夫蒙特卡洛模型,看到都覺得反胃,不過今天,我們不從這些來說,就跟大家分析一下怎麼從工程上去實現整個LDA

實現之前還是來說一下LDA的起源:

先上一張來自Blei大師之手的圖,簡單的說一下吧, theta代表文件-主題分佈,在工程上可以理解為一個矩陣,如果整個文件語料庫包含的詞是|W|,包含的文件數是|D|,那麼矩陣的大小就是|D| * |W|,直觀的來說,這個矩陣中儲存的值theta[d][z]表示的是文件d中被分派給主題z的詞的個數,更具體的,我們可以認為它就是p(z|d)


主題模型是一種生成模型,什麼是生成模型呢,比如我們在構思一篇文件:(1)我們要選擇文章的主題,一個主題中可能有多個詞; (2)我們現在就要從這個主題中選擇我們想要的詞;第一個部分的概率就是p(z|d),表示在給定文件d,出現主題z的概率;

舉一個例子(例子來源於 Rich jin的LDA數學八卦): 

我們平時在構造一篇自然語言處理的文章時,可能會有40%的概率談論語言學,30%的概率談論概率統計,20%的概率談論計算機,還有10%談論其他主題;選定了主題之後,我們執行第二部,選詞,那正常情況下,我們是怎麼選詞的呢?

  • 說到語言學:我們一般會想到 語法,句子,喬姆斯基,據法分析,主語這些詞
  • 談到概率統計,我們也很容易想到詞:概率,模型,均值,方差,證明,獨立,馬爾可夫鏈
  • 說到計算機,我們也能聯想到 記憶體,硬碟,程式設計,二進位制,物件,演算法,複雜度這些詞
為什麼能聯想到這些詞,因為在我們的認知下,這些詞出現的頻率比較高,換句話說,我們接觸的這些詞比較多,比較頻繁,所以我們能在確定主題之後很快的從這些詞中選擇一個
這些是前話,現在來開始說一下工程上怎麼實現吧,我自己是用python來寫的,在這裡跟大家分享一下 首先是LDA模型的類定義:
  1. class LDAModel:  
  2.     alpha = float      #超引數alpha
  3.     beta = float       #超引數beta
  4.     D = int            #文件數目
  5.     K = int            #主題個數
  6.     W = int            #詞的個數
  7.     NumberOfIterations = int   #迭代次數
  8.     SaveStep = int     #儲存的步數
  9.     Dictionary = object  #整個語料的詞典
  10.     Z = object         # D * doc.size()大小的矩陣,Z[i][j]表示第i文件的第j個詞背分配的主題
  11.     W = object         # D * doc.size()大小的矩陣, W[i][j]表示第i文件的第j個詞
  12.     IDListSet = object  # D * doc.size()大小的矩陣, IDListSet[i][j]表示第i篇文件的第j個詞在詞典中的編號
  13.     nw = object        # W * K 大小的矩陣, nw[w][z]表示詞w被分配到主題z的次數
  14.     nd = object        # D * K 大小的矩陣,nd[d][z]文件d中被分配為主題z的詞的個數
  15.     nwsum = object     # K * 1 大小的向量,nwsum[z]表示主題z中包含的詞的個數
  16.     ndsum = object     # D * 1 大小的向量,ndsum[d]表示文件d中包含的詞的個數
  17.     theta = object     # D * K 大小的矩陣,p(z|d) = theta[d][z]
  18.     phi = object       # K * V 大小的矩陣,p(w|z) = phi[z][w]
具體我就不說這些成員的意思,註釋上都有, 首先是建構函式,這裡要說明的是,在工程上,alpha一般取50/K, beta一般取0.01,吉布斯抽樣的迭代次數一般為1000次、
  1. def __init__(self, alpha, beta, NumberOfIterations, SaveStep, K):  
  2.     self.alpha = alpha  
  3.     self.beta = beta  
  4.     self.NumberOfIterations = NumberOfIterations  
  5.     self.SaveStep = SaveStep  
  6.     self.K = K  
  7.     #初始化大小為K * 1的向量,初始值為0
  8.     self.nwsum = ListUtil.Initial(self.K)  
有一些列表工具類的方法我已經打包了,先列出來
  1. #ListUtil.py
  1. import string  
  2. def Normalize(list, smoother=0.0):  
  3.     """ 
  4.     對向量list進行歸一化處理,得到每個元素出現的概率 
  5.     :param list: 向量 
  6.     :param smoother: 平滑值,預設值為0; 為了防止0概率的出現 
  7.     """
  8.     sum = Sum(list)  
  9.     K = len(list)  
  10.     newlist = []  
  11.     if sum > 0:  
  12.         newlist = [float((item + smoother) / (sum + K * smoother)) for item in list]  
  13.     return newlist  
  14. def Sum(list):  
  15.     """ 
  16.     計算list中所有元素的和 
  17.     """
  18.     res = 0
  19.     for item in list:  
  20.         res += item  
  21.     return res  
  22. def Initial(size, data=0):  
  23.     """ 
  24.     生成一個大小為size, 所有元素都為data的列表 
  25.     :param size: 列表大小 
  26.     :param data: 列表元素 
  27.     """
  28.     list = []  
  29.     for i in xrange(size):  
  30.         list.append(data)  
  31.     return list  
  32. def InitialMat(M, N, data=0):  
  33.     """ 
  34.     初始化大小為M * N的矩陣,所有元素初始化為data 
  35.     :param M: 
  36.     :param N: 
  37.     :param data: 矩陣元素 
  38.     """
  39.     mat = []  
  40.     for i in xrange(M):  
  41.         row = Initial(N, data)  
  42.         mat.append(row)  
  43.     return mat  
  44. def InitialEmptyMat(rows):  
  45.     """ 
  46.     初始化一個空的matrix 
  47.     :param rows: 
  48.     """
  49.     mat = []  
  50.     for i in xrange(rows):  
  51.         tmp = []   #代表每一個文件包含的詞,初始化為空
  52.         mat.append(tmp)  
  53.     return mat  
  54. def toString(list):  
  55.     """ 
  56.     將list中的元素拼接成字串 
  57.     方便用作檔案操作 
  58.     :param list: 列表元素 
  59.     """
  60.     listStr = ""  
  61.     count = 0
  62.     for ele in list:  
  63.         if type(ele) == int:  
  64.             eleStr = str(ele)  
  65.         elif type(ele) == float:  
  66.             #浮點數轉換為字串,保留8位小數
  67.             eleStr = str("%.10f"%ele)  
  68.         elif type(ele) == str or type(ele) == unicode:  
  69.             eleStr = ele  
  70.         if count != len(list) - 1:  
  71.             eleStr += " "
  72.         count += 1
  73.         listStr += eleStr  
  74.     listStr += "\n"
  75.     return listStr  
  76. def StringToFloatList(SS):  
  77.     """ 
  78. 相關推薦

    LDA的python實現模型引數訓練

    原文地址 http://blog.csdn.net/u010551621/article/details/45258573 最近看了不少關於主題模型的東西,要說起主題模型,現在最火的當然是LDA, LDA全稱是Latent Dirichlet Allocatio

    Tensorflow模型引數的Saver儲存讀取

    一、Saver儲存 import tensorflow as tf import numpy as np #定義W和b W = tf.Variable([[1,2,3],[3,5,6]],dtype = tf.float32,name = 'weight') b = tf.Variable([

    [TensorFlow深度學習入門]實戰八·簡便方法實現TensorFlow模型引數儲存與載入(pb方式)

    [TensorFlow深度學習入門]實戰八·簡便方法實現TensorFlow模型引數儲存與載入(pb方式) 在上篇博文中,我們探索了TensorFlow模型引數儲存與載入實現方法採用的是儲存ckpt的方式。這篇博文我們會使用儲存為pd格式檔案來實現。 首先,我會在上篇博文基礎上,實現由c

    [TensorFlow深度學習入門]實戰七·簡便方法實現TensorFlow模型引數儲存與載入(ckpt方式)

    [TensorFlow深度學習入門]實戰七·簡便方法實現TensorFlow模型引數儲存與載入(ckpt方式) TensorFlow模型訓練的好網路引數如果想重複高效利用,模型引數儲存與載入是必須掌握的模組。本文提供一種簡單容易理解的方式來實現上述功能。參考部落格地址 備註: 本文采用的

    論文Multi-Perspective Sentence Similarity Modeling with Convolution Neural Networks實現網路模型搭建及訓練

    環境: Python3.6 Tensorflow-GPU 1.8.0 本文所實現的網路模型是在https://blog.csdn.net/liuchonge/article/details/64440110的基礎上搭建的,不同的是為了應對loss為NAN的情況,本文在每一層卷積的後面

    學習筆記TF016:CNN實現、數據集、TFRecord、加載圖像、模型訓練、調試

    quest oba lose 神經元 byte 足夠 jpg eight 值轉換 AlexNet(Alex Krizhevsky,ILSVRC2012冠軍)適合做圖像分類。層自左向右、自上向下讀取,關聯層分為一組,高度、寬度減小,深度增加。深度增加減少網絡計算量。 訓練模

    [Kaggle] dogs-vs-cats模型訓練

    naconda lob flow 技術分享 prot merge efault int app 上一步建立好模型之後,現在就可以訓練模型了。 主要代碼如下: import sys #將當期路徑加入系統path中 sys.path.append("E:\\CODE\

    tensorflow 模型訓練後的引數restore finetuning

    之前訓練的網路中有一部分可以用到一個新的網路中,但是不知道儲存的引數如何部分恢復到新的網路中,也瞭解到有許多網路是通過利用一些現有的網路結構,通過finetuning進行改造實現的,因此瞭解了一下關於模型預訓練後部分引數restore和finetuning的內容 更多內容參見: http

    實現yolo3模型訓練自己的資料集總結

         經過兩天的努力,借鑑網上眾多部落格,在自己電腦上實現了使用yolo3模型訓練自己的資料集並進行測試圖片。本文主要是我根據下面參考文章一步步實施過程的總結,可能沒參考文章中那麼詳細,但是會包含一些參考文章中沒提及的容易掉坑的小細節,建議讀者結合參考文章一起看,一

    keras讀取訓練好的模型引數並把引數賦值給其它模型

    介紹 本博文中的程式碼,實現的是載入訓練好的模型model_halcon_resenet.h5,並把該模型的引數賦值給兩個不同的新的model。 函式式模型 官網上給出的呼叫一個訓練好模型,並輸出任意層的feature。 model = Model(inputs=base_mod

    UnityShader開發光照 - 簡單光照模型 - Phong反射光模型引數分析

    1.概念 light color = emissive + ambient + diffuse + specluar emissive:自發光 ambient:環境光 diffuse :漫反射光 specluar:鏡面光   Phong模型 鏡面光公式

    機器學習模型選擇(K折交叉驗證,超引數的選擇)

    來源: https://www.cnblogs.com/jerrylead/archive/2011/03/27/1996799.html   對於解決同一個問題,如怎麼選擇模型去擬合線性迴歸中只有一個特徵時房價預測問題,如可能有不同的模型去解決,如: 1、d = 1,h(

    程世東老師TensorFlow實戰——個性化推薦,程式碼學習筆記模型訓練與測試

    個性化推薦第二部分:模型訓練 程式碼來自於知乎:https://zhuanlan.zhihu.com/p/32078473 /程式碼地址https://github.com/chengstone/movie_recommender/blob/master/movie_recommender.

    TensorFlow實現模型斷點訓練,checkpoint模型載入

    深度學習中,模型訓練一般都需要很長的時間,由於很多原因,導致模型中斷訓練,下面介紹繼續斷點訓練的方法。 方法一:載入模型時,不必指定迭代次數,一般預設最新 # 儲存模型 saver = tf.train.Saver(max_to_keep=1) # 最多保留最新的模型 # 開啟會話 w

    機器學習模型評估與引數調優

    一、流水線工作流        在利用訓練資料對模型進行擬合時已經得到一些引數,使用流水線可以避免在將模型用於新資料時重新設定這些引數。利用sklearn中的Pipline類,使得我們可以擬合出包含任意多個處理步驟的模型,並將模型用於新資料的預測。 1. # Title

    Slog69_實現一個帶引數的雲函式GET!(微信小程式雲開發-全棧時代2)

    ArthurSlog SLog-69 Year·1 Guangzhou·China Sep 11th 2018 禍兮福之所倚 福兮禍之所伏 開發環境MacOS(High Sierra 10.13.5) 需要的資訊和資訊源: 前言 騰訊推出“雲開發”概

    初識TensorFlow將自己訓練好的模型遷移到電腦攝像頭和外接海康攝像頭上,並在視訊中實時檢測

    有了訓練好的模型之後,可以將模型遷移到電腦或者手機上 電腦: # -*- coding: utf-8 -*- """ @author: Terry n """ # Imports import numpy as np import os import sys impor

    pytorch學習筆記載入預訓練模型

    原文:https://blog.csdn.net/weixin_41278720/article/details/80759933  pytorch自發布以來,由於其便捷性,贏得了越來越多人的喜愛。 Pytorch有很多方便易用的包,今天要談的是torchvision包,

    [ pytorch ] ——基本使用:(2) 訓練好的模型引數的儲存以及呼叫

    1、儲存與呼叫 def modelfunc(nn.Module): # 之前定義好的模型 # 由於pytorch沒有像keras那樣有儲存模型結構的API,因此,每次load之前必須找到模型的結構。 model_object = modelfunc # 匯入模

    機器學習主題模型LDA引數求解——Gibbs取樣

    LDA引數推導的Gibbs取樣方法基於馬爾科夫鏈蒙特卡洛方法,因此首先學習MCMC方法。 一、馬爾科夫鏈蒙特卡洛方法 MCMC(Markov Chain Monte Carlo)方法是構造適合的馬爾科夫鏈,使其平穩分佈為待估引數的後驗分佈,抽樣並使用蒙特卡洛方法進行積