📜  Kolmogorov-Smirnov 检验(KS 检验)

📅  最后修改于: 2022-05-13 01:54:55.205000             🧑  作者: Mango

Kolmogorov-Smirnov 检验(KS 检验)

Kolmogorov-Smirnov 测试是一种非常有效的方法来确定两个样本是否彼此显着不同。它通常用于检查随机数的一致性。均匀性是任何随机数生成器最重要的属性之一,可以使用 Kolmogorov-Smirnov 检验对其进行测试。

Kolmogorov-Smirnov 检验也可用于检验两个潜在的一维概率分布是否不同。这是确定两个样本是否彼此显着不同的一种非常有效的方法。

Kolmogorov-Smirnov 统计量量化了样本的经验分布函数与参考分布的累积分布函数之间或两个样本的经验分布函数之间的距离。

为了使用测试来检查随机数的均匀性,我们使用 U[0, 1] 的 CDF(累积分布函数)。

F(x)= x for 0<=x<=1

Empirical CDF, Sn(x)= (number of R1, R2…Rn < x)/N array of random numbers ,随机数必须在 [0, 1] 的范围内。

使用的假设——

H0(零假设):零假设假设数字均匀分布在 0-1 之间。如果我们能够拒绝零假设,这意味着数字在 0-1 之间不是均匀分布的。未能拒绝零假设虽然并不一定意味着数字服从均匀分布。

算法:

-> Rank the N random numbers in ascending order.
-> Calculate D+ as max(i/N-Ri) for all i in(1, N)
-> Calculate D- as max(Ri-((i-1)/N)) for all i in(1, N)
-> Calculate D as max(sqrt(N) * D+, sqrt(N) * D-)
-> If D>D(alpha) 
    Rejects Uniformity
   else
    It fails to reject the Null Hypothesis.

以下是上述算法的Python实现:

import random
  
N = int(input("Enter the size of random numbers to be produced : "))
D_plus =[]
D_minus =[]
_random =[]
  
# Rank the N random numbers
for i in range(0, N):
    _random.append(random.random())
    _random.sort()
  
# Calculate max(i/N-Ri)
for i in range(1, N + 1):
    x = i / N - _random[i-1]
    D_plus.append(x)
  
# Calculate max(Ri-((i-1)/N))
for i in range(1, N + 1):
    y =(i-1)/N
    y =_random[i-1]-y
    D_minus.append(y)
  
# Calculate max(D+, D-)
ans = max(sqrt(N) * D_plus, sqrt(N) * D_minus)
print("Value of D is :")
print(ans)

参考 - https://dl.acm.org/doi/pdf/10.1145/355719.355724