gpt4 book ai didi

python - 在 python scipy 中实现 Kolmogorov Smirnov 测试

转载 作者:IT老高 更新时间:2023-10-28 20:21:06 27 4
gpt4 key购买 nike

我有一个关于 N 个数字的数据集,我想测试它的正态性。我知道 scipy.stats 有一个 kstest function但是没有关于如何使用它以及如何解释结果的示例。有哪位熟悉的可以给我一些建议吗?

根据文档,使用 kstest 返回两个数字,KS 检验统计量 D 和 p 值。如果 p 值大于显着性水平(例如 5%),那么我们不能拒绝数据来自给定分布的假设。

当我通过从正态分布中抽取 10000 个样本并测试高斯性进行测试时:

import numpy as np
from scipy.stats import kstest

mu,sigma = 0.07, 0.89
kstest(np.random.normal(mu,sigma,10000),'norm')

我得到以下输出:

(0.04957880905196102, 8.9249710700788814e-22)

p 值小于 5%,这意味着我们可以拒绝数据呈正态分布的假设。但是样本是从正态分布中抽取的!

有人可以理解并向我解释这里的差异吗?

(正态性测试是否假设 mu = 0 和 sigma = 1?如果是,我如何测试我的数据是高斯分布但具有不同的 mu 和 sigma?)

最佳答案

您的数据是使用 mu=0.07 和 sigma=0.89 生成的。您正在根据平均值为 0 且标准差为 1 的正态分布测试此数据。

原假设 (H0) 是您的数据作为样本的分布等于标准正态分布,均值为 0,标准差为 1。

较小的 p 值表示与 D 一样大的检验统计量预期具有概率 p 值。

换句话说,(p 值约为 8.9e-22)H0 是真的不太可能。

这是合理的,因为均值和标准偏差不匹配。

将您的结果与:

In [22]: import numpy as np
In [23]: import scipy.stats as stats
In [24]: stats.kstest(np.random.normal(0,1,10000),'norm')
Out[24]: (0.007038739782416259, 0.70477679457831155)

要测试您的数据是否为高斯分布,您可以对其进行移位和重新缩放,使其正常,均值为 0,标准偏差为 1:

data=np.random.normal(mu,sigma,10000)
normed_data=(data-mu)/sigma
print(stats.kstest(normed_data,'norm'))
# (0.0085805670733036798, 0.45316245879609179)

警告: (many thanks to user333700 (aka scipy developer Josef Perktold )) 如果你不知道 musigma,估计参数使 p 值无效:

import numpy as np
import scipy.stats as stats

mu = 0.3
sigma = 5

num_tests = 10**5
num_rejects = 0
alpha = 0.05
for i in xrange(num_tests):
data = np.random.normal(mu, sigma, 10000)
# normed_data = (data - mu) / sigma # this is okay
# 4915/100000 = 0.05 rejects at rejection level 0.05 (as expected)
normed_data = (data - data.mean()) / data.std() # this is NOT okay
# 20/100000 = 0.00 rejects at rejection level 0.05 (not expected)
D, pval = stats.kstest(normed_data, 'norm')
if pval < alpha:
num_rejects += 1
ratio = float(num_rejects) / num_tests
print('{}/{} = {:.2f} rejects at rejection level {}'.format(
num_rejects, num_tests, ratio, alpha))

打印

20/100000 = 0.00 rejects at rejection level 0.05 (not expected)

这表明 stats.kstest 可能不会拒绝预期数量的空假设如果使用样本的均值和标准差对样本进行归一化

normed_data = (data - data.mean()) / data.std()    # this is NOT okay

关于python - 在 python scipy 中实现 Kolmogorov Smirnov 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com