费舍尔方法(Fisher's method)的数学原理解释

来源:互联网 发布:艾利丹尼森 知乎 编辑:程序博客网 时间:2024/05/31 06:22

在《集体智慧编程》(Programming Collective Intelligence)一书的第六章,讲述了基于概率统计的文档分类器实现方法。全章的前半部分对朴素贝叶斯分类器从原理到实现进行了较为详细的阐述,而在后半部分又提到了一种同样基于概率统计的分类器方法——费舍尔方法,这种方法相对于朴素贝叶斯分类器可以给出文档属于某分类的具体概率,而且在本人的一个小项目中,费舍尔方法比朴素贝叶斯的分类准确率要好上一个百分点。不幸的是,书中对费舍尔方法的原理介绍只是一笔带过,只给出了实现代码,而且对关键函数invchi2的作用也没有提及(没有书的同学可以到费舍尔方法 - 51CTO.COM查看这部分内容),而百度上能搜索到的费舍尔方法相关资料也乏乏。但实际上,费舍尔方法的数学原理并不复杂,有概率论基础的人能很容易明白,下面我对费舍尔方法的原理做一个说明。


1.以下内容为对概率论部分知识的回顾,主要涉及抽样分布,假设检验,基础好的可以直接跳到2


虽然你可能在概率论这门课上完后就没再碰过课本,但总应该还记得正态分布(Normal distribution),就是这个著名的图像


 如果把它当做频数分布图,中间最高的那个就代表着频数最大的,放在概率论里讲,中间那个就是可能性最高的(均值),比如,有人持续观察了一年我睡觉的时间,然后画了这个频数分布图(根据大数定律,可以把它当成概率密度分布图),说我的睡觉时间满足正态分布N(μ,σ^2),其中μ=12,那我应该就是经常在12点睡觉,但有时候也会提前一点或者晚一点,σ^2是方差,σ是标准差,就是方差开平方,这个初中就学了,x轴上画了一些跟μ,σ相关的点,这几个点实际上跟z分数(z-statistics)有关,忘了的可以去网易公开课找可汗学院的统计学看看,不看的话只要知道,沿着这几个点网上作垂直于x轴的直线,直线-正态分布曲线-x轴围成的面积占整个正态曲线-x轴围成的面积的比重是固定的,在胖的瘦的正态曲线都是一样,比如你在μ-σ和μ+σ两个点作直线,与正态曲线围起来的面积就占正态曲线围的总面积的68.268949%,这时候你就可以说(先不考虑样本数的事情),博主在μ-σ点和μ+σ点之间睡觉的可能性是68%,或者博主睡觉时间落在μ-σ和μ+σ点的概率为68%。

在这个语境下,我的睡觉时间就不是某个确定的时间点,而是一个变量(variable),它是一个量,但拥有很多可能的值,就好比扔骰子,结果就是结果,但有6种可能,每次观测(扔骰子)时它会表现出一个,如果是一个动过手脚的骰子,有些值经常会表现出来,有些值不怎么出现,这种规律就是分布。正常的骰子和出老千用的骰子,分布肯定是不同的,而我们扔骰子,看点数这个过程就叫抽样。分布是一种(骰子)内在的属性,我们可以通过抽样来找出这种属性,抽样次数越多,找出来的结果就越靠谱。

抽样中有一种很有趣的现象:如果你从任意分布(不管你的骰子是正常骰子还是作弊版骰子还是外星骰子)中做几次抽样(不用太多,6,7次基本就够了),把抽样值求平均,记为s,这时你就得到了一个新的随机变量s(准确的讲,是随机变量表现出的一个值),这个s就是满足正态分布的!换句话说,你用同一个骰子,种类不限,把上面扔7次求平均值这个过程做个百八十遍,画出的频数分布图就差不多是个正态分布。这就是著名的中心极限定理。从这个定理中,我们还应该推理出一件事情,就是服从某分布的随机变量,取其固定数量的样本值,做某种运算(比如平均),得到的新随机变量也服从某种分布。当这种新分布是我们熟知的分布时,这样的变换就有意义了。

有意义应用中的一种,就是假设检验。比如,有人告诉你,这里的1w个苹果平均重量是900g,你为了检验他说的是不是实话,就从里面随机挑了50个苹果(注意,这里的数量不能太少,一般得30以上,具体为啥···百度去),求了均值(比如800),方差,标准差,下面是定理:

1.这50个苹果的标准差σ可以代表1w个苹果的标准差σ 

2.如果对1w个苹果进行了若干次 取50——求平均 得到一堆值si(中心极限定理告诉我们这堆值是满足正态分布的),这堆值的标准差σx=σ/√50

OK,了解了这些信息后,你要首先假设H0:他说的是实话。也就是说,通过50个苹果平均弄出来的新的随机变量s(虽然没做那么多次实验但理论上是满足正态分布的)服从N(μx=900,σx^2),至于为啥你取的50个苹果均值是μ0=800,只能说你运气不太好;再做一个否定的假设H1:这批苹果的均重不是900g(当然你也可以假设均重小于900g,这就看是单侧还是双侧检验),比较专业的说法,就是假设这批苹果的分布是另外一种均值不是900g的正态分布。然后,计算z=(μx-μ0)/σx(z分数,之前提过),结合上面正态分布的图,不难看出,这是在求μ0与μx之间差了多少个标准差,图上的几个点标注的其实分别是差1个,2个,3个的特殊点,虽然你算出的结果不太可能正好是这几个整数,但幸好有一种叫正态分布表的东西能告诉你离你那个点比较近的某个点,对应的概率是多少。这个概率值其实就是对你运气程度的一种量化,如果你抽的50个苹果均值是898,那这个点对应的概率就不会很大,估计也就1%左右,说明卖苹果的话很靠谱,一般我们就不否定H0;但μ0=800这种,估计点离中心就偏的有点远了,对应概率相应的就会比较大,搞不好能达到99.5%,大多数时候我们会否定H0,也就是说,你得赶上了0.5%的概率才能从一堆均重900的苹果里抽出这么一堆,基本就是被忽悠了。

好了,基础知识到此完毕。但为了接下来的讲述,我们还要从这些基础知识中认识到两点:

1.对样本取平均只是变换的一种,有的变换还会涉及到加法,取对数等等。

2.假设检验用的分布可以是正态分布,但也可能是其他分布,比如Τ分布,Γ分布,χ2分布等等,这跟具体的问题有关,比如上面的苹果问题,如果你只抽了10个苹果,那求平均后用的分布模型就要换成Γ分布了。不同的分布,其参数也有所不同。在正态分布中,决定分布形状的参数是μ和σ,T分布也是χ2分布则是自由度ν,而在假设检验中,概率(专业术语叫p-value)就是概率密度函数的定积分,所谓查表,只不过是把(决定分布形状的参数+部分横轴点)→(定积分值)做了个映射表出来(正态分布的z分数已经蕴含了μ和σ,所以表中只给了z分数值)。


2.费舍尔方法(Fisher's method)


费舍尔方法同中心极限定理一样,也是一种分布经某运算变换到另一种分布的规律,不过这里的原始分布不再是随意的,而必须是相互独立的随机分布,而变换后的分布为卡方分布,公式如下:


用语言叙述为,从相互独立的的随机分布里抽k个样,分别取对数乘-2再加和,得到的新随机变量服从自由度为2k的卡方分布。

以用费舍尔方法做的二元文本分类器为例,在判断一篇文章是否为好文章时,我们通过训练拥有了一个“词语好度库”,这个好度库的大小是训练过程中出现过得所有词语的数量,一个词出现在越多的“好文章”里,它的“好度”就越高,但不会超过1,每个词的好度就是一个pi,全部的pi构成了”词语好度库“这个随机变量的样本观测值(或者说,反映了它的分布状况),因为我们假设了朴素分类器中词语之间是相互独立的,显然这个”词语好度库“满足相互独立的随机分布。

然而,如果待分类的文章是一篇”好文章“,分词后我们显然会得到一个大小为k的样本集合(假设有k个词),这个集合也许是从”词语好度库“里随机抽取k次抽出来的,但它的构成(绝大部分元素都是词语好度库中”好度“高的词)不仅让我们生疑,在鱼龙混杂的”词语好度库“里一次抽出这么多好词,它是不是更可能来自另外一种分布:一种”好词“被抽到的概率比较大的(虽然不知道分布图长什么样)的分布?或者说,假设H0:这k个词是从“词语好度库”里随机抽取的;假设H1:这k个词是从一个什么别的玩意(好词集中营?)随机抽取的。

于是, 这就变成了一个假设检验问题,我们求出,然后去卡方分布表里查表,注意卡方分布的自由度是2k


  def fisherprob(self,item,cat):
# 将所有概率值相乘
p=1
features=self.getfeatures(item)
for f in features:
p*=(self.weightedprob(f,cat,self.cprob))

# 取自然对数,并乘以-2
fscore=-2*math.log(p)

# 利用倒置对数卡方函数求得概率
return self.invchi2(fscore,len(features)*2)



这样,书里的invchi2函数功能便不言而喻:它实际就是(1-卡方分布的累加分布函数)(matlab中的chi2inv(P, V)功能与之相同,虽然算的不是一个量),通过一些计算(说实话我没看懂,这应该涉及到卡方分布的概率密度函数积分方法)完成了比较精细的“查表”,不信你传参invchi2(13.442, 10),返回值肯定是0.2(相当全面的卡方分布表-df(1-1000)),你在matlab中计算chi2inv(1-0.2, 10),返回值就是13.442。

也就是说,费舍尔方法给出的文章分类概率,实际上是假设检验里p-value这种东西,跟朴素贝叶斯原理还是有点差别的。


0 0