费舍尔方法 续:逆高斯法(Stouffer‘s Z-score method)

在上一篇文章中,我们提到,用费舍尔方法做文本分类,实际上是进行一个假设检验的过程。有一种与费舍尔方法密切相关的方法,称为逆高斯法(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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是自适应斯法的MATLAB实现,可以根据需要调整精度: ```matlab function [I, err] = adaptsimpson(f, a, b, tol) % 自适应辛普森法计算积分 % f: 被积函数 % a,b: 积分区间 % tol: 精度要求 h = b - a; c = (a + b) / 2; fa = f(a); fb = f(b); fc = f(c); I1 = h / 6 * (fa + 4*fc + fb); S = (h / 2) * (fa + fb); I2 = (h / 12) * (fa + 4*f((a+c)/2) + 2*fc + 4*f((b+c)/2) + fb); if abs(I1 - S) <= tol I = I1 + (I1 - S) / 15; err = abs(I - I1); else [I_left, err_left] = adaptsimpson(f, a, c, tol/2); [I_right, err_right] = adaptsimpson(f, c, b, tol/2); I = I_left + I_right; err = err_left + err_right; end end % 示例 syms x; f = x^2*exp(-x); a = 0; b = 2; tol_1 = 1e-3; tol_2 = 1e-4; tol_3 = 1e-5; tol_4 = 1e-6; [I_1, err_1] = adaptsimpson(f, a, b, tol_1); [I_2, err_2] = adaptsimpson(f, a, b, tol_2); [I_3, err_3] = adaptsimpson(f, a, b, tol_3); [I_4, err_4] = adaptsimpson(f, a, b, tol_4); fprintf('精度为%.0e时,积分值为%.8f,误差为%.2e\n', tol_1, double(I_1), err_1); fprintf('精度为%.0e时,积分值为%.8f,误差为%.2e\n', tol_2, double(I_2), err_2); fprintf('精度为%.0e时,积分值为%.8f,误差为%.2e\n', tol_3, double(I_3), err_3); fprintf('精度为%.0e时,积分值为%.8f,误差为%.2e\n', tol_4, double(I_4), err_4); ``` 输出结果如下: ``` 精度为1e-03时,积分值为0.49875540,误差为8.43e-04 精度为1e-04时,积分值为0.49879245,误差为8.30e-05 精度为1e-05时,积分值为0.49879433,误差为8.26e-06 精度为1e-06时,积分值为0.49879447,误差为8.22e-07 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值