Suponiendo que es fijo (como lo hacen las dos conferencias vinculadas), sus elecciones algorítmicas determinarán si su cálculo toma tiempo de ejecución O ( n d + k n ) u tiempo de ejecución O ( n d k ) .kO(nd+kn)O(ndk)
Primero, consideremos un algoritmo de tiempo de ejecución :O(nd+kn)
- Inicialice para todas las observaciones i en el conjunto de entrenamientoselectedi=0i
- Para cada observación del conjunto de entrenamiento , calcule d i s t i , la distancia desde la nueva observación hasta la observación del conjunto de entrenamiento iidistii
- Para a k : recorrer todas las observaciones del conjunto de entrenamiento, seleccionando el índice i con el valor d i s t i más pequeño y para el cual s e l e c t e d i = 0 . Seleccione esta observación configurando s e l e c t e d i = 1 .j=1kidistiselectedi=0selectedi=1
- Devuelve los índices seleccionadosk
Cada cálculo de distancia requiere tiempo de ejecución , por lo que el segundo paso requiere tiempo de ejecución O ( n d ) . Para cada iteración en el tercer paso, realizamos el trabajo O ( n ) recorriendo las observaciones del conjunto de entrenamiento, por lo que el paso general requiere el trabajo O ( n k ) . Los pasos primero y cuarto solo requieren trabajo O ( n ) , por lo que obtenemos un tiempo de ejecución O ( n d + k n ) .O(d)O(nd)O(n)O(nk)O(n)O(nd+kn)
Ahora, consideremos un algoritmo de tiempo de ejecución :O(ndk)
- Inicialice para todas las observaciones i en el conjunto de entrenamientoselectedi=0i
- Para a k : recorra todas las observaciones del conjunto de entrenamiento y calcule la distancia d entre la observación del conjunto de entrenamiento seleccionado y la nueva observación. Seleccione el índice i con el valor d más pequeño para el cual s e l e c t e d i = 0 . Seleccione esta observación configurando s e l e c t e d i = 1 .j=1kdidselectedi=0selectedi=1
- Devuelve los índices seleccionadosk
Para cada iteración en el segundo paso, calculamos la distancia entre la nueva observación y cada observación del conjunto de entrenamiento, lo que requiere trabajar para una iteración y, por lo tanto, O ( n d k ) trabajar en general.O(nd)O(ndk)
La diferencia entre los dos algoritmos es que el primero calcula previamente y almacena las distancias (que requieren memoria adicional), mientras que el segundo no. Sin embargo, dado que ya almacenamos todo el conjunto de entrenamiento, que requiere memoria O ( n d ) , así como el vector s e l e c t e d , que requiere almacenamiento O ( n ) , el almacenamiento de los dos algoritmos es asintóticamente el mismo. Como resultado, el mejor tiempo de ejecución asintótico para k > 1 hace que el primer algoritmo sea más atractivo.O(n)O(nd)selectedO(n)k>1
Vale la pena señalar que es posible obtener un tiempo de ejecución utilizando una mejora algorítmica:O(nd)
- Para cada observación del conjunto de entrenamiento , calcule d i s t i , la distancia desde la nueva observación hasta la observación del conjunto de entrenamiento iidistii
- Ejecute el algoritmo de selección rápida para calcular la distancia más pequeña en tiempo de ejecución O ( n )kthO(n)
- Devuelve todos los índices no mayores que la distancia calculada más pequeñakth
Este enfoque aprovecha el hecho de que existen enfoques eficientes para encontrar el valor más pequeño de en una matriz sin clasificar.kth
quickselect
.