Prueba de Kolmogorov-Smirnov (prueba KS)

La prueba de Kolmogorov-Smirnov es una forma muy eficiente de determinar si dos muestras son significativamente diferentes entre sí. Por lo general, se usa para verificar la uniformidad de los números aleatorios. La uniformidad es una de las propiedades más importantes de cualquier generador de números aleatorios y se puede usar la prueba de Kolmogorov-Smirnov para probarla.

La prueba de Kolmogorov-Smirnov también se puede usar para probar si dos distribuciones de probabilidad unidimensionales subyacentes difieren. Es una forma muy eficiente de determinar si dos muestras son significativamente diferentes entre sí.

El estadístico de Kolmogorov-Smirnov cuantifica una distancia entre la función de distribución empírica de la muestra y la función de distribución acumulada de la distribución de referencia, o entre las funciones de distribución empírica de dos muestras.

Para usar la prueba para verificar la uniformidad de los números aleatorios, usamos la CDF (función de distribución acumulativa) de U[0, 1].

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

CDF empírica, Sn(x)= (number of R1, R2…Rn < x)/N array of random numbers, los números aleatorios deben estar en el rango de [0, 1].

Hipótesis utilizada –

H0 (hipótesis nula): la hipótesis nula supone que los números se distribuyen uniformemente entre 0-1. Si podemos rechazar la Hipótesis Nula, esto significa que los números no están distribuidos uniformemente entre 0-1. No rechazar la hipótesis nula aunque no significa necesariamente que los números sigan la distribución uniforme.

Algoritmo:

-> 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.

A continuación se muestra la implementación de Python del algoritmo anterior:

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)

Referencia: https://dl.acm.org/doi/pdf/10.1145/355719.355724

Publicación traducida automáticamente

Artículo escrito por AsthaMehta y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *