在上一篇文章中,我们提到,用费舍尔方法做文本分类,实际上是进行一个假设检验的过程。有一种与费舍尔方法密切相关的方法,称为逆高斯法(inverse normal method),也称Stouffer's Z-score method,因为这种方法可以引入权重信息,所以带权重的版本又称作"weighted Z-test"。它与费舍尔方法的区别在于,费舍尔使用的是p-value,而逆高斯法使用的是z分数。
依旧以文本分类器为例,如采用逆高斯法,分类概率计算如下:
假设待分类的文本词数为k,其中Zi为,这里面的Φ,Φ^-1分别为标准正态分布累计函数和其逆函数。
红线即为Φ,把横,竖坐标轴换一下就是Φ^-1
想到上篇文章总结的规律:某分布经变换后满足另一分布,做假设检验,在费舍尔方法里,这个变换后的分布是χ^2(2k)分布,变换方法是样本值取对数乘-2最后加和;在逆高斯法里,变换后的分布式标准正态分布,变换方法则如所展示的,为原始1-p值经逆正态函数处理后的加权和除以一个缩放系数。当不设置权重时,wi为1,则缩放系数等于√k。
这种方法的优点在于它对权重的引入,费舍尔方法虽然看上去也能引入权重,但加入权重后便不满足χ^2(2k)分布,而是更复杂的情况,所以一般不会去这么做。
另一方面,即便不引入权重,逆高斯法的性能也与费舍尔方法差不多,原因可由z and −log(p)的关系图看出:
在常见的z=1~5范围内,两者基本呈线性关系。
'''
基于《集体智慧编程》第六章示例程序,将以下函数添加到class fishermethod中
需在开头from math import sqrt
from scipy.stats import norm
'''
def zscoreprob(self, features, cat):
zlist = []
for f in features:
p = 1-self.weightedprob(f, cat, self.cprob)
z = norm.ppf(p)
zlist.append(z)
sumz = sum(zlist)/sqrt(len(features))
return 1-norm.cdf(sumz)