一 学前需备数学知识
二项分布
一个事件要么成要么不成,概率为b和
重复n次
成功的k次数是
多项分布
二项分布是一个事件只有成或者不成两种可能并且重复n次 ,多项分布是一个事件有多重可能并且重复n次
Beta分布
一个时间发生的某种概率分布发生的概率就是Beta分布,它的参数有两个(,
),对Beta分布求期望的结果是
/(
),下图是一张beta分布图
他的x轴是可能出现的概率 y轴是该概率出现的可能性,对于该分布而言,它的参数,如果某事件发生了 就给
,说明发生的概率提高,给分子++,反之则给
,让分母增大,说明概率减小
Jensen不等式
后面用到jensen不等式是利用取对数求导乘法变加法 在如果f(x)满足对任意x1 ≠ x2,都有f((x1+x2)/2) < (f(x1)+f(x2))/2.那么f(x)的Jensen不等式只有在各变量都相等时取等.
贝叶斯
先验概率 是先知道概率$ 再知道样本X
公式一P(X|$)==连乘p(xi|$) xi是单个词 因为文档是有多个词组成所以是连乘
联合分布和条概公式如下
公式二P(X,$)==P(X|$)*P($)==P($|X)*P(X)
后面那个 P($|X) 我们将其称为后验概率
根据概率论连续性已知联合分布求边缘分布的方法,带入公式二得到
公式三P(X)=积分$ P(X,$) = 积分$P(X|$)*P($)
所以联立公式二三就可以得到后验概率
公式四 P($|X)==P(X|$)*P($)/ 积分$P(X|$)*P($)
这样就能实现通过先验概率求后验概率的方法
先验分布 p($) 是反映人们在抽样前对 $ 的认识,后验分布 p($|X) 是反映人们在抽样后对 $ 的认识,之间的差异是由于样本的出现后人们对 $认识的一种调整,所以后验分布 p($|X) 可以看作是人们用总体信息和样本信息(抽样信息)对先验分布 p($) 作调整的结果
换一个方式假设一个问题的初始概率,然后根据样本求后验概率最大值,再把后验概率当成先验概率的参数,如果样本数量足够多,结果一定会趋近于某一个值,所以可以任意假设初始概率,这也就是后面的em算法
EM算法
一篇文章有多个主题 一个主题有多个关键词 关键词对应主题存在分布 主题对应文章存在分布 z代表主题 d代表文章 w代表词
1.E-step 随机初始化变量 ,
,计算隐变量后验概率。
2.M-step 最大化似然函数,更新变量,
3.重复1、2两步,直到收敛。
Gamma函数
伽玛函数也叫欧拉第二积分,是阶乘函数在实数与复数上扩展的函数与之有密切联系的函数是贝塔函数,也叫第一类欧拉积分,可以用来快速计算同伽马函数形式相类似的积分。
(1)在实数域上伽玛函数定义为:
(2)在复数域上伽玛函数定义为:
通过分部积分得到一个性质:,所以可以证明Gamma是阶乘在实数集上的一个拓延
与Beta函数的关系是:
Gamma分布是: 且X>0
数据离散度
1 极差
数据的最大值减去最小值,代表程度比较差
2 四分位差
上四分之一位和下四分之一位差,表现了中间百分之五十的离散程度,越小表明数据越集中,因为数据偏向程度问题,代表性也比较差
3 方差
最常用的4统计方法
4 均值和标准差
一般知道均值和标准差就可以了解分布情况,尤其是正态分布
5 变异系数
标准差与均值的比
瑞丽商与广义瑞丽商
它的函数公式是,x是非零向量A是和n*n的Hermitan矩阵,就是共轭矩阵和自己相等的矩阵,即
,同时A的矩阵应该是实矩阵(就是矩阵中每一个数都是实数)
瑞丽商有一个性质是它的最大值等于矩阵A的最大特征值,最小值也等于A的最小特征值,当向量x是标准正交基(在线性代数中,一个内积空间的正交基(orthogonal basis)是元素两两正交的基。称基中的元素为基向量。假若,一个正交基的基向量的模长都是单位长度1,则称这正交基为标准正交基或"规范正交基"(Orthonormal basis)。)时,分母为1 这个公式退化到只剩下分子
广义瑞丽商:它的函数公式是
LDA
第一个问题:
LDA的定义&&LDA与PCA
先说PCA,如果有x条y维数据要处理
先将其变成矩阵y行x列的矩阵,然后让他的每一行减去该行的均值,求出协方差矩阵及其特征值和特征向量,取较大的部分组成一个新的矩阵 然后对其降维,它的缺点是可能带来过拟合,因为它对信息的舍弃可能舍弃到了最重要的部分,所以这是他的缺点,它的优点是降维,降低了维度灾难,它的优缺点和SVM很像,但是PCA是不考虑样本类别输出的无监督降维技术,而LDA是一种监督学习的降维技术,LDA的降维最多到k-1,而pca没有这个限制,它的数据集的每个样本是有类别输出的。LDA 将数据在低维进行投影,希望分类后类内部之间数据离散度较小,类与类之间数据离散度较大
二类LDA原理
假设数据集其中xi为n维向量,
,设Ri为第i类样本个数,Ki为第i类样本的集合,Fi为第i类样本的均值,Zi为第i类样本的协方差矩阵
Fi:
协方差矩阵就是样本向量减均值乘它的转置
为了实现不同类之间的距离远 所以要使其投影的向量距离最远,就是让向量本身乘以其中心点之差的平方最大,为了实现同类之间协方差最小,那么只要求前者做分子后者做分母的公式的最大值即可完成目的,同时带入类内散度矩阵和类间散度矩阵就可以将公式变成瑞丽商公式,再利用瑞丽商公式的性质就可以解除向量的方向了,这样就可以完成了使用LDA降维
LDA分类:
它认为一篇文章是由词、主题和文档三层决定的。所,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或隐语义。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
(1)对每一篇文档,从主题分布中抽取一个主题;
(2)从上述被抽到的主题所对应的单词分布中抽取一个单词;
(3)重复上述过程直至遍历文档中的每一个单词。
语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。
2、LDA整体流程
文档集合D,主题集合T
D中每个文档d看作一个单词序列<w1, w2, …… ,wn>,wi表示第i个单词,设d有n个单词。(LDA里面称之为wordbag,实际上每个单词的出现位置对LDA算法无影响)
文档集合D中的所有单词组成一个大集合VOCABULARY(简称VOC)。
LDA以文档集合D作为输入,希望训练出两个结果向量(设聚成k个topic,VOC中共包含m个词)。
对每个D中的文档d,对应到不同Topic的概率θd<pt1,...,ptk>,其中,pti表示d对应T中第i个topic的概率。计算方法是直观的,pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。
对每个T中的topic,生成不同单词的概率φt<pw1,...,pwm>,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topict的VOC中第i个单词的数目,N表示所有对应到topict的单词总数。
LDA的核心公式如下:
p(w|d)=p(w|t)*p(t|d)
直观的看这个公式,就是通过主题传导,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd文档中主题分布,p(w|t)利用主题中词的分布计算得到。
实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。
一个案例从网上找的加上了注释
import numpy as np
import lda
X = np.genfromtxt("data\\source_wzp_lda_1.txt", skip_header=1, dtype = np.int)
#这里的skip_header=1的作用是第一行忽略 dtype是数据类型
#the vocab
file_vocab = open("data\\vectoritems_lda_3.txt", "r")
vocab = (file_vocab.read().decode("utf-8").split("\n"))[0:-1]
print len(vocab)
model = lda.LDA(random_state=1, n_topics=11, n_iter=1000)
# 参数:
# 1 n_topics 主体数量
# 2 n_iter 迭代次数
# 3 alpha 和 eta 用于Dirichlet参数
# 4 random_state 初始主题生成器
# model.fit(X)
用x调整模型
#主题-单词(topic-word)分布
topic_word = model.topic_word_
print("type(topic_word): {}".format(type(topic_word)))
print("shape: {}".format(topic_word.shape))
#format是字符串格式化
#获取每个topic下权重最高的10个单词
n = 10
for i, topic_dist in enumerate(topic_word):
topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n+1):-1]
print("topic {}\n- {}".format(i, ('-'.join(topic_words)).encode("utf-8")))
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据# 和数据下标,一般用在 for 循环当中。
# for i, element in enumerate(seq):
# print i, element
# 0 one
# 1 two
# 2 three
# np.argsort 是根据序列排序并返回索引
#文档主题(Document-Topic)分布:
doc_topic = model.doc_topic_
print("type(doc_topic): {}".format(type(doc_topic)))
print("shape: {}".format(doc_topic.shape))
#一篇文章对应一行,每行的和为1
#输入前10篇文章最可能的Topic
for n in range(20):
'''
for i in doc_topic[n]:
print i
'''
topic_most_pr = doc_topic[n].argmax()
print("doc: {} topic: {}".format(n, topic_most_pr))