美文网首页机器学习Python
机器学习笔记 - 21. 主题模型LDA(讲师:邹博)

机器学习笔记 - 21. 主题模型LDA(讲师:邹博)

作者: blade_he | 来源:发表于2019-02-08 18:01 被阅读0次

    主题模型

    只是看结论没那么复杂,但是理论依据相对麻烦。
    如图,LDA的粗略示意图,即如何根据X从隐变量推出Z的分布。
    严格意义来说,下面的示意图,是一个贝叶斯网络,只是LDA属于贝叶斯网络。LDA是一个三层的贝叶斯网络


    2019-02-08 11_35_46-【邹博_chinahadoop】机器学习升级版VII(七).png

    问答
    问:对于模型评估的时候,如果是有监督模型,y_hat, y_true是多类别的,如何把他们的ROC_AUC(只能画二分类的)的曲线画到同一个图上面?
    答:邹博之前的课件,有根据鸢尾花数据,绘制出ROC曲线的示例
    找了一下代码,找到车辆接受情况的例子,代码中包括了二分类与多分类,如何绘制ROC曲线与AUC的方法:

    # -*- coding:utf-8 -*-
    
    import pandas as pd
    import numpy as np
    from sklearn.linear_model import LogisticRegressionCV
    from sklearn import metrics
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import label_binarize
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    
    
    if __name__ == '__main__':
        pd.set_option('display.width', 300)
        pd.set_option('display.max_columns', 300)
    
        data = pd.read_csv('car.data', header=None)
        n_columns = len(data.columns)
        columns = ['buy', 'maintain', 'doors', 'persons', 'boot', 'safety', 'accept']
        new_columns = dict(list(zip(np.arange(n_columns), columns)))
        data.rename(columns=new_columns, inplace=True)
        print(data.head(10))
    
        # one-hot编码
        x = pd.DataFrame()
        for col in columns[:-1]:
            t = pd.get_dummies(data[col])
            t = t.rename(columns=lambda x: col+'_'+str(x))
            x = pd.concat((x, t), axis=1)
        print(x.head(10))
        # print x.columns
        y = np.array(pd.Categorical(data['accept']).codes)
        # y[y == 1] = 0
        # y[y >= 2] = 1
    
        x, x_test, y, y_test = train_test_split(x, y, train_size=0.7)
        clf = LogisticRegressionCV(Cs=np.logspace(-3, 4, 8), cv=5)
        clf.fit(x, y)
        print(clf.C_)
        y_hat = clf.predict(x)
        print('训练集精确度:', metrics.accuracy_score(y, y_hat))
        y_test_hat = clf.predict(x_test)
        print('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat))
        n_class = len(np.unique(y))
        if n_class > 2:
            y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class))
            y_test_one_hot_hat = clf.predict_proba(x_test)
            fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
            print('Micro AUC:\t', metrics.auc(fpr, tpr))
            auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro')
            print('Micro AUC(System):\t', auc)
            auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
            print('Macro AUC:\t', auc)
        else:
            fpr, tpr, _ = metrics.roc_curve(y_test.ravel(), y_test_hat.ravel())
            print('AUC:\t', metrics.auc(fpr, tpr))
            auc = metrics.roc_auc_score(y_test, y_test_hat)
            print('AUC(System):\t', auc)
    
        mpl.rcParams['font.sans-serif'] = 'SimHei'
        mpl.rcParams['axes.unicode_minus'] = False
        plt.figure(figsize=(8, 7), dpi=80, facecolor='w')
        plt.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)
        plt.legend(loc='lower right')
        plt.xlim((-0.01, 1.02))
        plt.ylim((-0.01, 1.02))
        plt.xticks(np.arange(0, 1.1, 0.1))
        plt.yticks(np.arange(0, 1.1, 0.1))
        plt.xlabel('False Positive Rate', fontsize=14)
        plt.ylabel('True Positive Rate', fontsize=14)
        plt.grid(b=True, ls=':')
        plt.title('ROC曲线和AUC', fontsize=18)
        plt.show()
    

    问:感觉LDA和EM很像啊,都有个中间的隐变量?
    答:非常好。是这样的。
    问:Z变量是隐变量还是可观测到的变量?
    答:Z是可观测的,X是先验知识,采样的值,即中间部分是隐变量。
    问:LDA是根据概率反推分布么?
    答:不是的,贝叶斯网络是做这个的,即根据已知样本推算参数。
    问:什么是贝叶斯网络?
    答:贝叶斯网络的概念如下图:

    2019-02-08 11_56_59-【邹博_chinahadoop】机器学习升级版VII(七).png
    贝叶斯网络在几年前很重要
    贝叶斯网络是挺重要的,在深度学习火之前,几乎是机器学习中最可能落地的内容。虽然目前大家主要用神经网络做落地应用,但是贝叶斯网络还是很有用的。
    举例说明,任何一个节点,用一个条件概率表,可以描述这个节点所有情况。
    相关数据,有些容易获取,有些不容易获取,我们把容易获取的数据,得到条件概率表,去计算未知那些节点上的条件概率表。
    即Inference,推断;或者Learning,学习
    2019-02-08 12_03_36-【邹博_chinahadoop】机器学习升级版VII(七).png
    所以贝叶斯网络是:通过随机变量做节点,所形成的有向无环图。
    而LDA就是有向无环图
    问:我觉得深度学习在基础理论上的欠缺早晚会妨碍它自身的发展。
    答:是的。
    问:LDA: Latent Dirichlet Allocation为什么叫主题模型呢?好像和缩写不一样?
    答:主题模型的简称是Topic Model,其实有很多种办法实现主题模型,比如:
    • PLSA,概率化隐主题分析: 可以用EM算法来算
    • LSI
    • SVD (奇异值分解)
    • LDA
      -- 隐狄利克雷分布,无监督学习,降维 (本节课所提的LDA,是指这个)
      -- 还有一个LDA,即线性判别分析(Linear Discriminant Analysis ),是有监督学习,降维。又名费舍尔准则

    主要内容

    2019-02-08 14_49_37-【邹博_chinahadoop】机器学习升级版VII(七).png

    应用方向

    LDA最大的特点,就是带隐变量。
    凡是涉及隐变量的应用,都有可能使用LDA。
    邹博强调:生物信息数据的应用,是除了图像、自然语言之外,非常有可能落地的方向。不过不见得一定用LDA,也可以使用其他算法来做。


    2019-02-08 14_50_23-【邹博_chinahadoop】机器学习升级版VII(七).png

    朴素贝叶斯的分析

    在下一节课说它的原理,但是今天说另外一个事情。

    2019-02-08 14_55_50-【邹博_chinahadoop】机器学习升级版VII(七).png

    主题的基本概念

    M篇文档,
    D1,具有w11, w12, w13, ..., w1n1,有n1个词,记为D1n1
    D2 ,具有w21, w22, w23, ..., w2n2,有n2个词,记为D2n2
    ...
    Dm,具有wm1, wm2, wm3, ..., wmnm,有nm个词,记为Dmnm
    我们将所有词拿在一起,这些词当中不出意外,总有重复的词,称为Word。
    我们将不重复的词拿出来,形成一个词典:Dictionary,如果有v个不重复的词,则将词典记为:t1, t2, t3,..., tv
    t为Term或Token(词项)的缩写。
    回过头来看,wm1一定是词典v个Token中的某一个。
    比如说w11是词典中第8个词,v的数目是1000,我们用one-hot编码,表示:
    000000010000....0 (共1000个成员的向量,只有第8个成员的值是1)
    w12是词典中第4个词,v的数目是1000,我们用one-hot编码,表示:
    000100000000....0 (共1000个成员的向量,只有第4个成员的值是1)
    如此这番,一直到n1个词,也这样通过one-hot编码表示。
    因此得到n1 x v的非常稀疏的矩阵(one-hot矩阵)
    同理,我们可以将D1, D2, ..., Dm都通过这样的one-hot矩阵表示出来。
    所以我们现在所拿到的这些文档的维度,都是v维的。
    而v的数目是1000,换句话说,就是所有文档不重复词的个数。
    所以我们做自然语言处理,往往维度是很高的。
    维度很高的话,就不好用,而且浓度太稀疏。
    如果我们想用20列表示:

    2019-02-08 15_17_02-【邹博_chinahadoop】机器学习升级版VII(七).png
    这个20,其实是我们想让其降维到某一个维度上去。
    比如20列,第1列记为Z1,第2列记为Z2,..., 第20列记为Z20
    而这个n1 x 20的矩阵任意一行,都代表一个词,比如水杯。
    降维之后,如果Z8列代表物体,Z1列代表爱情,
    水杯这个词可能对应到Z8列,占了0.8的比例系数,对应到Z1列,占了0.15的比例系数,还有0.05的比例系数分布到其他18个类别。
    于是长度为1000的v维的向量,映射到长度为20的向量,但是20项里面,水杯大概率属于物体这个类别,小概率属于爱情这个类别,极小概率属于其他类别。
    于是我们可以总结为:我们选择了20个主题
    所以我们可以将这些词,获取属于哪些主题的概率
    即通过将v维降维至20之后,信息的浓度变高了
    比如可以将键盘与鼠标归类到一个类别当中去。
    也可以将某个词归类到多个主题,而主题就是隐变量。
    比如cup这个词,归类到物体(水杯),或者体育(世界杯)多个主题
    即通过主题做媒介,使得文档 -> 主题 -> 单词形成关系。

    问答
    问:对视觉类应聘者的要求?
    答:要求就是没有要求。。。
    问:有没有可能D1中间有全0行?
    答:没有可能,因为任意一个词总是在词典中的
    问:感觉把每一行加起来成为一个行向量也能用啊?
    答:当然是可以的,但是浓度不够
    问:每一个关键词和主题的相关性是一个已知的么?
    答:不是的。因为我们可以观察到文档,比如天龙八部,也可以观察到包括的词,比如萧峰,丐帮,星宿派等等,但是观测不到主题,即隐变量。
    问:主题是怎么选的?
    答:主题个数一般不是选的,大都是事先先算出来,作为主题个数的确定。算出来之后,再确定主题的表达,比如爱情,政治,经济等等。
    问:如果一般的问题,所谓的词是不是对应一个特征啊?
    答:是的。
    问:把停用词去掉,有时就剩下重要的词了?
    答:是的,主题模型建立,一定要去停用词,比如:的,么,了等等
    问:例子:天龙八部是文档,topic是隐变量?
    答:是的
    问:文档到主题的关系,是先验的么?
    答:不是先验的,是要计算的。
    问:每篇文档必定会对应一个部分具有1值的行向量么?会不会有可能不同文档对应同一个值?
    答:不可能不同文档对应同一个值。文档对应不到词上,文档对应主题,主题对应词。
    问:gensim是这个套路出来的么?
    答:在LDA实践,会使用到Gensim,不再只是使用scikit-learn了。

    引子:伽玛(γ)函数

    2019-02-08 15_56_06-【邹博_chinahadoop】机器学习升级版VII(七).png

    看到伽玛函数,比如γ(8),其实就是7的阶乘,即7!
    遇到γ(2.4),也可以认为是2.4的阶乘,因为2的阶乘是2,3的阶乘是6,所以2.4的阶乘是位于2~6之间的一个数

    Beta分布

    2019-02-08 16_00_00-【邹博_chinahadoop】机器学习升级版VII(七).png 2019-02-08 16_34_13-【邹博_chinahadoop】机器学习升级版VII(七).png
    2019-02-08 16_35_03-【邹博_chinahadoop】机器学习升级版VII(七).png

    问答
    问:Bag of Words后面需要用深度学习么?
    答:不需要。Bag of Words仅仅是个认识,即我们用深度学习,会用到bag of words,比如直接用TF/ IDF求特征。当然,也有可能用n-gram对词做Word2Vec,将词映射到向量中去。
    问:Topic这个隐变量服从什么分布,怎么确定?
    答:Topic这个隐变量,如果是文档到主题,服从的是多项分布;从主题到单词,服从的是多项分布;如果加上主题之间的先验,则服从Dirichlet分布
    问:词的顺序变,按实际情况应该是变了,至少含义应该变了?
    答:这个是刚才说的假设,而且假设有发散性。结果或许是堪用的。


    2019-02-08 17_02_09-【邹博_chinahadoop】机器学习升级版VII(七).png

    文档和主题的例子


    2019-02-08 17_04_34-【邹博_chinahadoop】机器学习升级版VII(七).png

    LDA涉及的主要问题

    2019-02-08 17_05_58-【邹博_chinahadoop】机器学习升级版VII(七).png

    共轭先验分布

    2019-02-08 17_09_33-【邹博_chinahadoop】机器学习升级版VII(七).png
    说明:
    p(θ):未给定任何数据时,参数θ的分布,称为先验分布
    P(θ|x):给定数据之后的分布,称为后验分布
    P(x|θ):有了参数θ,算出样本x的发生概率,即为似然概率。
    实际样本分布,总是可以根据实际场景问题做建模。比如:如果x为身高或房价,则建模为高斯分布;如果x为骰子,则为六点分布;如果是数个数,则有可能建模为泊松分布;
    先验概率 P(θ)x 似然概率P(x|θ) = 后验概率P(θ|x),如果先验概率 P(θ)与后验概率P(θ|x)都是同样的分布,那么先验分布和后验分布被叫做共轭分布。
    这将利于我们的迭代运算。
    2019-02-08 17_23_40-【邹博_chinahadoop】机器学习升级版VII(七).png
    这里的修正公式,分母+10,分子+5,是因为其符合Beta分布,所以PB的分子+5相当于α,PG的分子+5相当于β,而PB与PG的分母各自都+10,相当于α+β,符合Beta分布的期望E(X) = α / α+β
    2019-02-08 17_24_22-【邹博_chinahadoop】机器学习升级版VII(七).png
    如图,Beta分布就是二项分布的共轭先验分布。
    2019-02-08 17_45_36-【邹博_chinahadoop】机器学习升级版VII(七).png

    更详细解释为:先验分布P(θ)是α与β的Beta分布;后验分布P(θ|x)是K+α与n-k+β的Beta分布,二者都是Beta分布

    问答
    问:听说有一种识别大众情绪的算法,先随机分配标签(包括一些分错的标签),然后采用一种自适应的方法多次迭代修改最初的错误,直到找不到更多的错误为止。请问这种方法也可以用到EM或是深度学习解决么?
    答:其实不仅是识别大众情绪,很多场景都可以这样做。比如K均值聚类,最开始就是将样本随机分为几个簇,然后迭代修正簇的数目。
    最开始定初值,往往都是拍脑门做的。
    问:为什么P(x)可以省略?
    答:x是样本,如果P(x|θ)是给了参数θ,算x的分布的话,那么P(x)是证据,与θ是无关的,所以可以省略P(x)
    问:最终是要学习两个多项分布么?
    答:PLSA(概率化隐主题分析)是的,LDA不是的。LDA需要学习两个多项分布以及两个Dirichlet分布,是且的关系。当然,最后输出是两个多项分布,但是过程得到的是两个Dirichlet分布,即利用两个Dirichlet分布得到两个多项分布。
    问:共轭怎么理解?
    答:大家第一次看到轭这个字的时候,是在学数学的时候,但是这不是数学老师的原因。其实属于语文老师的原因。这里的共轭的轭与虚数没关系。
    共轭的意思是相互依赖,相互依存的关系。
    我们将这样的关系,称为对偶的,或者共轭的,或者相关的。
    下图是邹博老师绘制的辕与共轭的关系:


    2019-02-08 17_56_33-【邹博_chinahadoop】机器学习升级版VII(七).png

    伪计数

    2019-02-08 17_58_31-【邹博_chinahadoop】机器学习升级版VII(七).png

    相关文章

      网友评论

        本文标题:机器学习笔记 - 21. 主题模型LDA(讲师:邹博)

        本文链接:https://www.haomeiwen.com/subject/luwnsqtx.html