介绍LDA是文档分类的经典算法。你可以看看它是如何应用于推荐系统的。LatentDirichletAllocation(LDA)是一种主题建模算法,用于在语料库中无监督地发现基础主题。它已广泛应用于各个领域,特别是在自然语言处理和推荐系统中。这篇博文将带你从LDA的概述到详细的技术讲解,最后我们将讨论LDA在推荐系统中的应用!概述LDA是语料库/文档的生成概率模型。它基于单词和文档可以互换的“词袋”假设。即忽略文档中单词的顺序,或者忽略文档的顺序。基本思想是每篇文档由不同的主题组成,每个主题由词的分布来描述。每个文档都包含一个主题分布,每个主题由一个单词分布表示。LDA假设单个文档是通过从每个文档中抽取主题,然后从每个提取的主题中抽取单词来生成的。为了获得正确的单词和主题分布,我们可以使用吉布斯采样、最大后验概率(MAP)或期望最大化(EM)来训练LDA。车牌表示为了更深入一点,让我们讨论LDA的符号表示法。在贝叶斯推理中,Platenotation是一种图形表示随机变量采样重复过程的方法。每个盘子都可以看作是一个“循环”,其中盘子右下角的变量代表循环的迭代次数。下面是LDA的Plate表示。LDA车牌符号在上图中有两个组成部分。在上图中,有K个主题,其词的狄利克雷分布由超参数β控制。同样,下表描述了有M个文档,每个文档包含N个单词。灰色圆圈w是观察到的词,圆圈代表不同的潜在变量。z指与w相关联的主题,θ是文档主题的Dirichlet分布,由另一个超参数?控制。生成过程现在我们大致了解了如何使用车牌符号生成文档。让我们用数学来表示它。来自狄利克雷分布的样本θ(θ_i~Dir(?),i从1到M)来自另一个狄利克雷分布的样本φ(φ_k~Dir(β)k从1到K)来自z_ij的样本φ~Multinomial(θ_i)采样,从w_ij~Multinomial(φ_z_ij)中采样,i是从1到M,j是从1到N。以《纽约时报》为例。首先,对于每篇新闻文章,我们对整个文档的主题分布θ_i_进行采样。对每个主题中单词的分布φ_k_进行采样。然后,对于每个文档中的词j,我们从给定的主题分布Multinomial(θ_i)中得到一个主题z_ij,然后从给定的词分布Multinomial(φ_z_ij)中得到w_ij,并基于w_ij采样一个词。这个过程如下图所示。生成过程Dirichlet分布的可视化我们一直将Dirichlet视为一个黑盒子,没有任何解释。让我们简要讨论狄利克雷分布背后的直觉。k维Dirichlet分布由k维参数向量控制。下面我们展示了狄利克雷分布的三维示例。基本思想是alpha的值越大,分布被推向中心的概率就越大。这种分布允许高度灵活地确定与主题/文档相关联的单词/主题的部分,因为一些主题/文档可能与大量的单词/主题相关联而其他的可能不相关。Dirichlet分布学习学习LDA模型的问题称为“推理”问题。给定观测变量w,以及??超参数?和β,我们如何估计潜在变量的后验概率。然而,在分母中计算积分在计算上很麻烦。因此,必须使用近似推理。常用的方法有吉布斯抽样和变分推理。在本文中,我们将重点关注前者。Gibbssampling使用Gibbssampling我们可以避免直接计算棘手的积分。基本思想是我们想从p(w|?,β)中采样来估计这个分布,但我们不能直接这样做。相反,吉布斯采样允许我们迭代计算一个潜在变量的后验,同时固定所有其他变量。这样,我们就可以得到后验分布p(θ,z,φ|w,?,β)。对于每次迭代,我们交替对w、?、β进行采样,并固定所有其他变量。算法如下伪代码所示:Forifrom1toMaxIter:Sampleθ_i}~p(θz=z_{i-1,φ=φ_{i-1}w,?,β)Samplez_i}~p(zθ=θ_{i,φ=φ_{i-1}w,?,β)Sampleφ_i}~p(φθ=θ_{i,z=z_{i}w,?,β)由于早期迭代的样本不稳定,我们将丢弃样本的前B次迭代,称为“老化”。LDA在推荐系统上的应用LDA通常在推荐系统中使用在两种情况下:Collaborativefiltering(CF)Content-basedrecommendationCollaborativefiltering当LDA应用于item-basedCF时,items和users类似于我们一直在讨论的Documents和单词(基于用户的CF相反)。换句话说,每个项目都与用户组(主题)的分布相关联,每个用户组是用户的分布。使用LDA,我们可以发现用户和项目之间隐藏的关系。Content-BasedRecommendation第二个应用是content-basedrecommendation,很简单。我们不仅使用普通的TF-IDF来提取每个item的文本数据的特征向量,还使用LDA对这些文本数据的主题进行建模。下面提供了用于训练LDA和推断给定文档主题的示例代码。fromgensim.test.utilsimportcommon_textsfromgensim.corpora.dictionaryimportDictionaryfromgensim.modelsimportLdaModel#Createacorpusfromalistoftextscommon_dictionary=Dictionary(common_texts)common_corpus=[common_dictionary.doc2bow(text)fortextincommon_texts]#Trainthemodelonthecorpus.lda=LdaModel(common_corpus,num_topics=10)训练LDA#inferthetopicdistributionofthesecondcorpus.lda[common_corpus[1]]'''输出[(0,0.014287902),(1,0.014287437),(2,0.014287902),(3,0.014285716),(4,0.014285716),(5,0.014285714),(6,0.014285716),(7,0.014285716),(8,0.014289378),(9,0.87141883)]'''Inferdistributionvectorsoftopics总结在这篇博文中,我们讨论了LDA从高层次到详细的数学解释。此外,我们还讨论了LDA在推荐系统中的应用,并提供了有关如何使用它的示例代码。希望这篇文章对你有所帮助,我们下次再见
