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

如何在Python中实现双样本K-S检验并验证高斯拟合合理性?

双样本K-S检验的实现错误分析与修正

核心错误点

  • 输入数据错误:ks_2samp要求传入原始样本数据,而非手动计算的CDF数组。你当前传入的是分箱后的累积分布,这会丢失原始数据的分布细节,直接导致检验结果失真。
  • 检验类型误用:你的需求是验证观测数据是否符合高斯分布,这属于单样本拟合优度检验范畴,而非双样本检验。双样本K-S检验用于对比两个独立样本的分布是否一致,但你使用的y_fit是随时间变化的拟合曲线值,并非从高斯分布中抽取的样本,不能用来做双样本对比。
  • 临界值与判断逻辑错误:手动计算的临界值是单样本K-S检验的近似值,且你同时用p值和临界值判断的逻辑冗余。scipy返回的p值已经可以直接用于显著性判断,无需手动计算临界值。

正确实现方案

要验证观测数据是否符合高斯分布,正确步骤是:

  1. 从观测数据中拟合出高斯分布的核心参数(均值、标准差);
  2. 使用单样本K-S检验(scipy.stats.kstest)对比观测数据与理论高斯分布。

修正后的代码:

from scipy.stats import kstest, norm
import numpy as np

y_observed = [
    1.93291, 9.84869, 29.5713, 20.6346, -1.51537,
    0.396292, 50.8895, 68.855, 63.9291, 55.6863,
    37.6503, 46.87, 33.6637, 25.0395,18.3027,
    38.0947, 27.9305, 10.2012, -0.704519, 18.6656,
    20.2873, 8.78955, 4.39672
]

# 拟合观测数据的高斯分布参数
mu = np.mean(y_observed)
sigma = np.std(y_observed)

# 单样本K-S检验:对比观测数据与理论高斯分布
ks_stat, p_val = kstest(y_observed, 'norm', args=(mu, sigma))

# 显著性判断(α=0.05)
if p_val < 0.05:
    print("观测数据不符合高斯分布")
else:
    print("观测数据符合高斯分布")

逻辑解读修正

  • 单样本K-S检验的原假设是观测数据服从指定的理论分布;
  • 当p值小于显著性水平(通常取0.05)时,拒绝原假设,认为数据不符合该分布;反之则无法拒绝原假设(注意:不是“肯定符合”,而是“没有足够证据证明不符合”)。

补充说明

如果你的y_fit是通过时间序列拟合得到的高斯型曲线(比如钟形曲线),那么你真正的需求可能是验证残差(y_observed - y_fit)是否符合高斯分布(用于评估拟合模型的合理性),此时同样用单样本K-S检验验证残差的分布:

# 计算残差
residuals = np.array(y_observed) - np.array(y_fit)
# 检验残差是否服从高斯分布(均值为0,标准差为残差的标准差)
ks_stat_resid, p_val_resid = kstest(residuals, 'norm', args=(np.mean(residuals), np.std(residuals)))

if p_val_resid < 0.05:
    print("拟合残差不符合高斯分布,模型拟合效果不佳")
else:
    print("拟合残差符合高斯分布,模型拟合合理")

内容的提问来源于stack exchange,提问作者Misterrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:50:27