You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python均匀分布卡方检验结果异常及输出格式调整问题

问题解答

1 相同代码卡方检验统计量结果变化的原因

可能的原因有三类:

  • 交互式环境变量污染:如果使用Jupyter这类交互式编辑器运行代码,若单独重复执行过随机数生成的代码块,会修改全局种子变量i的取值,后续生成的随机序列会完全改变,卡方检验结果自然不同。你用的固定种子LCG生成器仅在完整从头运行全量代码时,才会输出完全一致的随机序列。
  • 代码逻辑误差:你初始化list1时已放入初始种子i,后续循环n次追加新值,最终list1的长度为n+1,但你计算期望频数f_exp时用的是n/bins1,观测频数总和与期望频数总和不一致,scipy的chisquare函数会自动重缩放期望频数,不同版本scipy的缩放逻辑差异可能导致结果变化。同时你做直方图统计时用的是完整的list1,但绘图时只取了前n个值,两者不匹配也会带来统计误差。
  • 运行环境差异:不同版本的Numpy对无符号整数溢出的处理逻辑、不同版本Scipy的卡方检验实现、不同操作系统的数值计算精度差异,都可能导致最终结果出现小幅波动。

如果要提高结果可复现性,可以把随机数生成逻辑封装为函数,避免全局变量污染,同时修正样本长度问题:

def generate_lcg(seed, sample_count):
    i = np.uintc(seed)
    samples = []
    for _ in range(sample_count):
        i = np.uintc(i * 663608941)
        samples.append(i)
    return np.divide(samples, (2**32) - 1)

调用时直接传入种子和需要的样本量即可,不会出现样本长度多1的问题。

2 单独打印统计量和p值的方法

scipy.stats.chisquare返回的Power_divergenceResult是支持属性访问的类元组对象,直接调用对应属性即可单独打印,将你的打印代码修改为以下形式即可得到整洁输出:

print("卡方统计量:%.4f" % chisquareval.statistic)
print("p值:%.4f" % chisquareval.pvalue)

你也可以根据需要调整格式字符串,修改数值保留的小数位数。

内容的提问来源于stack exchange,提问作者J.Snowden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 08:48:01