Python卡方分布P值拟合求助:匹配目标图像输出效果
问题分析与代码调整
你的代码生成的是**归一化卡方分布(χ²/ndof)**的经验累积分布补值(即P值:P(X ≥ x)),要匹配目标图像的拟合效果,可从以下几点调整:
- 手动实现的卡方分布效率低且精度不如numpy原生函数
- 原P值计算的索引逻辑存在细微偏差,需修正以匹配经验分布的统计定义
- 若目标图像是未归一化的卡方分布(直接输出χ²值而非χ²/ndof),需去掉归一化步骤
优化后的代码
import numpy as np ndof = 2 nstat = 100000 # 用numpy原生函数生成卡方分布样本,高效且准确 # 若目标是归一化分布,保留/ndof;否则直接用chisquare输出 A = np.random.chisquare(ndof, nstat) # 未归一化的卡方值 # A = np.random.chisquare(ndof, nstat) / ndof # 归一化版本 # 排序后计算精准的经验P值:P(X ≥ x) = 1 - 累积样本占比 A_sorted = np.sort(A) p_values = 1 - np.arange(1, nstat + 1) / nstat # 输出结果(可按需调整输出范围) for x, p in zip(A_sorted, p_values): print(x, p)
关键调整说明
- 替换手动实现的
chisq函数为np.random.chisquare:这是numpy优化后的原生实现,生成的分布更贴合理论卡方分布,运行速度也远快于循环生成高斯值再平方求和 - 修正P值计算逻辑:原代码
1-i/nstat会导致最后一个样本的P值为1/(nstat),但更准确的经验P值应为1 - (i+1)/nstat(对应第i+1个排序样本,有nstat - i个样本大于等于它,占比为(nstat - i)/nstat),用np.arange(1, nstat+1)/nstat可直接生成正确的累积占比 - 灵活选择归一化:根据目标图像的横轴类型,决定是否保留
/ndof的归一化操作
内容的提问来源于stack exchange,提问作者Marko Komljenovic
相关产品推荐
相关产品推荐

