小记: 很长一段时间没有更新博客了,因为工作比较忙,也没有回答一些朋友的问题, 非常抱歉。 这篇LDA的总结已经写好了有三个多月, 一直没有时间发到CSDN上, 今天周末, 本来打算在很火爆的国内MOOC上学学java,但是简单看了看,感觉水平都比较一般, 所以看不下去了,还是把这个LDA 总结一下。
ps: 网上也有很多总结的,但是大部分都不是很系统,目前觉得july总结的最好了,但是不得不说,我自己的这份总结要比july总结的早一点,但是远远没有他总结的那么好。
ps2: 实在受不了CSDN的排版系统了,真心不知道CSDN的工程师们都在做什么。。。
LDA 概述
—— watkins.song
在详细的讲LDA之前, 先需要了解一些基本概念。
reference:http://www.52nlp.cn/lda-math-mcmc-%E5%92%8C-gibbs-sampling1
MC(蒙特卡罗方法(Monte Carlo Simulation)) 是统计模拟的方法, 用来进行在连续的概率分布函数中进行采样模拟统计分布。 MC针对的问题是给定一个概率密度函数 p(x) 如何在计算机中生成这个概率密度函数的样本。
当p(x) 不是很复杂的时候, 可以采用[Box-Muller 变换] 将p(x)转换到均匀分布然后采用线性同余发生器获取样本, 但是当p(x)非常复杂的时候, 就需要别的方法。
当p(x)比较复杂的时候, 或者p(x)是高维分布的情况, 例如p(x)是以下情况时:
p(x)=p˜(x)/∫p˜(x)dx,而p˜(x) 我们是可以计算的,但是底下的积分式无法显式计算。
p(x,y) 是一个二维的分布函数,这个函数本身计算很困难,但是条件分布 p(x|y),p(y|x)的计算相对简单;如果p(x) 是高维的,这种情形就更加明显。
此时就需要使用一些更加复杂的随机模拟的方法来生成样本。MCMC(Markov Chain Monte Carlo) 和 Gibbs Sampling算法就是最常用的一种,这两个方法在现代贝叶斯分析中被广泛使用。
总结: 因为有些概率密度函数比较难计算, 所以需要采用MCMC或者Gibbs Sampling这些模拟统计的方法进行采样计算概率密度函数, 降低概率密度函数的计算复杂度。
马氏链的数学定义很简单:
也就是状态转移的概率只依赖于前一个状态。
我们先来看马氏链的一个具体的例子。社会学家经常把人按其经济状况分成3类:下层(lower-class)、中层(middle-class)、上层(upper-class),我们用1,2,3 分别代表这三个阶层。社会学家们发现决定一个人的收入阶层的最重要的因素就是其父母的收入阶层。如果一个人的收入属于下层类别,那么他的孩子属于下层收入的概率是 0.65, 属于中层收入的概率是 0.28, 属于上层收入的概率是 0.07。事实上,从父代到子代,收入阶层的变化的转移概率如下:
使用矩阵的表示方式,转移概率矩阵记为
假设当前这一代人处在下层、中层、上层的人的比例是概率分布向量π0= [π0(1),π0(2),π0(3)], 那么他们的子女的分布比例将是 π1=π0P, 他们的孙子代的分布比例将是 π2=π1P=π0P2, ……, 第n代子孙的收入分布比例将是πn=πn−1P=π0Pn。
假设初始概率分布为π0=[0.21,0.68,0.11],则我们可以计算前n代人的分布状况如下:
我们发现,当n 足够大的时候,这个Pn矩阵的每一行都是稳定地收敛到π= [0.286,0.489,0.225] 这个概率分布。自然的,这个收敛现象并非是我们这个马氏链独有的,而是绝大多数马氏链的共同行为。
所有的 MCMC(Markov Chain Monte Carlo) 方法都是以这个定理(Markov Chain定理)作为理论基础的。
从初始概率分布π0 出发,我们在马氏链上做状态转移,记Xi的概率分布为πi, 则有
X0∼π0(x)
Xi∼πi(x)πi(x)=πi−1(x)P=π0(x)Pn
由马氏链收敛的定理, 概率分布πi(x)将收敛到平稳分布π(x)。假设到第n步的时候马氏链收敛,则有
所以Xn,Xn+1,Xn+2,⋯∼π(x) 都是同分布的随机变量,当然他们并不独立。如果我们从一个具体的初始状态 x0 开始,沿着马氏链按照概率转移矩阵做跳转,那么我们得到一个转移序列 x0,x1,x2,⋯xn,xn+1⋯, 由于马氏链的收敛行为, xn,xn+1,⋯ 都将是平稳分布 π(x) 的样本。
总结: Markov Chain 是一个状态转移的公式, 并且状态转移最终会实现收敛, 就像PageRank算法的网页相关性矩阵最终收敛差不多。 最终收敛以后就可以在收敛以后的概率分布函数下进行采样了。
剧透: 在LDA中为什么要使用Gibbs Sampling? 因为在LDA中根据M篇文档以及每篇文档的单词的topic分布, 计算了一个联合概率公式:
这个联合概率公式是非常难计算的, 所以需要采用Gibbs Sampling算法进行采样计算这个联合概率公式。 在这个公式中, 那么Markov Chain的转换, 是要让谁达到收敛状态呢? 因为是已经观测到的样本, 所以不要计算, 是初始计算时随机分配的topic, 所以最终的目的是要达到实现收敛, 这样在LDA的plate model中的每篇文档对应的topic 分布 和每个topic下对应的term的分布就自然也是收敛的了, 就可以通过计算LDA模型的两种多项分布的参数。
MCMC中存在一个称为接受率的概念, α(i,j), 一般q(i,j)表示从状态i 转移到状态 j.
对于高维的情形,由于接受率α的存在(通常α<1), 以上 MCMC及变种算法的效率不够高。所以可以采用Gibbs Sampling提高状态转换效率以达到最快的实现收敛的概率分布状态。
二维Gibbs Sampling 算法中的马氏链转移
Gibbs Sampling 算法大都是坐标轴轮换采样的,但是这其实是不强制要求的。最一般的情形可以是,在t时刻,可以在x轴和y轴之间随机的选一个坐标轴,然后按条件概率做转移,马氏链也是一样收敛的。
将2维的Gibbs Sampling算法扩展到N维的采样算法, Gibbs Sampling过程中状态转换只是沿着一个坐标轴, 也就是说只沿着一个随机变量进行状态转换, 所以n维空间中对于概率分布p(x1,x2,⋯,xn) 可以如下定义转移矩阵:
如果当前状态为(x1,x2,⋯,xn),马氏链转移的过程中,只能沿着坐标轴做转移。沿着xi这根坐标轴做转移的时候,转移概率由条件概率p(xi|x1,⋯,xi−1,xi+1,⋯,xn) 定义;
其它无法沿着单根坐标轴进行的跳转,转移概率都设置为 0。
以上算法收敛后,得到的就是概率分布p(x1,x2,⋯,xn)的样本,当然这些样本并不独立,但是我们此处要求的是采样得到的样本符合给定的概率分布,并不要求独立。
总结 &剧透: 在Gibbs Sampling过程中, 每次状态转换只沿着一个变量(或者可以说是一个坐标轴)进行, 变量之间的顺序可以采用轮循。 在LDA中, Gibbs Sampling采样的过程相当于对于所有的文档的所有的单词, 也就是整体语料库里面的每一个单词都当作一个随机变量, 每一次采样的时候都选取一个单词作为随机变量, 然后根据除了这个单词的所有其他的语料决定当前单词的下一个状态(要分配的topic编号), Gibbs Sampling的过程就是不停的循环对所有的单词从新估计topic分布, 知道topic编号分布实现收敛, 不再变化, 这样就对应于最终的每篇文档的topic分布和每个 topic下 term的多项分布。
Gamma函数:
通过分部积分的方法,可以推导出这个函数有如下的递归性质:
Γ(x) 函数可以当成是阶乘在实数集上的延拓, 如果x是整数, Gamma函数的定义则为:
Γ(n)=(n−1)!
Gamma函数将阶乘由整数域扩展到了实数域, 同时将倒数的计算由整数域扩展到了实数域。
与Gamma函数相关的一个函数:
Gamma 分布在概率统计领域也是一个万人迷,众多统计分布和它有密切关系。指数分布和χ2分布都是特殊的Gamma 分布。另外Gamma 分布作为先验分布是很强大的,在贝叶斯统计分析中被广泛的用作其它分布的先验。如果把统计分布中的共轭关系类比为人类生活中的情侣关系的话,那指数分布、Poission分布、正态分布、对数正态分布都可以是 Gamma 分布的情人。
总结: Gamma函数实现了将阶乘和倒数的计算扩展到实数域, 并且Gamma分布也是很多分配的先验分布。 之所以在这里简单的提一些Gamma分布, 是因为在Beta分布和Dirichlet分布中用到了Gamma函数。
Beta函数的定义为:
这个就是一般意义上的 Beta 分布!可以证明,在α,β取非负实数的时候,这个概率密度函数也都是良定义的。 上面公式中, x 可以理解为二项分布中的事件发生的概率p。
Beta分布也可以将f(x) 换成p(x) , 即表示x的概率分布函数。 α,β 的物理意义是伪计数, pseudo-count, 因为beta分布是二项分布的参数的分布, 所以α,β 作为伪计数的情况下, beta分布可以理解为二项分布的先验分布。 因为二项分布存在两种情况: 发生和不发生, 所以对应的先验分布(beta分布)有两个参数α和β, α,β分别作为二项分布的先验分布的伪计数, 即我们的先验知识告诉我们这两种时间发生的次数。
Beta分布称为二项分布的共厄先验分布, 因为:
Beta(p|α,β)+Count(m1,m2)=Beta(p|α+m1,β+m2)
上面公式可以看出, 二项分布的参数p的后验概率分布也服从Beta分布。
百变星君Beta分布
Beta分布可以理解为二项分布的参数p的先验分布, 在二项分布加上观测数据以后可以得到二项分布的参数p的后验分布也是beta分布。
Beta分布的一些性质计算:
Dirichlet分布是由Beta分布衍生来的, Dirichlet分布是多项分布的参数p的先验分布。 在一个多项分布中, 每一项的概率pi如何确定? 在Bayesian学派认为, 多项分布的参数p应该是服从一个概率分布的, 可以认为服从Dirichlet分布, 也就是说Dirichlet分布是多项分布的参数的分布, 被认为是“分布上的分布”。
Dirichlet分布的定义:
上面公式中,为Dirichlet分布的参数, 即多项分布的参数的分布的参数。的物理意义和Beta分布中的伪计数α和β一样, 表示在先验知识中每种事件发生的伪计数。
另外, Dirichlet分布还可以表示为:
就是归一化因子,
一般在应用中采用对称的Dirichlet分布,他和Beta 分布一样也是一个百变星君,密度函数可以展现出多种形态。
不同α 下的Dirichlet 分布
在多项分布中, 多项分布的参数的后验概率分布也服从Dirichlet分布, 并且Dirichlet分布和多项分布互为共厄分布。
如果p∼Beta(t|α,β), 则
如果,
Dirichlet分布中存在两个比较重要的参数, “the scale or the concentration”, 还有 “base measure” i' =i0 。
在LDA模型中, 每篇文档的topic分布服从一个多项分布, 同时这个topic分布(多项分布)的参数又服从一个Dirichlet分布。 每一篇文档的都对应一个不同的topic分布, 即多项分布。 同时, LDA中的每个topic下存在一个term的单词多项分布, 即每个topic下的单词都服从多项分布, 并且每个topic对应的多项分布的参数都服从一个Dirichlet分布, 这也是为什么LDA的名字由来, 因为存在两个隐含的Dirichlet分布。
在文本中,每一篇文档都可以看作若干词的组合, d=(w1,w2,⋯,wn)
LDA为生成模型, 同时Unigram Model也为生成模型。 Unigram Model是把所有的文档的词都作为一个语料库, 并且所有的词的分布都服从同一个多项分布, 即每个词出现的概率。 也就是所有的这些词组成的字典中, 每个词的频率。 假设词典总共有V个词, 那么多项分布的情况种类就有V个, 多项分布的参数的维度为V。
有个每个词的出现的概率, 就可以计算语料库中每个文档的生成概率:
的生成概率为:
语料库中的文档可以认为是相对独立的, 所以每个文档之间是没有相关性的, 所以可以获得整个语料库的生成概率,, 语料库的概率为:
假设语料中总的词频是N, 在所有的 N 个词中,如果我们关注每个词 vi 的发生次数 ni,那么正好是一个多项分布, 该多项分布的概率为:
此时, 语料的概率是:
注意: 要特别区分多项分布的概率计算公式和语料的生成概率计算公式, 语料的生成概率计算公式中没有全排列计算, 因为在语料中不用考虑文档以及单词的出现顺序。
我们很重要的一个任务就是估计模型中的参数,也就是问上帝拥有的这个骰子的各个面的概率是多大,按照统计学家中频率派的观点,使用最大似然估计最大化P(W),于是参数pi的估计值就是:
然而, 在上面的基础上, 贝叶斯学派认为上帝只有一个骰子是不对的, 应该上帝有无数多的骰子, 只是在生成语料库的时候上帝随机的选了一个。 这就是说, 生成语料库的模型参数(也就是多项分布的参数)应该是服从一个概率分布的, 上帝选择一个骰子的意思就是在的分布上进行采样获得一个具体的的取值,然后根据将这个取值作为多项分布的参数。 这个时候, 一般认为服从Dirichlet分布。
Dirichlet分布则可以认为是多项分布的参数的先验分布。
在贝叶斯学派的游戏规则的假设之下,语料W产生的概率如何计算呢? 因为W中每个单词出现的概率是受影响的, 而本分服从一个Dirichlet分布,所以要对所有的可能存在的的情况进行全概率计算。 连续变量则进行积分计算:
在上面的公式中,应该如何计算? 对先验分布的一个比较好的选择就是多项分布对应的共轭分布,即 Dirichlet 分布:
就是归一化因子,
Unigram Model的概率图模型
之前提到了以下的概念:
Dirichlet 先验 + 多项分布的数据→ 后验分布为 Dirichlet 分布
所以, 在给定语料库的基础上, 可以得知多项分布的参数的后验概率分布也服从Dirichlet分布, 我们可以计算的后验概率分布:
计算得到参数的后验概率分布以后, 就可以根据后验概率分布计算参数的估计了, 可以根据后验概率分布的期望计算参数的平均取值, 作为的估计值。的后验概率分布为, 于是:
αi 在 Dirichlet 分布中的物理意义是事件的先验的伪计数,这个估计式子的含义是很直观的:每个参数的估计值是其对应事件的先验的伪计数和数据中的计数的和在整体计数中的比例。
进一步,我们可以计算出文本语料的产生概率为:
总结: 在Unigram Model中, 所有的文档中的所有的单词都被看作属于统一个语料库, 并且都服从同样的分布(这一点和LDA是不同的, 在LDA中每一个文档都有自己的topic分布, 并且每一个topic都有自己对应的term分布)。 贝叶斯学派认为每个单词的出现概率服从多项分布, 即要生成一个新的单词有V中选择, 针对V中选择有V个不同的概率, 即构成。多项分布的参数又是一个服从Dirichlet分布的随机变量。
Unigram Model过于简单, 但是很好的解释了多项分布参数的计算过程, 同时理解生成模型的过程。
在生活中, 写一篇文档总是要先决定这个文档包含哪些主题, 以及每个主题的权重(这可能就对应LDA中的每篇文档的topic分布), 然后确定了该文档包含哪些主题以后, 就需要确定在这个主题下选择该主题下的哪些能够表达该主题的单词(对应于每个主题的term分布), 然后重复选择主题和根据主题选择单词的这个过程就可以最终获取一篇指定单词数量的文章。
生成一个文本的生成模型描述:
上面描述中, 上帝先对一篇文档选择了一个骰子, 即确定了这篇文档的主题分布, 因为是从无数的骰子中选择的, 所以也对应了每篇文档的主题分布的参数也服从一个分布(Dirichlet分布), 然后根据这个doc-topic骰子进行topic选择, 得到topic以后再选择对应的topic-word分布, 从中选择单词。 在PLSA中每一个topic都对应一个 term 的多项分布, 这些多项分布可以表示为: , 每一个文档都对应于一个topic分布, 可以表示为: , 如果每个单词有一个编号, 那么一篇文档中每个词的生成概率为: (全概率公式)
然后可以得到一篇文档的生成概率:
然后就可以根据EM算法求解模型的参数。
总结: 貌似PLSA并没有利用Dirichlet分布, 每篇文档对应的topic分布以及每个topic对应的term分布都没有采用Dirichlet分布作为多项分布的先验分布, 没有充分利用贝叶斯理论, 所以在后来提出了基于贝叶斯理论并且使用Dirichlet分布作为先验分布的LDA模型。
在了解了上面那么多基本知识以后, 终于要聊聊LDA了, 我在最早接触LDA的时候发现没有上面的基础知识看LDA真的很费劲。
首先要讲Gibbs Sampling和模型的参会的inference, 最早我理解LDA的最大的困惑在于为神马要采用Gibbs Sampling, 事实上采用Gibbs Sampling是为了降低参数估计的复杂度, 能够实现参数估计。这个接下来会详细说明。
LDA是一个生成模型, 生成模型的示例图如下图所示:
对于LDA生成模型的理解: 假定我们需要写一篇文章, 那么这个文章可能包含多个主题, 也就是说我们先要决定我们的文章由哪些主题构成, 这些主题所占的比例如何。 有了主题分布, 也就对应于(每篇文章的主题分布), 有了主题分布, 我们就开始写文章, 在决定写一个单词的时候, 根据上图的模型, 先要由主题分布决定这个单词所属的topic, 然后有了这个单词的topic, 在根据每个topic下面的term的分布选择应该采用哪个单词。 这样重复这个过程就可以获得一篇有n个单词的文章。
LDA 生成模型中,M 篇文档会对应于 M 个独立的 Dirichlet-Multinomial 共轭结构; K 个 topic 会对应于 K 个独立的 Dirichlet-Multinomial 共轭结构。 LDA中, 每个文章都有自己的topic分布, 每个topic都对应于自己的term分布, 所有的doc-topic分布的参数都服从Dirichlet分布, 所有的topic-term分布的参数都服从Dirichlet分布。
LDA生成模型的算法过程描述如下:
因为LDA中包含了多个多项分布, 所以LDA称为混合模型, 在LDA中, 一个单词t出现的概率应该符合全概率公式, 即在所有的topic中这个单词出现的概率和:
LDA需要计算的不是全局的topic分布(global topic proportion), 而是要以文档为单位的基础上一个单词的topic分布。 这样, 可以得知LDA inference的目的为: (1), 即为每个topic下的term分布, (2) , 每个文档对应的topic分布。 最终要估计的是两个参数: 。
根据LDA模型, 对于一个文档m 的完全数据的似然估计(关于所有的已知和未知参数的联合分布)为:
注释: 这里我一直觉得 “word plate”的范围错了, 我觉得不应该包括连乘符号。而且, 连乘后边继续放一个圆点后放一个条件概率, 容易让人误会圆点以后的概率也是对于所有的word都进行乘法操作。
在文档m中, 一个单词t出现的概率为 (通过计算Zm,n的边缘分布, 并且忽略多项分布的参数分布)
由每个单词出现的概率, 我们可以计算整个语料库的生成概率:
上面公式给出了两个参数的似然估计, 虽然LDA虽然是比较简单的模型, 但是直接推断这个模型的参数是非常困难的, 可以采用近似推断算法。 所以需要采用Gibbs Sampling进行采样估计。
在LDA模型中,隐藏的模型变量为 Zm,n, (Zm,n 表示文档m中第n个单词的 topic值), 之前一直在说要用Gibbs Sampling, 这里Zm,n 就相当于Markov Chain中的状态变量, 当Z 收敛以后, 整个语料库的每个文档的topic分布以及每个topic对应的term分布也就收敛了, 也就是和都实现收敛, 最终可以计算LDA的两个多项分布的参数。
Inference的目的是计算如下公式的概率(其中Zi = Zm,n , 这里是为了方便表示): (因为在给定观测样本的基础上, 计算得到Z的概率分布即可以获得整个LDA模型的所有参数, 即和, 计算概率分布的目的就是看所有的语料库的单词对应的topic分布是否已经收敛了, 如果已经收敛则可以利用Z 计算得到模型参数。 因为上面提到Zm,n对应于Markov Chain的状态变量, 所以对于不同的状态的Z会有不同的概率分布, 但是当Z收敛以后, 应该不会再变化。 这里说了好多为什么要推断, 应该很清楚了。)
但是上面公式中的分母部分很难计算求得, 这就需要采用Gibbs Sampling来发挥作用了(发挥作用的意思不是可以用Gibbs Sampling计算分母, 而是采用Gibbs Sampling获得收敛的Z)。需要利用Gibbs Sampling 的全条件概率分布去模拟。 关于Gibbs Sampling的公式, 存在以下的分析。
Gibbs Sampling是一个特殊的MCMC, 并且在采样过程中轮流对不同的维度xi 进行采样, 在对维度xi采样的时候, 利用所有的其他的不包含xi 的维度的概率分布计算xi 的新的采样值, 不包含xi 的维度可以表示为: 。
Gibbs Sampling的过程描述如下:
为了获取一个Gibbs Sampling采样器, 必须得到一个univariate conditionals (or full conditionals):
对于包含隐含变量Z, 并且诶已知后验概率分布的模型, Gibbs 采样器可以表示为:
在这个Gibbs采样器中有一个联合概率分布, 我们需要计算这个联合概率分布才能获得具体的Gibbs采样器。
联合概率分布可以表示为:
我们把这个公式分成两个部分分别计算, 首先是(给定语料库中每个单词的topic值, 根据topic值获得语料库的生成概率), 得到:
如果表示为另外一种形式, 则得到:
是关于的分布, 所以的计算可以通过对进行积分得到:
同样的,也可以通过以下公式得到:
然后可以通过对进行积分计算:
最后得到联合概率分布的结果:
结合上面提到的Gibbs采样器公式和联合概率公式, 可以最终得到Gibbs Sampling的采样公式为:
注释: 当看到得到这个公式以后, 我最初很迷茫有了这个公式到底怎么采样? 得到的就是一个概率, 采毛样。。。。 , 后来看了资料以后, 是需要计算当前的term (单词) 所有对应的 k 的概率取值, 这样就获得的所有的 K 个 新的这个单词将要划分的topic的值, 然后生成随机数在这个K 个topic中选择 这个单词 需要重新划分的topic 。 对于所有的单词都进行这个过程操作, 直到 Z 收敛以后。
根据以前提到的Dirichlet分布的特征可以得知, LDA模型中对应的每个文档的topic分布和每个 topic下term的分布都服从Dirichlet分布, 并且,的后验概率分布也服从Dirichlet分布:
其中,表示第 m 篇文档中每个topic的单词数量向量(维度为 K), 表示第 k 个topic下 词典 V 中 每个单词在整个语料库中出现的次数 (维度为 V) , 其中, ,都可以根据Gibbs Sampling采样达到收敛状态后的 Z 统计得到(计算很简单)。 然后可以得到模型的参数计算:
终于通过各种分析, Gibbs Sampling计算得到了LDA的模型参数, 并且在计算LDA的Gibbs Sampling 过程中计算了联合概率分布其实在最初看论文的过程中最大的问题就是思维比较混乱, 不知到哪里的公式为什么使用, 为什么要计算联合概率分布, 为什么要计算, 等到多看几遍论文以后, 便发现所有的论证都是围绕着Gibbs Sampling进行的, 都是在为引出或者计算Gibbs Sampling公式服务的。
Gibbs Sampling的过程描述如下:
对于未知的新来的文档, 如何根据已经训练好的模型将文档表示为 topic 的向量或者获取文档的topic特征呢?
对于一个 query document , 可以看作 term 向量, 我们可以在已有的LDA模型参数的基础上计算 query document的 topic分布 的后验概率, 也可以计算文档的topic分布。 计算得到文档的 topic则可以根据这个topic分布的向量计算文档之间的相似度。
计算query document 的topic分布的过程和LDA模型的参数估计过程有一些区别, (1) 在query document的Gibbs采样过程中使用LDA模型中已经得到的和训练模型的时候使用的, 在query document的 topic分布计算过程中需要使用 已经得到参数, 即我们假设所有的topic对应的term分布都符合从语料库中得到的参数。 (2) 参数只对测试文档有效。(不知到理解的对不对。。。。)
和Gibbs Sampling一样, 首先给query document 的每一个word随机分配一个 topic , 然后进行Gibbs Sampling, 知道query document的实现收敛, 采样公式如下所示:
有了上面公式的Gibbs Sampling采样过程以后, 到达收敛之后, 就可以计算query document 的topic 分布了:
这里还有个大疑问: 在进行Gibbs Sampling的过程中, 怎么确定(计算) Z 已经收敛了呢? 貌似论文中没有提到。。。(难道根据Z的变化? 。。。)