复现经典:《统计学习方法》第18章 概率潜在语义分析
第18章 概率潜在语义分析
本文是李航老师的《统计学习方法》一书的代码复现。作者:黄海广
备注:代码都可以在github中下载。我将陆续将代码发布在公众号“机器学习初学者”,可以在这个专辑在线阅读。
1.概率潜在语义分析是利用概率生成模型对文本集合进行话题分析的方法。概率潜在语义分析受潜在语义分析的启发提出两者可以通过矩阵分解关联起来。
给定一个文本集合,通过概率潜在语义分析,可以得到各个文本生成话题的条件概率分布,以及各个话题生成单词的条件概率分布。
概率潜在语义分析的模型有生成模型,以及等价的共现模型。其学习策略是观测数据的极大似然估计,其学习算法是EM算法。
2.生成模型表示文本生成话题,话题生成单词从而得到单词文本共现数据的过程;假设每个文本由一个话题分布决定,每个话题由一个单词分布决定。单词变量
与文本变量是观测变量话题变量是隐变量。生成模型的定义如下:
3.共现模型描述文本单词共现数据拥有的模式。共现模型的定义如下:
4.概率潜在语义分析的模型的参数个数是
。现实中,所以概率潜在语义分析通过话题对数据进行了更简洁地表示,实现了数据压缩。
5.模型中的概率分布
可以由参数空间中的单纯形表示。维参数空间中,单词单纯形表示所有可能的文本的分布,在其中的话题单纯形表示在个话题定义下的所有可能的文本的分布。话题单纯形是单词单纯形的子集,表示潜在语义空间。
6.概率潜在语义分析的学习通常采用EM算法通过迭代学习模型的参数,
和,而可直接统计得出。
概率潜在语义分析(probabilistic latent semantic analysis, PLSA),也称概率潜在语义索引(probabilistic latent semantic indexing, PLSI),是一种利用概率生成模型对文本集合进行话题分析的无监督学习方法。
模型最大特点是用隐变量表示话题,整个模型表示文本生成话题,话题生成单词,从而得到单词-文本共现数据的过程;假设每个文本由一个话题分布决定,每个话题由一个单词分布决定。
18.1.2 生成模型
假设有单词集合
{}, 其中M是单词个数;文本(指标)集合 {}, 其中N是文本个数;话题集合 {},其中是预先设定的话题个数。随机变量 取值于单词集合;随机变量 取值于文本集合,随机变量 取值于话题集合。概率分布 、条件概率分布 、条件概率分布 皆属于多项分布,其中 表示生成文本 的概率, 表示文本 生成话题 的概率, 表示话题 生成单词 的概率。
每个文本
拥有自己的话题概率分布 ,每个话题 拥有自己的单词概率分布 ;也就是说一个文本的内容由其相关话题决定,一个话题的内容由其相关单词决定。
生成模型通过以下步骤生成文本·单词共现数据:
(1)依据概率分布
,从文本(指标)集合中随机选取一个文本 , 共生成 个文本;针对每个文本,执行以下操作;
(2)在文本 给定条件下,依据条件概率分布 , 从话题集合随机选取一个话题 , 共生成 个话题,这里 是文本长度;
(3)在话题 给定条件下,依据条件概率分布 , 从单词集合中随机选取一个单词 .
注意这里为叙述方便,假设文本都是等长的,现实中不需要这个假设。
生成模型中, 单词变量
与文本变量 是观测变量, 话题变量 是隐变量, 也就是说模型生成的是单词-话题-文本三元组合 ()的集合, 但观测到的单词-文本二元组 ()的集合, 观测数据表示为单词-文本矩阵 的形式,矩阵 的行表示单词,列表示文本, 元素表示单词-文本对()的出现次数。
从数据的生成过程可以推出,文本-单词共现数据
的生成概率为所有单词-文本对()的生成概率的乘积:
这里
表示 ()的出现次数,单词-文本对出现的总次数是 。每个单词-文本对()的生成概率由一下公式决定:
18.1.3 共现模型
虽然生成模型与共现模型在概率公式意义上是等价的,但是拥有不同的性质。生成模型刻画文本-单词共现数据生成的过程,共现模型描述文本-单词共现数据拥有的模式。
如果直接定义单词与文本的共现概率
, 模型参数的个数是 , 其中 是单词数, 是文本数。概率潜在语义分析的生成模型和共现模型的参数个数是 , 其中 是话题数。现实中 $K<<m$, 所以
算法 18.1 (概率潜在语义模型参数估计的EM算法)
输入:设单词集合为
{}, 文本集合为 {}, 话题集合为 {}, 共现数据
输出:
和 .
设置参数
和 的初始值。迭代执行以下E步,M步,直到收敛为止。
E步:
M步:
习题 18.3
import numpy as np
X = [[0,0,1,1,0,0,0,0,0], [0,0,0,0,0,1,0,0,1], [0,1,0,0,0,0,0,1,0], [0,0,0,0,0,0,1,0,1], [1,0,0,0,0,1,0,0,0], [1,1,1,1,1,1,1,1,1], [1,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,1,0,1], [0,0,0,0,0,2,0,0,1], [1,0,1,0,0,0,0,1,0], [0,0,0,1,1,0,0,0,0]]
X = np.asarray(X);X
array([[0, 0, 1, 1, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 1, 0, 0, 1],[0, 1, 0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 1, 0, 1],[1, 0, 0, 0, 0, 1, 0, 0, 0],[1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 1, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 1, 0, 1],[0, 0, 0, 0, 0, 2, 0, 0, 1],[1, 0, 1, 0, 0, 0, 0, 1, 0],[0, 0, 0, 1, 1, 0, 0, 0, 0]])
X.shape
(11, 9)
X = X.T;X
array([[0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0],[0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0],[1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0],[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],[0, 1, 0, 0, 1, 1, 0, 0, 2, 0, 0],[0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0],[0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0],[0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0]])
class PLSA:def __init__(self, K, max_iter):self.K = Kself.max_iter = max_iterdef fit(self, X):n_d, n_w = X.shape# P(z|w,d)p_z_dw = np.zeros((n_d, n_w, self.K))# P(z|d)p_z_d = np.random.rand(n_d, self.K)# P(w|z)p_w_z = np.random.rand(self.K, n_w)for i_iter in range(self.max_iter):# E stepfor di in range(n_d):for wi in range(n_w):sum_zk = np.zeros((self.K))for zi in range(self.K):sum_zk[zi] = p_z_d[di, zi] * p_w_z[zi, wi]sum1 = np.sum(sum_zk)if sum1 == 0:sum1 = 1for zi in range(self.K):p_z_dw[di, wi, zi] = sum_zk[zi] / sum1# M step# update P(z|d)for di in range(n_d):for zi in range(self.K):sum1 = 0.sum2 = 0.for wi in range(n_w):sum1 = sum1 + X[di, wi] * p_z_dw[di, wi, zi]sum2 = sum2 + X[di, wi]if sum2 == 0:sum2 = 1p_z_d[di, zi] = sum1 / sum2# update P(w|z)for zi in range(self.K):sum2 = np.zeros((n_w))for wi in range(n_w):for di in range(n_d):sum2[wi] = sum2[wi] + X[di, wi] * p_z_dw[di, wi, zi]sum1 = np.sum(sum2)if sum1 == 0:sum1 = 1for wi in range(n_w):p_w_z[zi, wi] = sum2[wi] / sum1return p_w_z, p_z_d# https://github.com/lipiji/PG_PLSA/blob/master/plsa.py
model = PLSA(2, 100)
p_w_z, p_z_d = model.fit(X)
p_w_z
array([[0.64238757, 0.05486094, 0.18905573, 0.24047994, 0.41230822,0.38136674, 0.81525232, 0.74314243, 0.32465342, 0.19798429,0.72010476],[0.6337431 , 0.79442181, 0.96755364, 0.22924392, 0.99367301,0.20277986, 0.40513752, 0.51164374, 0.73750246, 0.22300907,0.17339099]])
p_z_d
array([[7.14884177e-01, 2.85115823e-01],[5.38307075e-02, 9.46169293e-01],[1.00000000e+00, 3.40624611e-11],[1.00000000e+00, 1.12459358e-24],[1.00000000e+00, 5.00831891e-42],[1.66511004e-19, 1.00000000e+00],[1.00000000e+00, 8.02144289e-15],[1.04149223e-02, 9.89585078e-01],[5.96793031e-03, 9.94032070e-01]])
本章代码来源:https://github.com/hktxt/Learn-Statistical-Learning-Method
下载地址
https://github.com/fengdu78/lihang-code
参考资料:
[1] 《统计学习方法》: https://baike.baidu.com/item/统计学习方法/10430179
[2] 黄海广: https://github.com/fengdu78
[3] github: https://github.com/fengdu78/lihang-code
[4] wzyonggege: https://github.com/wzyonggege/statistical-learning-method
[5] WenDesi: https://github.com/WenDesi/lihang_book_algorithm
[6] 火烫火烫的: https://blog.csdn.net/tudaodiaozhale
[7] hktxt: https://github.com/hktxt/Learn-Statistical-Learning-Method
复现经典:《统计学习方法》第18章 概率潜在语义分析相关推荐
- 统计学习方法——第1章(个人笔记)
统计学习方法--第1章 统计学习及监督学习概论 <统计学习方法>(第二版)李航,学习笔记 1.1 统计学习 1.特点 (1)以计算机及网络为平台,是建立在计算机及网络上的: (2)以数据为 ...
- 李航《统计学习方法》第二章课后答案链接
李航<统计学习方法>第二章课后答案链接 李航 统计学习方法 第二章 课后 习题 答案 http://blog.csdn.net/cracker180/article/details/787 ...
- 李航《统计学习方法》第一章课后答案链接
李航<统计学习方法>第一章课后答案链接 李航 统计学习方法 第一章 课后 习题 答案 http://blog.csdn.net/familyshizhouna/article/detail ...
- 统计学习方法笔记第二章-感知机
统计学习方法笔记第二章-感知机 2.1 感知机模型 2.2感知机学习策略 2.2.1数据集的线性可分型 2.2.2感知机学习策略 2.3感知机学习算法 2.3.1感知机算法的原始形式 2.3.2算法的 ...
- 统计学习方法第十八章作业:PLSA 概率潜在语义分析算法 代码实现
PLSA 概率潜在语义分析 import numpy as np import collections import jiebaclass PLSA:def __init__(self,text_li ...
- 潜在语义分析 (LSA),概率潜在语义分析 (PLSA)
目录 潜在语义分析 (latent semantic analysis, LSA) 单词向量空间与话题向量空间 单词向量空间 (word vector space) 话题向量空间 (topic vec ...
- pLSA概率潜在语义分析
概率潜在语义分析(PLSA) 李航<统计学习方法>:习题代码实现 pLSA用于主题模型:实例 PLSA introduction: http://blo ...
- 概率潜在语义分析(pLSA) 相关知识
文章目录 生成模型 共现模型 模型性质 共现模型表示 PLSA算法 概率潜在语义分析(PLSA)是一种利用概率生成模型对文本集合进行话题分析的无监督方法. PLSA 模型假设每个文本由一个话题分布决定 ...
- 概率潜在语义分析(PLSA)
文章目录 基本概要 生成模型和共现模型 概率潜在语义分析的算法 基本概要 概率潜在语义分析是一种利用概率生成模型对文本集合进行话题分析的无监督学习方法. 模型最大的特点就是用隐变量表示话题.整个模型表 ...
最新文章
- SQL中Group By的使用详解
- view,control,service,dao,model层的关系
- for循环里的if语句中break_Go语言极简教程 - 第五篇 控制语句
- 自我认为挺全面的【Web Service渗透测试总结】
- linux——管理系统存储之设备的识别、发现、挂载
- python守护进程windows_如何把 python predict程序 做成 windows 守护进程
- SQLServer安装挂起解决方法
- 教你8个高级cmd运行命令,让人一看你就是个电脑高手!
- 网页弹出框----播放视频
- C++ 纯虚函数 虚函数 override
- python读写excel文件(xls格式)
- intellij idea设置主题、字体样式和背景色
- 网站PV,UV是什么意思?
- springcloud五大组件永远滴神——成神之路
- 沧小海基于xilinx srio核的学习笔记之第三章 xilinx srio核介绍(一)结构介绍
- Selenium(2): DOM元素定位、操作
- 在c++中用编程画一个圆
- 最小生成树合集(讲解与例题)
- 51单片机移植UCOS-II的方法与改进
- 【原理+实战+视频+源码】抖音,快手大热背后——Android 贴心的音视频学习指南来咯!